搜索
bottom↓
回复: 26

双备份bootloader程序更新

[复制链接]

出0入0汤圆

发表于 2019-1-31 19:24:43 | 显示全部楼层 |阅读模式
大家有没有做过这种bootloader,
如果刷写过程中失败,则自动切换到上一次正常的App。
目前的思路是Flash分为3部分:Bootloader + App1 + App2

目前的难点是App1和App2里面的程序中断向量表啥的肯定不一致,没法做到统一。



阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入4汤圆

发表于 2019-1-31 19:48:38 | 显示全部楼层
APP 版本号+校验 BOOTLOADER检测

出0入0汤圆

发表于 2019-1-31 19:49:53 | 显示全部楼层
烧写失败就失败呗,开机长按某个按键强制让他进入boot模式接着刷呗

出0入0汤圆

发表于 2019-1-31 20:13:32 来自手机 | 显示全部楼层
你可以这样想,App2只做接收用,验证App2完整之后,再把2覆盖到1,

出0入8汤圆

发表于 2019-1-31 20:15:54 | 显示全部楼层
向量表写到RAM中不就统一了

出0入0汤圆

发表于 2019-1-31 20:16:56 | 显示全部楼层
把boot做成app1就好了

出0入0汤圆

发表于 2019-1-31 20:27:49 | 显示全部楼层
都是boot+aap两部分,本地更新直接写到内部flash,远程更新先把接收到的放外部spi flash 全部收到后再写入内部flash

出0入0汤圆

发表于 2019-1-31 20:38:07 | 显示全部楼层
LZ的b+a+a方法很好.可以验证应用的完整性

出0入76汤圆

发表于 2019-1-31 21:32:41 | 显示全部楼层
楼上多好都没有考虑到在写入时发生断电或其它意外的情况, 如果系统中有SPI Flash,可以把接收到的数据放里面, 然后再来长级FLASH。
还有一种存储结构划分方式:
| bootloader | + | app | + | iap flag + iap firmware data |

在升级更新APP区域前 :先是对IAP区接收的固件数据做过校验的(也可以是在接收这个固件时就进行了校验的,以保证正确性), 如果正确设置相应的IAP Flag标志, 然后再进行APP区的固件刷写, 刷写成功后再设置IAP Flag相应的标志。

这样就应该不会有出现两个中断向量的问题, 同时也应该能有效防止变砖的可能性。

出0入0汤圆

发表于 2019-1-31 22:09:43 | 显示全部楼层
4楼正解

出0入0汤圆

 楼主| 发表于 2019-2-1 06:45:31 来自手机 | 显示全部楼层
lvfv 发表于 2019-1-31 20:13
你可以这样想,App2只做接收用,验证App2完整之后,再把2覆盖到1,

把app2刷到app1的过程,如果有异常掉电会有问题。。

出0入31汤圆

发表于 2019-2-1 07:46:55 来自手机 | 显示全部楼层
按9楼的来一般应用就够了,一个APP区即可,在flash或eeprom中存一个标志位和校验码(包括app长度)就可以了,不怕掉电,可以检测固件损坏,很安全了,最大的问题是如何检测app的合法性,所以最好保留一个强制升级的功能。

出0入0汤圆

发表于 2019-2-1 09:32:45 | 显示全部楼层
823032003 发表于 2019-2-1 06:45
把app2刷到app1的过程,如果有异常掉电会有问题。。

已经确保2是完整的了,就算掉电,也只是1不完整,重新上电,继续刷1就行了。

出0入0汤圆

发表于 2019-2-1 11:07:56 | 显示全部楼层
我们做的是这种的boot1+boot2+app1 保证所有部分都能升级,编译的时候就是编译三个工程有各自的link文件。

出0入0汤圆

发表于 2019-2-1 11:17:36 | 显示全部楼层
lvfv 发表于 2019-1-31 20:13
你可以这样想,App2只做接收用,验证App2完整之后,再把2覆盖到1,

我就是这么做的,设计上容易多了

出0入0汤圆

 楼主| 发表于 2019-2-1 13:03:30 | 显示全部楼层
foxpro2005 发表于 2019-1-31 21:32
楼上多好都没有考虑到在写入时发生断电或其它意外的情况, 如果系统中有SPI Flash,可以把接收到的数据放里 ...

非常感谢你的回复。

请问  iap flag 是 iap firmware data里面有程序需要刷到App的标志位?
(如果 iap flag=1,则将 iap firmware data里面的数据放到App,刷完App以后,再将存在FLASH里面的iap flag设置为0.)

出0入0汤圆

发表于 2019-2-1 13:34:52 来自手机 | 显示全部楼层
可以把中断向量重定向这ram中,运行新app时刷新新的中断向量

出0入0汤圆

 楼主| 发表于 2019-2-2 00:12:42 来自手机 | 显示全部楼层
way2888 发表于 2019-2-1 13:34
可以把中断向量重定向这ram中,运行新app时刷新新的中断向量

大师,能不能详细一点。。

出0入0汤圆

发表于 2019-2-2 08:19:39 来自手机 | 显示全部楼层
如果只编译一个bin,把中断向量表放到ram还不够,还要把代码编译成位置无关。9楼方法更实用

出0入0汤圆

 楼主| 发表于 2019-2-2 19:57:28 | 显示全部楼层
eleqian 发表于 2019-2-2 08:19
如果只编译一个bin,把中断向量表放到ram还不够,还要把代码编译成位置无关。9楼方法更实用 ...

"把代码编译成位置无关"有什么办法不?
谢谢

出0入0汤圆

发表于 2019-2-3 10:07:07 | 显示全部楼层
我是Boot+APP+配置和参数区域,APP升级失败无所谓,有外部外门狗,一直停在Boot区域,会提示需要再次升级;升级之后继承老的配置和参数;我觉得这样挺简单,也不浪费空间

出105入79汤圆

发表于 2019-2-4 02:27:09 | 显示全部楼层
很多场合app大于1/2的flash。这样就没办法还原了。中断后还是在boot继续等待升级吧。

出0入0汤圆

 楼主| 发表于 2019-2-4 05:28:20 来自手机 | 显示全部楼层
nicholasdlut 发表于 2019-2-3 10:07
我是Boot+APP+配置和参数区域,APP升级失败无所谓,有外部外门狗,一直停在Boot区域,会提示需要再次升级; ...

双备份目的是升级失败,还可以继续跑之前的程序。

出0入4汤圆

发表于 2019-2-14 10:11:13 | 显示全部楼层
823032003 发表于 2019-2-1 06:45
把app2刷到app1的过程,如果有异常掉电会有问题。。

没啥问题。下次上电继续搬运呗。APP2完整的 没有被破坏。

出0入0汤圆

发表于 2019-2-14 10:44:58 | 显示全部楼层
把新APP放到外部flash的方案我也想过,进行完整性校验后再刷机,防止文件接收不全。这样做会不会有安全性问题,是不是需要加密,防止在接收校验通过后,被人恶意拷贝,篡改?

出0入0汤圆

发表于 2019-2-14 10:54:19 | 显示全部楼层
STM32 使用轻量RTOS 可以远程刷新固件吗 ?

出0入31汤圆

发表于 2019-2-14 11:16:51 来自手机 | 显示全部楼层
CarverZhang 发表于 2019-2-14 10:54
STM32 使用轻量RTOS 可以远程刷新固件吗 ?

和rtos无关,裸奔可以带rtos就行
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-24 16:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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