遇到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条回答
aozima
1楼-- · 2019-12-11 23:35
istars2005 发表于 2019-6-19 17:36
请教怎么实现自动编译两次呢?
也遇到这个问题过
都是分两次编译

工程文件都一样的,就链接脚本里面地址不同而已。
写个脚本之类的来做呗,全自动才能不出错。
错后 得到 a.bin b.bin
再像上面网面说的合并成一个。

但你上传到云端时,可能也可以打成一个,还要对bin做一下校验,防止损坏。
因为现在各个云都是只让上传一个文件,没见过2个的。

反正,AB就是坑。
丢丢时光机
2楼-- · 2019-12-12 04:45
落叶知秋 发表于 2019-6-19 18:00
楼主不应该在bootloader运行的时候把中断向量表复制到RAM

应该在APP运行的时候把Flash里面的中断向量表复 ...

效果是一样的啊。因为boot里面已经读取了分区信息,想着直接用了得了,不想再app里面再判断这些玩意。
丢丢时光机
3楼-- · 2019-12-12 05:49
 精彩回答 2  元偷偷看……
落叶知秋
4楼-- · 2019-12-12 08:47
丢丢时光机 发表于 2019-6-19 18:13
boot及app的ram起始1K的空间,单独存放向量表的。boot里操作跟app里操作,效果应该是一样的。 ...

没考虑过boot跳转到APP执行时,APP的初始化流程会复位RAM?
落叶知秋
5楼-- · 2019-12-12 11:13
丢丢时光机 发表于 2019-6-19 18:13
boot及app的ram起始1K的空间,单独存放向量表的。boot里操作跟app里操作,效果应该是一样的。 ...

如果你APP里面没改过.s汇编文件的话,一般都会在运行到main之前把RAM初始化为0的
丢丢时光机
6楼-- · 2019-12-12 13:27
落叶知秋 发表于 2019-6-19 18:24
如果你APP里面没改过.s汇编文件的话,一般都会在运行到main之前把RAM初始化为0的 ...

这个有测试,RAM没有被清空; ld文件里面改了RAM的起始地址。

微信截图_20190619183118.png (19.89 KB, 下载次数: 0)

下载附件

2019-6-19 18:31 上传

一周热门 更多>