ESP32 学习笔记(十六)Over The Air Updates (OTA)
Over The Air Updates
- Over The Air Updates (OTA)
-
OTA 过程概述
-
数据分区管理
-
应用回滚机制
-
应用状态监控
-
回滚操作流程
-
异常重启处理
-
应用启动异常处理
-
状态配置管理
-
安全更新策略(适用于无安全启动的情况)
-
相关资料汇总
- 应用示例集
- API 参考文档
- 头文件索引
- 参考资料
-
Over The Air Updates (OTA)
OTA 流程概述
OTA 更新机制支持设备基于常规状态下固件运行期间接收的数据进行更新(具体而言是通过WiFi或蓝牙连接完成)
为了确保配置的有效性,请将设备划分为两个独立的‘OTA app slot’分区,并搭配‘OTA Data Partition’来构建设备的分区表。有关详细信息,请参考文档:https://esp-idf.readthedocs.io/en/latest/api-guides/partition-tables.html
OTA功能模块将新增的应用程序固件映像注入到当前未被当前启动使用的OTA应用程序位置。经过验证该映像是否正确后,系统将重新划分数据分区区域以确保此映像在下次启动时应用。
OTA 数据分区
OTA 数据类型(定义为 type data 且 subtype 为 ota)应当作为其所有采用 OTA 功能的项目所使用的分区表中的一个必要组成部分,并通过相应的链接机制被相关项目引用。
对于出厂启动配置,OTA数据分区必须全部字段清零(即每个字节都被设置为FF). 这种情况下,ESP-IDF软件引导加载程序将用来加载工厂应用(如果该应用在当前分区表中有记录). 如果发现工厂应用未被列出在分区表中,系统将自动选择第一个OTA更新程序作为默认选项(通常标记为ota_0).
在完成第一次OTA升级后,在OTA数据分区上进行重新配置,并将下一个应用的路径设置为该分区的根目录
OTA 数据分区的容量设置为两个闪存扇区(共计2^{16} 字节),旨在避免在write操作中因power supply故障导致的数据丢失。每个扇区分别进行独立擦除,并采用校验数据进行重写操作;如果两者意见不一致,则通过计数器字段来判断最近的操作是在哪个扇区完成的。
APP 回滚
程序回滚的功能主要旨在确保在完成OTA更新后设备仍能正常运行。
该功能旨在帮助用户恢复至先前的应用程序状态以防止新应用发生重大故障。
启用回滚机制并伴随OTA更新引入新版本时可能会出现以下三种情形之一:
- 当前应用处于正常状态,在调用
esp_ota_mark_app_valid_cancel_rollback()后将其标记为ESP_OTA_IMG_VALID。该函数执行后无需额外权限即可启动应用。 - 若当前应用出现重大错误导致无法继续操作,则需执行回滚操作:通过调用
esp_ota_mark_app_invalid_rollback_and_reboot()将该应用的状态标记为ESP_OTA_IMG_INVALID并完成重启流程。此外,在引导加载阶段不会选择此应用程序。 - 如果启用了应用回滚功能(即配置选项CONFIG_APP_ROLLBACK_ENABLE已设置),并且在无需任何函数调用的情况下发生重置,则系统会触发并完成相应的回滚过程。
注意:信息项不以应用程序的二进制映像形式存在,而是以数据区段的形式存储。该区段包含一个
ota_seq计数器(oaidx),其用于指示将从ota_0、ota_1等插槽中引导的应用程序。
APP OTA 状态
状态控制选择启动应用程序的过程:
| States | Restriction of selecting a boot app in bootloader |
|---|---|
| ESP_OTA_IMG_VALID | None restriction. Will be selected. |
| ESP_OTA_IMG_UNDEFINED | None restriction. Will be selected. |
| ESP_OTA_IMG_INVALID | Will not be selected. |
| ESP_OTA_IMG_ABORTED | Will not be selected. |
| ESP_OTA_IMG_NEW | If CONFIG_APP_ROLLBACK_ENABLE option is set it will be selected only once. In bootloader the state immediately changes to ESP_OTA_IMG_PENDING_VERIFY. |
| ESP_OTA_IMG_PENDING_VERIFY | If CONFIG_APP_ROLLBACK_ENABLE option is set it will not be selected and the state will change to ESP_OTA_IMG_ABORTED. |
当未启用配置选项 APP_ROLLBACK_ENABLED(默认情况下)时,则可调用以下功能:mark_app_valid_cancel.rollback() 和 mark_app_invalid.rollback.and.reboot(). 必须避免依赖于 .State. 参数.
Kconfig 中的 CONFIG_APP_ROLLBACK_ENABLE 配置项允许您监控新应用的第一步启动过程。在这种情况中,若不进行函数调用,则程序在重启时会回滚;而如果进行了相应的函数调用,则可以避免这种回滚现象的发生。该配置项提供了控制程序启动可操作性的功能;因此,在首次引导后就无法再次启动新的应用。
回滚过程
启用 CONFIG_APP_ROLLBACK_ENABLE 选项时回滚过程的说明:
新安装的应用程序和 esp_ota_set_boot_partition() 函数使得该分区能够引导并设置 ESP_OTA_IMG_NEW 状态。该状态表明应用为新版本,请及时监控首次启动。
执行 esp_restart() 以重启设备。
引导加载程序会检查 ESP_OTA_IMG_PENDING_VERIFY 状态(若已设置),随后写入 ESP_OTA_IMG_ABORTED。
引导加载程序会选择适合引导的应用程序以避免设置为无效或中断状态。
选择的应用程序会检查 ESP_OTA_IMG_NEW 状态(若已设置),随后写入 ESP_OTA_IMG_PENDING_VERIFY 状态以确认其可用性。若无问题且发生重启事件,则状态会被更新为 ESP_OTA_IMG_ABORTED(如上文所述)。
新应用启动前应自行测试。
自检成功后必须执行 esp_ota_mark_app_valid_cancel_rollback() 函数操作。
自检失败需调用 esp_ota_mark_app_invalid_rollback_and_reboot() 执行回滚到上一个工作申请,并将无效应用设为无效状态。
待确认状态下仍保有 ESP_OTA_IMG_PENDING_VERIFY 状态,在下次启动前将更改为中断状态以阻止再次重启该应用,并回滚至前一个工作申请位置。
意外重启
如果在首次启动新应用程序时发生断电或意外崩溃,它将回滚应用程序。
建议:尽快执行自检程序,以防止因断电而导致的回滚。
只能回滚 OTA 分区。工厂分区未回滚。
启动无效/中止的应用程序
在应用环境中的应用能够指导之前设置为 ESP\_OTA\_IMG\_INVALID 或 ESP\_OTA\_IMG\_ABORTED 的状态检查与处理流程。
- 获取最后一条无效的应用程序分区
esp_ota_get_last_invalid_partition()。 - 将接收到的分区传递给
esp_ota_set_boot_partition(),从而更新otadata。 - 重新启动
esp_restart()。这样可以确保引导加载程序随后按照指定的应用程序重新启动。
在启动应用程序期间,应确定是否执行自检.可以通过调用esp_ota_get_state_partition()函数来实现这一目的.若测试返回状态码ESP_OTA_IMG Pend ver,则应执行自检,并随后确认操作可行性.
设置状态
关于状态设置的简要说明:
ESP_OTA_IMG_VALID状态由 esp\_ota\_mark\_app\_valid\_cancel\_rollback() 函数设定。- 当 CONFIG\_APP\_ROLLBACK\_ENABLE 选项未启用时,则 esp\_ota\_set\_bootpartition() 函数将设定 ESP\_OTAIMG_UNDEFINED 状态。
- 当 CONFIG\_APP\_ROLLBACK\_ENABLE 选项启用时,则 esp\_ota\_set\_bootpartition() 函数将设定 ESP\_OTAIMG_NEW 状态。
- ESP_OTAIMG_INVALID 状态由 esp_ota_mark_app_invalid_rollback_and_reboot() \ function 值得注意的是,在某些特定条件下(例如没有确认应用程序可操作性并且重新启动),则会设定 ESP_OTAIMG_ABORTED$ 状态。
- 当 CONFIG_{APP-ROLLBACK-ENABLE} 选项启用且所选应用具有 ESP_{OTAIMG}_{NEW} 状态时,在引导加载程序中将设定为 ESP_{OTAIMG}_{PENDING_VERIFY} 状态。
没有安全启动的安全 OTA 更新
即使未启用了硬件安全引导,则能完成已签名 OTA 更新校验过程。
为此,请访问没有硬件安全启动的签名应用验证
相关资料
应用示例
ESP32 OTA固件更新流程的完整端到端案例: system/ota.
