从 MCU 到 Linux:机器人嵌入式OTA升级原理解密

OTA升级不是"下载一个bin文件往里写"这么简单。本文聚焦两种主流方案------MCU的双Bank架构与Linux的A/B分区,讲清楚升级过程中"断电不失手,变砖可回滚"的核心机制,并对比 SWUpdate、Mender、RAUC三大开源工具。


一、OTA升级核心原理

无论MCU还是Linux,OTA的本质都是先写备份、再切换、最后擦除的三步走:
🔴 异常处理


重启验证
🟢 第三步:Bootloader校验并写入目标分区
从备用区读取固件
验签+验完整性
解压(如已压缩)
写入目标Flash分区
更新启动标记
🟡 第二步:重启进入Bootloader
设置更新标志位
跳转至Bootloader
Bootloader读取标志位
🔵 第一步:下载固件到暂存区
接收.swu/.bin固件包
完整性校验

SHA-256 / CRC32
签名验证

RSA / ECDSA
写入备用区
启动成功?
回滚至旧版本
报告升级失败

断电不失手的秘密:新固件永远先写入备用区,原固件原地不动。断电发生时Bootloader依然能加载旧系统。


二、MCU方案:双Bank架构

MCU没有文件系统,Flash直接被分成两块------Bank A和Bank B,轮着用。

2.1 Flash分区结构

MCU Flash 分区布局
Bootloader

固定区域

永不改动
App Bank A

当前运行固件
App Bank B

备用区

接收新固件
Config区

升级标志/版本号

2.2 双Bank升级流程

OTA升级路径
正常启动路径



标志指向B
上电/复位
Bank A 可用?
从Bank A启动
运行App
接收新固件
写入Bank B
Bank B 验签
验签通过?
丢弃Bank B

保持Bank A
设置升级标志

bank_to_boot=B
系统重启
从Bank B启动
运行新固件
Bank A变为备用区
BA
BB

2.3 常见MCU OTA开源方案

方案 特点 适用场景
MCUBoot 开源安全Bootloader,支持签名验签、AES加密、双Bank NXP/i.MX系列
STM32FOTA ST官方方案,支持X-CUBE-BLE/X-CUBE-SBSFU STM32全系列
ESP8266/ESP32 OTA WiFi模块内置,支持HTTP/HTTPS差分升级 ESP系列
TI UNIFLASH 德州仪器方案,支持Serial/BLE/WiFi多种方式 TI CC系列

三、Linux方案:A/B分区

Linux设备有文件系统,OTA分区远比MCU复杂。主流方案是用A/B分区实现无缝切换。

3.1 eMMC/SD卡分区结构

Config配置区
UBoot环境变量

bootlimit/bootpart
Data数据分区
数据分区

配置文件/日志/应用数据
Rootfs分区 A/B
rootfs A

当前系统
rootfs B

备用系统
Boot分区 A/B
Kernel A
Kernel B

3.2 A/B分区升级流程

新系统启动验证
重启切换
OTA下载写入
当前系统运行中
后台下载
成功
失败
rootfs A 正在运行

应用持续服务
从服务器下载.swu包
sw-description

描述镜像配置
写入rootfs B

不触碰rootfs A
更新UBoot环境变量

bootpart=B
重启
从rootfs B启动
健康检查通过?
确认升级成功

rootfs A变为备用
回滚rootfs A

保持原状

3.3 UBoot A/B切换原理

连续失败回滚

fail_count++
fail_count > bootlimit?
回滚至旧分区

fail_count=0
A→B 切换逻辑
setenv bootpart 2
saveenv

固化到Flash
reset
UBoot 环境变量
mmcbootpart=1

当前启动分区
mmcbootpart=2

备用分区
bootlimit=3

允许连续失败次数


四、开源方案对比

方案 类型 签名验签 差分升级 断电保护 适用平台
SWUpdate 块+文件级 ✅ RSA/ECDSA ✅ A/B分区 嵌入式Linux
Mender 块级 ✅ RSA ✅ A/B分区 Yocto/Linux
RAUC 块级 ✅ RSA/Ed25519 ✅ A/B分区 嵌入式Linux
balenaOS 容器化 ✅ delta ✅ A/B分区 ARM/Yocto

核心结论:三者都支持A/B分区和签名验签。SWUpdate最灵活(支持单文件更新),RAUC安全标准最高(Muttus模式),Mender与Yocto集成最深。


五、总结

OTA升级的本质是**"不破坏性写入 + 可回滚切换"**。记住一个口诀:

MCU看Bank,Linux看分区;下载写备用,重启再切换;验签不过关,坚决不刷写。

方案 核心差异
MCU双Bank Flash物理分成两块,Bootloader决定从哪块启动
Linux A/B分区 文件系统级分区,OTA工具写备用分区,UBoot切换启动目标
共同点 新固件验签通过前,原系统纹丝不动;任何阶段失败都能回滚

相关推荐
数字新视界14 小时前
动环监控可视化在数据中心管理中的应用与实践解析
数据库·物联网·解决方案·动环监控·大榕树
听风34716 小时前
Arch Linux 软件安装完全指南
linux·运维·archlinux·pacman
老孙讲技术16 小时前
业主半夜想看楼道监控,物业却说「去机房」?我用设备托管+轻应用,把小区摄像头嵌进了社区小程序
后端·物联网
lcj092466616 小时前
基于云IoT搭建企业固定资产全生命周期管理系统落地实践
物联网
星恒讯工业路由器16 小时前
工业以太网核心技术解析
网络·物联网·网络拓扑·信息与通信·业以太网·网络冗余
网络安全零基础教程16 小时前
网络安全春招面试避坑与复盘指南
linux·网络·安全·web安全·面试·职场和发展
智慧物业老杨17 小时前
物业费公共收益维修资金三类资金分账的合规管控
大数据·人工智能·物联网
扛枪的书生17 小时前
TigerVNC 安装流程
linux
Mortalbreeze17 小时前
深入 Linux Socket 编程:端口号、网络字节序与 struct sockaddr 详解
linux·服务器·网络·c++
磨十三17 小时前
U-Boot
arm开发·嵌入式硬件