背景:
在开发STM32u575的过程中,需要用到boot进行程序升级
app使用的是tr-thread进行编写,在boot中多次尝试跳转到app所在位置运行,均失败
表现是:基于tr-thread的app主程序,在修改程序下载地址及向量表后,编译下载到板子中,板子竟然可以正常运行,但是并不是基于boot进行跳转的,而是从0x8000000地址开始运行的
经过排查发现,boot+普通程序(未基于rt-thread的程序),是可以正常跳转的
boot+基于rt-thread的程序,就不可以正常跳转
问题就出在APP端
一般APP程序只需要修改以下两处即可:
但是基于rt-thread的程序只修改这两处是不行的
经过阅读rt-thread官方文档发现,还需要在template.uvprojx工程中修改以下地址即可
通过以上修改,然后使用scons指令进行同步,编译下载APP工程发现,app程序已经不在0x8000000位置了,已经成功下到0x8010000
下载boot程序进行跳转,此时boot可以正常跳转到app程序所在位置
再提一嘴:
boot程序的实现
此处需要先关闭无关中断,然后进行栈顶地地址内容检查
为什么要关中断:
不关闭中断可能会导致Hardfault
为什么要检查地址内容合法:
首先栈顶指针指向的是MSP的初始值,这个初始值是程序占用RAM的大小
就是说RAM地址不能超过20040000,所以需要确保
if(((*( __IO uint32_t*)addr) & 0x2FFC0000) == 0x20000000)条件满足