裸奔的话给你一个自简单的参考结构,只要任何位置 switchapp(xxx); 都可以相对可靠的切换。
void *( CurrentApp )(void) =
void main( )
{
...
while(1)
{
CurrentApp ()
}
}
void switchapp( void *( NextApp ))
{
CurrentApp = NextApp
}
bool KeepRunning =true
void App1( )
{
while(KeepRunning)
{
.......
}
}
void App2( )
{
while(KeepRunning)
{
.......
}
}
我用C8051F020上实现的一个IAP来举例吧。升级程序的确放在指定位置,因为C8051F020有64K的ROM,所以升级程序就占用ROM最后的4K的空间,前面64K就用来存放用户程序。在每次单片机启动时,放在0000H位置的LJMP指令不是跳转到用户程序,而是直接跳转到了升级程序(60K开始的位置),这里升级程序初始化串口,等待串口发来的数据流,如果数据流的不正确或者没有收到数据流,就跳转回用户程序的入口执行用户上次下载进去的程序。所以在这里用户的程序不能超过60K,当然升级程序也不会“自宫”,就没什么影响了。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)