我目前使用的是R5F100LG芯片,实现了boot + app + app升级区。
boot在 0x0 - 0x7FFF
app 在 0x8000-0x13FFF
app 升级区在 0x14000-0x1FFFF
第一阶段,我验证成功的流程是:
1. boot下载数据到APP区
2. boot 跳转到APP
3. APP跳转回boot
能正常实现boot到APP的互相跳转,并且在APP端的中断响应都是OK的(串口收发,定时器),也就是中断向量表的映射是OK的。
第二阶段,实际我的程序目标流程是: APP检测到升级,会将数据下载到APP升级区,并设置相应标识。 然后跳回到boot,boot会判断标识,将APP升级区的数据拷贝到APP区,再重新跳转到APP,实现升级。
暂时为了方便验证,我就先在boot实现这个流程。
1. boot将APP数据先下载到APP升级区
2. boot再将APP升级区的数据拷贝到APP区
3. boot跳转到APP
以上流程还是能正常跑通(也就是此时boot跳转APP是成功的,并且APP运行没有问题)。 但是这个时候,我让APP再跳转会boot就不行了, 并且我将机器断电后,重新上电,boot也无法执行。 就感觉boot区数据被改动了。
我一开始怀疑是flash地址溢出了,也就是我写APP升级区的时候(毕竟是擦除了flash的最后所有数据),程序弄错了,溢出后擦除了boot区,但是我查看了代码,并且打印了信息,确定只操作到了0x1FC00 -- 0x1FC7F。 也就是只操作了最后一块flash的前128字节数据。
后面我还是尝试了缩小APP来进行操作,如下分配
app 在 0x8000-0x13BFF
app 升级区在 0x14000-0x1FBFF
此时再进行跳转,就全都正常了。 所以目前还是怀疑是代码区的最后一块flash不能操作。 但是我文档里没看到相应的说明,虽然在片上调试里,貌似代码区最后512字节好像不能操作。 但是我这个普通运行时,也不行,就不太理解。麻烦请您这边解惑下,我怕还是我的程序问题。