遇到STM32 A,B区 app升级困难,各路大神,帮忙看一下。

2019-12-10 18:18发布

我正在做一个bootloader(boot+app1+app2)。

app1运行的时候,升级app2,校验合法后,然后重启直接运行APP2。
app2运行的时候,升级app1,校验合法后,然后重启直接运行APP1。。。。。。

目前的困难是,如何能够将APP1与APP2做成同一个固件?今天对比了下不同位置的固件,发现只有前480个字节的vector table不同。

今天做了些尝试,app的固件以地址0x8000000生成(RAM预留1k,以存放中断向量表)。
bootloader运行时,将vector table 整个复制到RAM的最前面(根据APP的不同地址,重新修正中断向量表,比如app2的运行地址是0x80005000,则将中断向量表统一加上0x5000);
但是发现这样子行不通,无法正常运行。是不是我哪里有缺漏的地方?

实在没办法的话,只能固件升级时,将中断向量表修改掉??
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
64条回答
丢丢时光机
1楼-- · 2019-12-12 17:35
坛友帮帮忙。这个问题解决了的话,我把这个A,B升级方案的工程分享到论坛给大家参考。
flash3g
2楼-- · 2019-12-12 19:00
 精彩回答 2  元偷偷看……
823032003
3楼-- · 2019-12-12 19:15
我觉得不止中断向量表,函数地址这些也要改,否则跳转的时候还是跳到编译器编译那个地址
823032003
4楼-- · 2019-12-12 21:01
lyz3432 发表于 2019-6-19 17:38
两次编译完,写个脚本merge到一起就好了啊

merge到一起怎么理解呢?
istars2005
5楼-- · 2019-12-12 22:12
aozima 发表于 2019-6-19 17:46
工程文件都一样的,就链接脚本里面地址不同而已。
写个脚本之类的来做呗,全自动才能不出错。
错后 得到  ...

通过修改工程的.sct文件可以实现
但是源文件中还需要执行NVIC_SetVectorTable
否则程序运行肯定会出错

这样写脚本就得把这部分考虑进去了
有什么好办法能解决这个问题吗?
istars2005
6楼-- · 2019-12-13 03:54
823032003 发表于 2019-6-19 19:08
merge到一起怎么理解呢?

就是把两次生成的a.bin和b.bin直接连接起来
因为两个文件字节数是完全相同的
升级时候程序判断自己是a还是b,然后自己从merge完的文件中找到需要升级的文件偏移就行了

一周热门 更多>