硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2311|回复: 16
收起左侧

[技术讨论] 关于双分区APP的bootloader处理。

  [复制链接]

13

主题

52

回帖

91

积分

初级会员

积分
91
发表于 2022-11-7 18:19:39 | 显示全部楼层 |阅读模式
BootLoader.png
做的是一个网络OTA功能,在运行期间直接可以获取服务器中的固件进行写入,之后重启就可以运行新的APP,而且会保留前一次的固件。
我目前发现,在生成两个APP的时候,需要修改ROM的地址。这样,后期维护太难了。请教下大家有没有什么好的方法。



回复

使用道具 举报

39

主题

196

回帖

323

积分

高级会员

积分
323
发表于 2022-11-8 08:00:21 | 显示全部楼层
没有,我之前也想做双分区。

后来发现要两个不同bin文件才行..就放弃了。
感觉如果要不同的bin文件的话,意义不大。
貌似还有一个方案,就是烧录的时候用elf文件,然后在上位机或者嵌入的代码里,把elf文件转换成bin文件。
不过不清楚具体实现方法,所以这个方案也被我放弃了。

如果群友有好的方法,可以指导一下我。
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-11-8 09:12:28 | 显示全部楼层
会飞的猪_2020 发表于 2022-11-8 08:00
没有,我之前也想做双分区。

后来发现要两个不同bin文件才行..就放弃了。

我是有用国产的WIFI芯片,发现别人原厂用的M4的核,然后我研究了下他们的OTA,发现是这种双备份的,感觉很NICE,所以开始折腾STM32,我最后发现要两个Bin文件,根本没办法维护。
回复

使用道具 举报

20

主题

114

回帖

174

积分

初级会员

积分
174
发表于 2022-11-8 10:04:51 | 显示全部楼层
0x8000 0000 ~ 0x8007 FFFF 存放App1出厂默认程序,防止变砖,如没有App2直接运行APP1,且自带bootloader用于升级App2
0x8008 0000 ~ 0x800F FFFF 存放App2,新固件存放地址。如有更新则重启,切换到APP1中的bootloader更新APP2地址中固件。
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-11-9 09:13:28 | 显示全部楼层
magicoctoier 发表于 2022-11-8 10:04
0x8000 0000 ~ 0x8007 FFFF 存放App1出厂默认程序,防止变砖,如没有App2直接运行APP1,且自带bootloader用 ...

那这种方法每次更新固件实际上还是更新的一个区,APP1区的相当于出厂固化的APP,是这样吧
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2022-11-11 08:00:27 | 显示全部楼层
外挂nor flash存放升级程序的吧
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-11-11 09:00:12 | 显示全部楼层
yklstudent 发表于 2022-11-11 08:00
外挂nor flash存放升级程序的吧

没有外挂。就直接MCU内部的flash分区做
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2022-11-14 17:36:51 | 显示全部楼层
升级时先将A区备份到B区,再将新固件写入A区,这样每次启动时都是从A区启动,启动失败时,在boot里从B区恢复镜像到A区,基本上就是把b区当作是一个外挂的flash使用。
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-11-25 09:15:42 | 显示全部楼层
alukaaaa 发表于 2022-11-14 17:36
升级时先将A区备份到B区,再将新固件写入A区,这样每次启动时都是从A区启动,启动失败时,在boot里从B区恢 ...

明白了,这也是一种可以解决的方法了
回复

使用道具 举报

4

主题

26

回帖

38

积分

新手上路

积分
38
发表于 2022-11-28 19:55:07 | 显示全部楼层
说说我的解决办法,app1是实际运行app的位置,app2 存储网络接收的新的固件。
另外找个地方 存储 app2 的长度、校验和。
bootloader每次运行的时候,先判断app2是否为空,如果不为空有固件,再判断app2的长度与校验是否正确(确定一下app2是否完整)。
如果app2完整且校验没问题,就在bootloader中,将app2 复制到app1里面去,并且清空app2.
这样就完成了升级。
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-11-29 10:03:01 | 显示全部楼层
asj 发表于 2022-11-28 19:55
说说我的解决办法,app1是实际运行app的位置,app2 存储网络接收的新的固件。
另外找个地方 存储 app2 的 ...

这样无法回退。你的思路我理解。
回复

使用道具 举报

4

主题

26

回帖

38

积分

新手上路

积分
38
发表于 2022-11-30 12:27:07 | 显示全部楼层
Hzzz 发表于 2022-11-29 10:03
这样无法回退。你的思路我理解。

要回退做什么用?
回复

使用道具 举报

13

主题

52

回帖

91

积分

初级会员

积分
91
 楼主| 发表于 2022-12-11 01:06:16 | 显示全部楼层
asj 发表于 2022-11-30 12:27
要回退做什么用?

折腾啊,哈哈,实际我也没遇到需要回退的。
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2023-9-9 08:34:35 来自手机 | 显示全部楼层
Hzzz 发表于 2022-12-11 01:06
折腾啊,哈哈,实际我也没遇到需要回退的。

我最近实现了这个,主芯片为microchip的PIC18-Q系列8位单片机。双分区APP是很有意义的,可以做到所谓的 “living update”,这是microchip的叫法。可以回退APP。掌握了实现思想,可以移植到其他任何可以实现BL,也就是支持flash自编程的MCU中。
下面是我在另一篇帖子中的详细讨论:
https://www.armbbs.cn/forum.php?mod=viewthread&tid=119895&extra=page%3D1&mobile=2
回复

使用道具 举报

3

主题

75

回帖

84

积分

初级会员

积分
84
发表于 2023-9-9 16:49:59 | 显示全部楼层
可以用动态加载来做乒乓升级,避免维护两个工程
回复

使用道具 举报

7

主题

48

回帖

69

积分

初级会员

积分
69
发表于 2023-9-9 22:42:00 来自手机 | 显示全部楼层
gjeoi 发表于 2023-9-9 16:49
可以用动态加载来做乒乓升级,避免维护两个工程

这是另一种叫法而已。一共就两个工程啊,一个BL,一个APP。用条件编译进行选择,让APP生成APP1或APP2。
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2023-10-26 14:41:43 | 显示全部楼层
本帖最后由 quar 于 2023-10-26 15:21 编辑

写一个预编译脚本,每次出正式版本编译前修改链接文件的起始地址。keil里面在编译前可以先执行脚本,这样就是自动化修改起始地址,而不需要手动去修改了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-2 16:27 , Processed in 0.215303 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表