1.stm32在做OTA升级时,需要上报当前运行的切区,网关将另一切区的固件下发。
2.网关保存的两份固件是由同一份代码编译而来,唯一不同的是Scatter File文件中的装载地址不同。
3.下面解释生成的固件必须放在Flash中与装载地址相同的位置:
3.1 固件运行时,会首先进入startup,之后会跳转到 _main_;
3.2 注意 _main_ 并非main函数,而是MDK内置的宏,跳转时会先执行__scatterload(),__rt_entry():
__scatterload():负责把RW/RO输出段从装载域地址复制到运行域地址,并完成了ZI运行域的初始化工作。
__rt_entry():负责初始化堆栈,完成库函数的初始化,最后自动跳转向main()函数。【1】
3.3__scatterload()装载所用地址正是由Scatter File设置的装载地址决定。这些信息都保持在bin文件中。
4.以上,解释了stm32 OTA升级需要上报当前运行切区的原因,主要是MDK所限。假如能够做到装载地址可以由引导程序设定,应该可以解决需要上报运行切区的限制。NXP的JN5169就实现了此功能。
注: