遇到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条回答
justdomyself
1楼-- · 2019-12-11 08:27
app2作为接收缓存区,升级时放在2区,重启后,boot把2考到1,再重启,运行1
丢丢时光机
2楼-- · 2019-12-11 14:15
justdomyself 发表于 2019-6-19 17:16
app2作为接收缓存区,升级时放在2区,重启后,boot把2考到1,再重启,运行1

若是作为缓存区接收的话,没法做版本回退了。
istars2005
3楼-- · 2019-12-11 14:46
aozima 发表于 2019-6-19 17:13
写个脚本,自动编译2次。

AB区麻烦,安全性并不比只有A区要好。

请教怎么实现自动编译两次呢?
也遇到这个问题过
都是分两次编译
生成两个bin文件
然后再把两个文件合并起来的
落叶知秋
4楼-- · 2019-12-11 15:02
我来为楼主翻译一下:
楼主其实就是想做一个旧APP备份的功能,然后想开辟APP1区域和APP2区域,轮流进行备份旧的代码程序;
但楼主又想着代码功能是一样的,只想使用同一个升级固件,然后MCU可以自己实现在APP1和APP2之间跳转;
目前楼主觉得是中断向量表的问题,尝试把向量表拷到RAM里面,结果不行。
各位,明白了吧?
lyz3432
5楼-- · 2019-12-11 18:17
 精彩回答 2  元偷偷看……
lyz3432
6楼-- · 2019-12-11 18:57
istars2005 发表于 2019-6-19 17:36
请教怎么实现自动编译两次呢?
也遇到这个问题过
都是分两次编译

cmake 写的 就是当两个工程啊 编完一个在遍另一个啊  当是脚本自动调的啊

一周热门 更多>