硬汉嵌入式论坛

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

[技术讨论] 请教工作中的各位大佬,如果对bootloader 进行更新,防止断电变砖有没有好方法

  [复制链接]

9

主题

33

回帖

60

积分

初级会员

积分
60
发表于 2023-11-23 17:28:29 | 显示全部楼层 |阅读模式
正常MCU 启动从指定的地址启动,如果应用APP 对bootloader 升级过程中断电,那么整个设备就直接变砖了。 是否有什么好的办法不变砖。 异常断电这件事情还是会存在的
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2023-11-23 23:55:39 | 显示全部楼层
感觉设计三层架构吧
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-11-24 08:55:03 | 显示全部楼层
双boot方案,适合的系列
1、H7系列可以设置从任意Flash地址启动。切换后,同时通过选项字节配置,将启动地址也改了,防止掉电损坏。
2、支持双BANK的也可以,这个也可以设置从任意BANK启动。
回复

使用道具 举报

9

主题

33

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2023-11-24 09:18:49 | 显示全部楼层
yklstudent 发表于 2023-11-23 23:55
感觉设计三层架构吧

三层架构增加维护难度,而且每一层的代码不是都有可能有BUG,陷入死循环了
回复

使用道具 举报

9

主题

33

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2023-11-24 09:19:36 | 显示全部楼层
eric2013 发表于 2023-11-24 08:55
双boot方案,适合的系列
1、H7系列可以设置从任意Flash地址启动。切换后,同时通过选项字节配置,将启动地 ...

针对STM32F4 的Cortex-M4 是否有好的方案方式死机
回复

使用道具 举报

9

主题

33

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2023-11-24 09:21:09 | 显示全部楼层
eric2013 发表于 2023-11-24 08:55
双boot方案,适合的系列
1、H7系列可以设置从任意Flash地址启动。切换后,同时通过选项字节配置,将启动地 ...

双bank 方案缺陷就是少了一半可以使用的FLASH 感觉不划算
回复

使用道具 举报

5

主题

165

回帖

180

积分

初级会员

积分
180
发表于 2023-11-24 15:42:01 | 显示全部楼层
规划两块flash区域,默认使用区域1,传输固件的时候不覆盖默认区域,而是存到区域2,复位重启后对比版本号+做校验,通不过继续从区域1启动,通过了就跳转到区域2,之后上电都从区域2启动
下次更新的时候固件覆盖区域1,然后从区域1启动,再下次更新又覆盖区域2,两个区域交替保存新固件,这样应该可以保证无论如何都有一个可用的固件
回复

使用道具 举报

4

主题

129

回帖

146

积分

初级会员

积分
146
发表于 2023-11-24 16:09:43 | 显示全部楼层
可以看看这个
mOTA
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2023-11-24 23:39:42 | 显示全部楼层
一般芯片就一个bank区吧,0x08000000位置如果放置boot,0x08XXXXXX位置放置app用户程序,从app用户程序对boot进行升级过程中断电啥的,boot工程损坏,这时候芯片重新上电就应该没法正常执行了吧,这个如何支持让程序可以继续跳转执行app程序,确保可以继续支持升级boot功能?
回复

使用道具 举报

38

主题

195

回帖

319

积分

高级会员

积分
319
发表于 2023-11-25 10:15:11 | 显示全部楼层
貌似没太好的办法
回复

使用道具 举报

38

主题

195

回帖

319

积分

高级会员

积分
319
发表于 2023-11-25 10:16:27 | 显示全部楼层
是什么业务需求导致要升级boot,这个不合理吧。
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2023-11-25 12:00:57 | 显示全部楼层
1ST-BOOT+2ND-BOOT+APP
1ST-BOOT只做跳转,如果2ND-BOOT出错,则跳转到APP,否则跳转到2ND-BOOT,然后再跳转到APP
如果有外部NOR,是不是可以先存放新的2ND-BOOT到外部NOR,校验通过后再更新到2ND-BOOT
不知道这样行不行,感觉有点复杂麻烦了,实际客户一般只做APP升级吧
回复

使用道具 举报

9

主题

33

回帖

60

积分

初级会员

积分
60
 楼主| 发表于 2024-1-4 15:47:10 | 显示全部楼层
会飞的猪_2020 发表于 2023-11-25 10:16
是什么业务需求导致要升级boot,这个不合理吧。

新产品bootloader 写的有bug,不是很完善
回复

使用道具 举报

8

主题

155

回帖

179

积分

初级会员

H7 TOOL 大法好!

积分
179
发表于 2024-1-15 13:16:02 | 显示全部楼层
或者 双BOOT 方案,  就是  BOOT1  + BOOT 2 + APP :
1. BOOT1, 用来指向固件升级 或者 应用程序; 每次跳转程序之前 存储标志位 , 然后再目标程序中去判断和清除 ,这样如果APP有问题 或者 BOOT2 有问题 都可以回到BOOT1中 重新切换;
2. BOOT2,用来执行固件更新的目的, 比如 对APP区域进行固件更新等;
3. APP, 用来执行业务程序, 以及 固件接收程序 , 讲固件接收 并 存储至片外FLASH,供BOOT1去更新;

理由: 通常来说 一般对APP程序有更新的需求, BOOT程序一旦稳定后 不会变更, 我这里用双BOOT的方法 , 实际上是 分摊风险 , 就是 要保证BOOT1的程序是正确的(这相对容易, 因为只有一个指向跳转功能) , 然后如果BOOT2有修改需求 , 那么 可以在APP中去 更新BOOT2
回复

使用道具 举报

14

主题

62

回帖

104

积分

初级会员

积分
104
发表于 2024-1-20 09:30:28 | 显示全部楼层
最好的方法就是对BOOT的各项功能做好全面验证,别的花里胡哨的方法都是在徒增复杂度和维护难度。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
QQ
发表于 2024-3-14 10:23:27 | 显示全部楼层
eric2013 发表于 2023-11-24 08:55
双boot方案,适合的系列
1、H7系列可以设置从任意Flash地址启动。切换后,同时通过选项字节配置,将启动地 ...

大佬请教下,我在用H7设置任意地址的方式实现boot更新,发现一个问题,就是我从Boot1(0x8000000) 升级到 boot2(0x8020000)的程序固件,bin文件内的函数、常量等信息的起始地址必须调整到 boot2分区的起始地址(0x8020000),否则切换启动地址时会出现问题,但是如果这样的话,每次升级固件就要搞清楚当前的boot分区的起始地址是 0x8000000 还是 boo2分区0x8020000,请问有什么解决办法
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 16:31 , Processed in 0.202103 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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