|
Lpc2xxx远程可靠升级设想
虽然Lpc2xxx系列芯片以通过IAP方式重写内部FLASH实现在系统升级,但是在IAP的过程中都会遭遇升级过程中失败的问题困扰,一旦在写FLASH特别是第一个扇区的过程中系统发生异常(外部干扰死机或重启)都会造成系统瘫痪;这有下面的两种方式:
1 把升级的代码运行在外部ram,把系统的新代码从外部存储器写入芯片内的程序FLASH;
2 把升级的代码运行在特定位置的FLASH(如高端),类似于固化在芯片内的Flash boot 装载程序,用这个程序把系统的新代码从外部存储器写入芯片内的程序FLASH;
安全的方式是在芯片内固化boot,然后正式的功能代码由boot从外部存储器载入外扩的ram中运行,这种方式虽然可完美解决远程升级问题,但是系统的整体成本会增加,如外扩ram、为外扩ram增加PCB布线难度、必要时双层印制板不能满足要求等;一个没有外扩并口的单芯片系统是我的最爱!
借鉴上述思路在不外扩的ram的系统中实现可靠的远程升级设想如下:
1 下载一个boot程序到芯片,这个程序是常规的,系统上电后会通过芯片内的程序引导这个程序执行;在这个程序里可以实现的功能主要是把外部存储器内的代码装载到内部的应用程序空间;当然也可集成其他功能如系统自测试、下载代码到外部存储器等功能;甚至可以在具备网络的系统上自动登陆到远程服务器自动下载代码;boot程序有校验整个应用程序代码的功能。
2 应用程序代码的构建;由于应用程序代码是在0x0+B的位置开始执行的,所以在生成代码的时候要通过编译器把代码的开始点定制为 0x0+B,而芯片内ram从0x40000040开始分配。这些在ads里通过修改image entry point 和scatter 文件来实现;
3 应用程序装载到应用程序空间后,boot把应用程序的中断向量拷贝到ram底部,共64个字节,然后重新映射中断向量到芯片内部ram,这两个步骤也可以在应用程序的开始执行,总之不要在开中断后再做。由boot程序引导应用程序执行,此时应该关闭所有的中断并要注意arm的运行模式处于复位后的模式;
4 应用程序开始执行;
5 应用程序第一次下载也可以和boot程序一块下载到芯片,这样不用在boot程序里添加下载程序到外部存储器或直接下载到芯片的功能,不过从另一个方面说,通过自己的boot下载程序可以提高程序下载速度,如用网线或usb接口;
通过上述方式在实现远程升级时可先通过应用程序下载最新代码到外部存储器,然后设置升级标志reset芯片;芯片复位后执行boot,boot检测到升级标志就可以删除应用程序空间,然后重新加载最新的应用程序代码,清空升级标志,然后在执行应用程序代码,整个系统升级完成;如果在升级过程中出现异常,此时系统复位后boot通过校验程序代码是否正确,否则可以继续执行装载应用程序代码直到成功完成;通过在外部程序空间添加应用程序代码的备份可以提高升级可靠性;通过备份原来的代码可以实现代码roll back;
等等等等!