遇到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条回答
oooios
1楼-- · 2019-12-15 12:01
之前用1768,做ab区升级,最后发现,a b 的全局变量和函数要一样,不然,升级成功,也不能运行。最后放弃了使用一主一备。如果要a b都可以,需要用分散加载。
丢丢时光机
2楼-- · 2019-12-15 12:52
love_ourdev 发表于 2019-6-20 10:34
这算不算出尔反尔?当你之前说出链接到两个不同地址时,只是向量表不同的时候,我就很怀疑了。 ...

昨天只生成了两个2K的flash。自认为很小,人工对比了下。结果自己犯了个错误。。。还得工具对比。
丢丢时光机
3楼-- · 2019-12-15 18:27
 精彩回答 2  元偷偷看……
落叶知秋
4楼-- · 2019-12-15 20:58
丢丢时光机 发表于 2019-6-20 13:17
我的主要问题是,生成一个固件,无论放在APP1的位置,还是APP2位置,boot都能跳转过去正确执行。 ...

OJBK,讨论的前提出错了,后面白忙活
ljx289
5楼-- · 2019-12-15 21:37
在外面放个大的flash,boot的时候判断要不要升级就可以了。把boot做成出厂时的app固件,新版的app从网上自动下载,新版的app更新到另一个偏移量去
ljx289
6楼-- · 2019-12-16 00:01
也就是每次升级都把固件先保存在外置的flash,可以保存很多份app固件,升级完进去app后要判断该app估计是否正常运行,如果不能正常运行就要做标记。判断:我是我还是我是我的影子,哈哈

一周热门 更多>