使用CMSIS-RTOS有段时间了,产品功能已经基本完成,现在做升级功能,需要做Boot,但在做的过程中遇到了一些问题,耽搁了两天才搞定,因此有必要记录一下。
首先第一个问题是跳转函数的写法。
在程序怎么都无法跳转到APP执行的情况下,我重新建立了两个裸跑的工程,BOOT直接执行跳转,APP只执行灯闪烁,结果还是无法跳转。这里我参考一篇帖子做的跳转程序,跳转函数写法如下:
void (*apifun)(void);
apifun = (void (*)(void))(APPSTART + 4);
然后我尝试用正点原子的IAP代码例程里的跳转函数,结果跳转成功,跳转函数写法如下:
typedef void (*appl_func)(void); //定义一个函数类型的参数.
appl_func run_appl;
...
run_appl = (appl_func)*(vu32*)(APPSTART + 4);
解决跳转问题后,修改CMSIS-RTOS的跳转函数后再次测试,发现跳转后会进入HardFault。
尝试过网上说的关所有中断、删除任务(我一个任务都没新建)、重新设置中断向量表等等操作依然无果。
然后我找到一篇文章,写的是如果和RTX做Bootloader,文章链接如下: