AIGC标识 采集设备的固件升级设计:双分区、回滚与断电保护

■ 一、为什么要专门设计升级

采集设备装在现场,人上不去、电不稳、网不快。升级失败一次的代价,往往不是重刷固件,而是跑一趟现场、停几天数据。所以升级功能不是"能升就行",而是要能在最坏条件下活下来。

■ 二、现场升级失败的四种形态

第一种,传输中断。网络抖动或信号弱,包传了一半。
第二种,写入期间断电。写 Flash 的过程中掉电,最常见也最致命。
第三种,电源波动。电压跌落导致写操作时序错乱,写进去的内容是坏块但校验看不出来。
第四种,版本不兼容。新固件与旧配置结构不匹配,起来就跑飞。

这四种里,前三种靠机制解决,第四种靠版本管理解决。

■ 三、双分区:最基础的保险

把 Flash 分成运行区和备份区。升级时只写备份区,写完校验通过,再切换启动标志;运行区始终保留上一版可用固件。

关键细节有三个:

· 切换标志必须原子写,最好用独立的标志扇区加 CRC;
· 启动时先校验运行区,校验失败自动回退到备份区;
· 两个分区的固件版本号要能被读出,方便现场确认。

■ 四、回滚不是"再刷一次"

很多设计把回滚理解成"重新上传旧版本",这在现场往往做不到——网络不通、现场没人。真正的回滚应该是设备自主完成的:启动连续失败 N 次,自动切回上一版,并把失败次数和原因记进日志。

■ 五、断电保护:写之前先想"写一半怎么办"

三个原则:

· 写之前先擦除校验区,标记"正在升级",这样断电重来能识别出未完成的升级;
· 分包写入,每包带序号与 CRC,写一包验一包;
· 全部写完后做一次整包校验,通过才切标志。

这里最容易忽略的是电源:升级期间如果电池电量低,应该拒绝升级,而不是"先升了再说"。

■ 六、版本与配置要一起管

固件升级常见的坑是配置结构变了。做法是给配置加版本号,升级时执行迁移脚本;迁移失败就保留旧配置并回退固件版本,不要"强行适配"。

■ 七、升级过程要可观测

现场排查最怕"升级了但不知道升到哪一步"。建议把升级状态做成可读字段:当前版本、目标版本、进度、最近一次失败原因、启动失败计数。

■ 八、一个务实的检查清单

· 双分区与原子切换标志(有)
· 启动校验与自动回退(有)
· 分包写入 + 每包 CRC(有)
· 整包校验通过才切换(有)
· 低电量拒绝升级(有)
· 配置版本迁移(有)
· 升级状态可读(有)
· 失败日志可导出(有)

这八项做到,现场升级的绝大多数事故都能兜住。升级设计的目标不是"永不失败",而是"失败也能自己回来"。

posted @ 2026-10-26 10:42  『风格』  阅读(5)  评论(0)    收藏  举报