接前一篇文章:ESP32-C3模组上跑通OTA升级(8)
本文内容参考:
《ESP32-C3 物联网工程开发实战》 乐鑫科技
特此致谢!
七、固件版本
将不同功能的固件标记为不同版本是方便后期维护的一个重要手段。ESP-IDF提供了一些标记字段,可用于标记版本信息,这些字段与回滚/放回滚功能搭配使用,可满足大部分版本管控的需求。
2. 回滚与防回滚功能
应用程序回滚的主要目的是:确保设备在更新后一旦发生异常,能够及时回退到上一个版本,不影响设备的正常使用。在启用回滚功能时,当校验固件完成后,此固件将被标记为新固件(ESP_OTA_IMG_MEW)。在重启时,Bootloader将选择该固件并将其重新标记为待校验(ESP_OTA_IMG_PENDING_VERIFY)。在运行app_main函数时,可能出现以下两种情况:
(1)应用程序运行正常
开发者自测确定功能一切正常,由开发者调用esp_ota_mark_app_valid_cancel_rollback(),将正在运行的固件状态标记为有效固件(ESP_OTA_IMG_VALID),该固件随后便可无限制启动。
在advanced_https_ota项目中,此部分代码如下:
#if defined(CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE)
/**
* We are treating successful WiFi connection as a checkpoint to cancel rollback
* process and mark newly updated firmware image as active. For production cases,
* please tune the checkpoint behavior per end application requirement.
*/
const esp_partition_t *running = esp_ota_get_running_partition();
esp_ota_img_states_t ota_state;
if (esp_ota_get_state_partition(running, &ota_state) == ESP_OK) {
if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) {
if (esp_ota_mark_app_valid_cancel_rollback() == ESP_OK) {
ESP_LOGI(TAG, "App is valid, rollback cancelled successfully");
} else {
ESP_LOGE(TAG, "Failed to cancel rollback");
}
}
}
#endif
(2)应用程序出现严重错误
这里边又分为两种情况:
- 因为异常导致自动二次重启
这种情况Bootloader会直接将该固件标记为异常固件(ESP_OTA_IMG_ABORTED),并回滚到上一版本。
这种情况由Bootloader自动完成,无需开发者参与。
- 开发者自测确定功能存在异常
这种情况下,由开发者调用esp_ota_mark_app_invalid_rollback_and_reboot(),将正在运行的版本标记为无效固件(ESP_OTA_IMG_INVALID),并自动重启回滚到上一版本,该固件随后便无法再启动。
安全版本号的另一作用是防止固件回滚到更低的安全版本号。在Bootloader选择可启动的应用程序时,会额外检查安全版本号,只有固件的安全版本号等于或高于芯片eFuse中存储的安全版本号,此固件才会被选择。新的安全版本号将在固件状态被标记为有效固件(ESP_OTA_IMG_VALID)后被更新。
回滚与防回滚功能都可以通过menuconfig启用,启用方式如下: