帮同学宣传一下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函数以缩短时间。