| 帮同学宣传一下http://shop57644665.taobao.com/ |
作为一个平台的系统工程师,首先就是必须要熟悉自己所做的平台。对于编译器,链接器,程序执行的原理要有一定的了解。对于平台的MCU,系统的boot流程要熟悉,当然汇编代码一定要基本能读懂。
个人觉得FOTA最主要的核心就是FOTA程序的独立性,也就是说该部分程序要完全独立于其他部分。
如何检查FOTA部分代码没有调用到其他部分的代码呢?我们的编译和链接器所生成的符号表文件中就有这些信息。
在TI系统所生成的MAP符号表文件中,跨段调用的形式如下
06007830 00000010 (.T$0000)
FAR CALL TRAMPOLINES
callee addr tramp addr call addr call info
——– ——– ——– ——– ——— —————-
IND$CALL 08019fac .T$0000 06007830 06001b1a bootloader.lib : dm_drv.obj (.text)
通过查找对应的地址就能找到对应的函数。
注:在TI的编译和链接器是通过一个IND$CALL函数来“曲线”实现长跳转的,IND$CALL的实现是在编译和链接器中实现的。
MTK平台的ADS编译器是如下形式
$Ven$AT$L$$_fp_display 0×400049b8 ARM Code 0 anon$$obj.o(Veneer$$Code)
在你的FOTA部分应该只有一个类似的跳转,那就是从FOTA部分跳转到系统正常执行的入口函数。
FOTA程序注意不要使用实时运行库函数(RTS),也就是诸如memcpy的C库函数。另外要注意除法也是RTS函数。
FOTA需要的UART,LCD,FLASH驱动的实现难度不算很大,但是因为不能使用已存在的要被更新部分的函数,所以工作量还是有一点的。FLASH驱动需要放到RAM中执行,LCD在显示图片时最好直接将图片转换成LCD能够直接显示的格式然后送到LCD的buffer中就可以了。
因为FOTA的测试标准对升级时间也有要求,代码稳定调试完毕后可以考虑注释掉TRACE函数以缩短时间。
















