IAP就是在线升级程序,有一个前提,就是程序分为两部分,从bootloader启动,跳转到APP部分。
分三步:
1.APP从串口或者网络接收升级的bin文件,然后先放在一个地方。这个地方可以是flash某个位置,也可以是norflash。
2.完成后,校验一下整段程序CRC看是否正确。若正确则重启。
3.bootloader把这个bin文件复制到APP的位置上,覆盖原先的APP,跳转到APP位置上。
U盘升级功能就类似这种:
1.bootloader检测到U盘连接,然后查找U盘中有bin文件。若有则进行第二步,若没有则直接跳转到APP。
2.可以是触屏选择要升级的bin,也可以是默认升级某文件名的bin。校验正确后,放入到除APP外的某处flash或norflash中。
3.第二步成功后,再把该处bin覆盖到APP处,并跳转到APP处。
那么需要注意什么呢?
1.bootloader的配置,分配给bootloader 0x4000大小
2.APP程序的配置,接着bootloader的位置,分配给0xE000大小
3.修改APP的中断向量表偏移量
再复杂一点,如果是要给从设备进行升级,那么思路是一样的。先把从设备的升级bin放在主设备的一个地方,然后再分次传输给从设备,而从设备也要先放在一个地方,再用从设备的bootloader去具体升级了。
结语:
IAP看起来很简单,但是落实到细节处并不简单。由于涉及到程序升级,如果覆盖APP的是错误的代码,那么设备就废了,这就是重大事故了。所以对IAP过程的安全把控是非常严的。
难点在于流程需要严丝合缝,主板如何分辨是给自己升级的程序还是从设备升级的程序?FLASH如何划分?中间断了怎么办?CRC校验失败怎么办?bootloader跳转后程序卡死怎么办?
采用USB驱动的过程流处理方式处理从设备IAP升级,在每个过程结束后都保存处理结果至铁电中,因此,掉电、升级过程中断、设备重启后都能断点续传。
因为是项目使用,故不分享具体代码,请谅解,但仍然欢迎讨论。