外观
OTA 升级
2026-05-18
OTA 升级用于在设备运行后更新应用镜像或 DTB 镜像。睿擎平台提供 app_upgrade 命令,命令入口位于应用侧 components/loader/ota/app_upgrade.c,实际写入流程由内核侧 upgrade service 完成。
1. 功能说明
app_upgrade 支持以下目标:
| 命令 | 作用 |
|---|---|
app_upgrade app <app.img> | 升级 app 分区中的应用 |
app_upgrade app_back <app.img> | 升级 app_back 备份应用分区 |
app_upgrade dtb <dtb.dtb> | 升级 DTB |
app_upgrade boot_ok | 清除应用启动标志,确认本次应用启动成功 |
其中 app_back 是应用备份分区,用于在 app 分区中的应用无法正常启动时提供回退启动。
2. 升级 app 分区
在 MSH 中执行:
app_upgrade app /sdmmc/app.img执行后,升级服务会读取指定文件,并将镜像复制到应用下载地址。镜像头中的 is_download 会被置为 1,用于通知内核下次启动时执行应用更新。
完成后重启设备:
reboot重启后,内核会根据下载标志把新应用写入 app 分区,并启动新应用。
3. 升级 app_back 分区
app_back 不走下载地址缓存,而是由升级服务直接写入备份分区。
在 MSH 中执行:
app_upgrade app_back /sdmmc/app.img升级服务会读取 app.img,将镜像头中的 is_download 置为 0,然后通过 smodule updater 写入 APP_BACK_FW 对应的 app_back 分区。
如需更新备份应用,可以单独执行 app_back 升级:
app_upgrade app_back /sdmmc/app.imgapp_back 应保留一份确认可启动的应用镜像。是否更新 app_back 取决于产品升级策略。
4. 启动确认
应用启动成功后需要清除启动标志。应用侧在 components/loader/ota/app_upgrade.c 末尾通过 INIT_APP_EXPORT(app_upgrade_boot_ok) 将 app_upgrade_boot_ok() 注册到应用初始化阶段,系统启动应用后会自动调用该函数,默认置为 boot_ok。 该函数通过 upgrade service 执行 UPGRADE_CTRL_CLEAR_APP_BOOT_FLAG。
也可以在 MSH 中手动执行:
app_upgrade boot_ok如果启动标志未清除,下次启动时内核会认为上次应用没有正常启动,并尝试加载 app_back:
app boot flag not cleared, load app_back5. 回退机制
系统正常启动时优先启动 app 分区中的应用。
当检测到应用启动标志未清除时,系统会读取 app_back 分区,并按普通应用镜像流程校验:
- 读取 smodule 头。
- 检查 magic、镜像大小和加载地址。
- 校验应用 CRC。
- 将应用加载到运行地址并启动。
如果 app_back 中没有合法 app.img,可能出现:
app_back head magic invalid
read app_back failed因此使用 OTA 升级应用时,应保持 app_back 中有一份可启动应用。
6. 升级 DTB
如需升级 DTB,在 MSH 中执行:
app_upgrade dtb /sdmmc/dtb.dtb升级服务会读取 DTB 文件,并复制到 DTB 更新地址。DTB 文件大小不能超过系统配置的最大限制。
7. 注意事项
- OTA 应用升级使用
app.img,不要使用未添加 smodule 头的app.bin。 app_upgrade app更新的是下次启动要写入app分区的下载镜像,执行后需要重启。app_upgrade app_back会直接写入app_back分区。app_back用于回退启动,应保留一份确认可启动的应用镜像。- 应用启动成功后需要清除启动标志;默认会自动调用
app_upgrade_boot_ok(),也可用app_upgrade boot_ok手动执行。 app.img大小不能超过app和app_back分区大小。- AMP 场景下,如果存储由 Linux 控制,RT-Thread 侧加载
app_back需要依赖 Linux 侧 storage 服务。
