遇到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条回答
retention
1楼-- · 2019-12-16 04:01
向量表是个要注意的地方,前几天帮我客户处理过类似的问题,在仿真看到存放向量表数据是偏移之后的数据
Ary
2楼-- · 2019-12-16 07:39
 精彩回答 2  元偷偷看……
kebaojun305
3楼-- · 2019-12-16 10:17
本帖最后由 kebaojun305 于 2019-6-21 08:50 编辑
丢丢时光机 发表于 2019-6-20 13:17
我的主要问题是,生成一个固件,无论放在APP1的位置,还是APP2位置,boot都能跳转过去正确执行。 ...


你这个 前提确实错了 除非你能修改app1  或者app2得内部所有得地址。   这个功能 最简单的就是编译2个起始地址不同的app ,可以实现,你想编译一个app  在2个不同flash地址中运行,是不可能的。
istars2005
4楼-- · 2019-12-16 11:36
丢丢时光机 发表于 2019-6-20 13:17
我的主要问题是,生成一个固件,无论放在APP1的位置,还是APP2位置,boot都能跳转过去正确执行。 ...

你这个要求有点复杂吧,我一直是生成两个固件,然后合并在一起,然后根据当前运行的固件开判断从哪部分截取合并的固件
罗小蘑菇
5楼-- · 2019-12-16 13:01
AB来回切换想想很好,其实就会碰到楼主的问题,就是能实现也会遇到编译同一个文件的问题,想实现回退版本功能,不如分成四个区,BOOT引导区,APP区,代码备份区1,代码备份区2,升级后由BOOT实现把备份区的代码复制到APP区运行,备份区1和2交替存放最新升级文件。
ddddd120
6楼-- · 2019-12-16 18:56
丢丢时光机 发表于 2019-6-20 13:17
我的主要问题是,生成一个固件,无论放在APP1的位置,还是APP2位置,boot都能跳转过去正确执行。 ...

感觉应该是编译出来2个app固件,编译的时候要在不同的基地址上编译,要不里面的跳转,函数定位都不一样的地址,然后合并到到一起,boot跳转到哪个都行

一周热门 更多>