标签: 嵌入式开发 2026-10-12
一台已经安装到客户现场的嵌入式设备,准备升级到新的固件版本。
升级包下载完成,设备开始写入程序。进度达到一半时,现场突然断电。
重新供电后,设备没有进入正常工作状态。
这时候问题就不再是“升级有没有成功”,而是:设备还能不能恢复?是否需要拆机连接调试器?如果设备安装在外地,是否意味着必须安排人员到现场维修?
对于能够长期运行、需要后期维护的智能硬件和工业电子设备,固件升级不能只设计成功路径,还必须考虑失败以后如何退出危险状态。
一套可维护的升级机制,至少需要回答三个不同的问题:
升级前,能否判断固件包可以安全使用?升级中,能否避免破坏唯一可启动的程序?升级后,如何确认新版本确实能够正常工作?
这三个问题分别对应不同的故障阶段,不能只依靠一个CRC校验或者一次看门狗复位解决。
假设设备当前运行固件A,服务器提供新版本B。
设备通过以太网、Wi-Fi、4G或其他通信方式接收升级包。应用程序收到最后一个数据包后,报告下载完成。
但“下载完成”只说明传输过程结束,并不必然意味着文件正确。
例如下载过程中发生数据损坏,升级包不适用于当前硬件版本,或者文件虽然完整,却不是来自可信发布方。
如果设备没有进行必要检查就覆盖当前程序,问题可能在重启之后才暴露。
因此,升级包在正式使用前,应依据项目要求检查文件长度、完整性、适用设备型号、硬件版本、固件版本以及真实性。
这里需要区分两种校验。
完整性校验用于判断文件内容是否发生变化。例如CRC或密码学哈希可以用于检测传输或存储错误,但普通CRC不能证明升级包来自可信发布方。
真实性校验则用于确认升级包的发布身份和内容是否经过授权。对于存在固件篡改风险的设备,可通过经过正确设计的数字签名及可信公钥验证机制实现。
如果还涉及防止未经授权的旧版本重新安装,则需要结合版本策略和防降级机制。
这些安全能力并不是所有简单设备都必须按照同一等级配置,但不能把文件校验成功直接等同于已经验证了升级包的真实性。
理想情况下,不符合条件的升级包应该在修改当前可用程序之前就被拒绝。
如果设备只有一个可执行固件区域,并且升级程序直接擦除、覆盖当前固件,那么写入中途断电就可能导致固件不完整。
假设当前固件占用300KB,设备准备把新的300KB固件写入同一个Flash区域。
当旧程序已经被擦除一部分,而新程序还没有完整写入时,电源消失了。
重新启动以后,主控可能找不到有效应用程序。
这个时候,即使升级包之前通过了校验,也无法保证设备恢复正常工作。
因为校验解决的是升级包是否正确,而不是覆盖过程中是否始终保留有效的可启动程序。
对于这种问题,需要在研发阶段考虑固件存储和启动结构。
Bootloader通常在应用程序启动前运行,可以承担固件有效性判断、启动选择和必要的升级恢复职责。
它的核心价值之一,是避免设备只能依赖当前应用程序完成所有恢复操作。
如果应用程序已经损坏,而升级入口也全部放在这段应用程序中,设备可能失去重新接收固件的能力。
因此,具有升级恢复需求的设备,应考虑如何保护启动及恢复代码,避免普通升级流程将其意外覆盖。
不过,仅有Bootloader并不意味着设备一定不会变砖。
如果Bootloader本身被损坏、启动配置错误,或者升级过程破坏了关键元数据,仍然可能无法正常启动。
所以还需要考虑启动代码保护、元数据可靠写入和必要的硬件恢复方式。
对于Flash容量允许的设备,可以评估A/B分区或双镜像升级方案。
设备当前运行固件A时,新固件B先写入另外一个区域。
在B尚未完整写入并通过验证之前,A保持可用。
这样即使下载或写入过程中断,设备原则上仍有机会继续使用原来的有效固件。
但双分区也不是简单地把Flash分成两半就结束了。
系统还需要可靠记录:
当前启动哪个镜像;
候选镜像是否完整;
是否已经通过首次启动验证;
哪一个版本仍然可以作为恢复目标。
这些状态不能因为某次断电就变得不确定。
如果启动选择信息本身损坏,设备仍可能出现启动失败或者反复切换。
因此,双分区机制需要与可靠的启动状态管理一起设计。

