我希望设计一个boot1、boot2、app。
boot2运行在ram,boot2可以升级boot2自身存储于flash内的镜像,同时可以升级app镜像。
正在验证部分细节,请教下各位。
我先做了基于裸机的实验(正点原子探索者F407串口IAP实验):
一个boot1的裸机工程,一个app的裸机工程。
Boot1执行将串口收到的app的镜像文件写入到ram内的特定起始地址处,然后跳转到ram去执行app程序。
我的疑问在上图红框内,boot工程使用的ram是位于0x20000000开始的一段区域吗,大小肯定是超过0x1000大小了, 但是0x20001000地址开始又存放了app镜像。
这样,boot和app对这块ram的使用不是冲突了吗, 怎么还能正常跑起来呢?
上图细节放大:
PS,修改魔术棒应该是使用的MDK的默认链接脚本,
找一下后缀为sct的链接脚本,打开app工程的链接脚本看一下:
这里的加载地址就等于执行地址, 也就是说,app需要boot运行起来,先把app镜像搬运到app工程内的链接脚本所指定的加载地址, 之后app就具备了正确的运行环境了。
对于如何把基于RTT工程的APP重定位到RAM运行,初步思路是,借鉴这个写法,加载地址和执行地址是ram上的同一个地址,但是前提是有一段前导程序(boot程序)把RTT的APP镜像先搬移到APP工程内指定的加载地址上。