升级失败还有一种更难处理的情况。
新固件已经完整写入,设备也成功跳转到新版本,串口输出了启动日志,甚至网络连接也已经恢复。
按照简单的升级流程,这时候可能立即报告:
“升级成功。”
但设备真正投入运行后,才发现新的固件无法读取某个传感器、通信协议存在兼容问题,或者控制任务进入异常状态。
这样的设备虽然能够启动,却未必能够正常履行业务功能。
因此,对于需要较高可用性的设备,升级过程应区分:
镜像验证通过、程序成功启动、业务健康确认、正式启用。
例如,新固件第一次启动后,可以先处于试运行状态。它需要在规定时间内完成必要的初始化、核心任务自检和业务健康确认,才能被标记为正式可用版本。
确认标准应根据设备用途设计,而不是只检查网络在线。
一台工业采集设备可以联网,但ADC采样任务没有正常运行;一台控制终端可以发送心跳,但关键输出功能可能不可用。
如果项目需要确认这些功能,就不能以单一心跳替代完整的健康判断。
假设设备从版本A升级到B。
B能够启动,但在首次运行中连续触发看门狗,或者关键业务自检失败。
如果仍然保存着有效的A版本,并且启动管理机制能够识别B尚未完成健康确认,那么设备就可以依据预设规则尝试重新启动A。
这就是版本回退机制的一种应用。
它主要用于降低新版本引入严重问题之后的恢复难度。
但回退也存在前提。
首先,旧镜像必须仍然完整有效。
其次,设备需要能够可靠判断新版本是否已经得到确认。
第三,旧版本重新启动后,必须仍能理解设备当前保存的必要配置和数据。
最后一个问题尤其容易被忽略。
假设B版本升级了配置文件格式,并在第一次启动时修改了本地数据库结构。
随后B因其他原因启动失败,设备回退到A。
如果A无法识别B已经修改过的数据格式,那么虽然固件回退成功,设备仍然可能无法恢复原来的业务状态。
因此,完整的回退设计不仅涉及应用镜像,也可能涉及配置版本、数据迁移和兼容性策略。
对于存在防降级要求的安全系统,还需要明确哪些旧版本允许回退,避免回退功能成为安装已知存在安全缺陷版本的入口。
能够恢复旧程序,并不必然等于能够恢复旧业务状态。
双分区提升了升级过程的容错能力,但需要额外的非易失存储空间,也会增加启动管理和测试工作。
对于资源有限的小型MCU,可能无法同时保存两份完整应用固件。
这时需要根据设备的维护方式和故障后果,考虑其他恢复方案。
| 方案 | 主要特点 | 需要重点考虑的限制 |
|---|---|---|
| 单应用区原地更新 | 存储需求相对较低 | 写入中断可能破坏唯一应用 |
| 单应用区加独立恢复程序 | 可通过恢复模式重新写入应用 | 恢复程序与通信入口必须保持可用 |
| A/B双镜像升级 | 更新期间保留另一份有效应用 | Flash容量、启动状态和数据兼容性 |
| 外部存储暂存升级包 | 可先保存完整文件,再进行安装 | 外部存储可靠性和安装过程保护 |
| 有线维护升级 | 适合现场可接触、数量较少的设备 | 需要人员、接口和维护条件 |
这些方案没有绝对的统一排名。
例如一台安装在实验室、可以方便接入调试器的设备,与一台部署在偏远地区、拆机维护成本很高的无线终端,升级恢复需求可能完全不同。
如果设备属于需要连续执行关键控制任务的系统,还必须考虑升级期间如何进入安全状态,以及恢复后能否按照规定条件恢复业务。不能让普通OTA逻辑替代必要的安全控制机制。
还有一种问题不会立即造成设备无法启动,却可能在现场形成长期隐患。
设备从A切换到B以后,B首次启动异常,于是系统尝试回到A。
但由于启动标记没有正确保存,设备重启后又继续尝试B。
最终形成:
A启动、切换B、B失败、回退A、再次切换B。
如果没有启动次数限制和稳定的状态管理,这种情况可能持续消耗电量、反复写入Flash,并影响正常业务。
因此,升级状态应具备可预期的失败出口。
例如候选版本达到设定的失败次数后,不再自动反复尝试,而是保留已确认的稳定版本,记录失败原因,并根据设备条件等待下一次受控升级。
对于没有可用旧镜像的设备,则应进入可以被识别和维护的恢复状态,而不是无限重启。
这部分逻辑应在Bootloader与应用程序之间明确划分,避免双方分别维护互相矛盾的升级状态。
正常情况下完成一次OTA升级,只能证明成功路径能够运行。
如果希望验证恢复能力,就需要在可控的样机环境下主动制造升级失败。
例如准备两套已知版本,在升级测试期间分别模拟不同阶段的异常。
第一阶段:下载与校验
提供损坏的升级包、不适用的固件版本,以及在需要真实性验证的系统中提供签名不匹配的测试包。
预期结果应是设备拒绝不合格包,并保持当前有效程序可用。
第二阶段:写入与切换
在受控测试条件下于不同写入进度中断供电,随后恢复。
检查设备能否按照设计继续运行旧版本、重新安装或进入恢复模式。
不能只选一个固定进度进行断电测试,因为关键状态写入和镜像切换的时机可能更容易暴露问题。
第三阶段:新版本首次启动
使用经过专门设计的测试固件模拟初始化失败、健康确认超时或受控任务异常。
确认系统是否按照约定处理未确认镜像,并避免无限重启。
第四阶段:业务恢复
检查设备身份、通信参数、必要配置及数据是否符合预期。
如果存在本地数据格式迁移,还应验证升级和回退之间的兼容性。
不同产品可以设置不同的测试深度,但验收不能只用“升级进度显示100%”作为最终判断标准。
如果设备目前已经处于无法正常启动状态,需要先判断失效发生在哪一层。
如果独立Bootloader仍然能够工作,而且预留了串口、USB、网络或其他维护升级入口,就可能通过恢复模式重新写入有效应用固件。
如果Bootloader无法正常运行,但主控芯片保留可使用的ROM启动功能或硬件调试接口,可能仍有机会通过对应的维护工具恢复。
如果启动相关存储已经损坏、关键硬件发生故障,或者产品设计没有保留可用维护入口,则可能需要拆机、返厂甚至更换硬件。
因此,“设备变砖”并不总是同一种故障。
在定位之前,需要区分应用程序无法启动、升级管理状态异常、启动代码损坏以及硬件本身失效等不同情况。
对已经部署现场的设备,尤其需要先确认远程恢复操作的安全性,避免反复下发未知升级包,使仍具备部分恢复能力的设备进一步失去可维护性。
北京心玥科技有限公司可根据项目需求参与嵌入式固件、主控板、工业电子设备以及智能硬件与IoT相关研发。
对于具有后续升级需求的项目,可以在方案和硬件设计阶段评估主控存储容量、启动方式、维护接口和通信条件,并结合实际固件架构设计升级流程及异常处理机制。
如果项目涉及设备管理平台、上位机或其他软件系统,也可以根据实际合作范围开展配套的软件开发及接口联调。
固件升级是否需要Bootloader、A/B双分区、数字签名验证、自动回退或远程管理,应结合项目安全要求、设备成本、存储资源、部署规模和维护方式确定,不能默认所有设备都需要完整配置。
相关固件、升级工具、软件源码、技术文档及测试交付范围,以双方项目约定为准。
对于需要长期交付和现场维护的嵌入式设备,升级功能的工程价值不仅是让新版本能够安装。
更重要的是:新版本不能正常使用时,系统是否仍然保有可靠、受控的恢复路径。
不能。Bootloader可以提供启动管理和恢复能力,但仍受自身可靠性、存储布局、元数据、硬件状态和维护接口等条件限制。
通常需要为两个应用镜像预留足够空间,还可能需要Bootloader、元数据、配置及其他存储区域。具体容量由固件大小和分区方案决定,不能简单认为整片Flash恰好翻倍即可。
只能说明部分通信能力恢复。是否升级成功,还需要根据设备要求检查固件版本、关键功能和健康确认状态。
不能。自动回退需要预先设计并验证有效的旧镜像、启动选择机制和兼容性条件。只有单固件区且没有其他可靠恢复机制的设备,不一定具备远程回退能力。