如何有效使用ESP32的RollBack功能?

时间:2019-04-12 05:09:02

标签: freertos ota esp32

当我理解回退功能后,我应该启用回退功能,并且一旦启用APP_ROLLBACK_ENABLE功能,该应用程序便应进入诊断模式,但我的应用程序并未进入诊断状态。在代码中提到了状态:

从这里可以看出,我的状态应该不是ESP_VERIFY

esp_partition_get_sha256(esp_ota_get_running_partition(), sha_256);
print_sha256(sha_256, "SHA-256 for current firmware: ");

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) {
    ESP_LOGI(TAG, "Get State Partition was Successfull");
        if (ota_state == ESP_OTA_IMG_PENDING_VERIFY) {
        // run diagnostic function ...
        bool diagnostic_is_ok = true;
        if (diagnostic_is_ok) {
            ESP_LOGI(TAG, "Diagnostics completed successfully! Continuing execution ...");
            esp_ota_mark_app_valid_cancel_rollback();
        } else {
            ESP_LOGE(TAG, "Diagnostics failed! Start rollback to the previous version ...");
            esp_ota_mark_app_invalid_rollback_and_reboot();
        }
    }
}

预期:应进行应用诊断 实际:应用诊断代码未获得状态:ESP_OTA_IMG_PENDING_VERIFY

1 个答案:

答案 0 :(得分:1)

首次下载固件时,OTADATA将被删除。在引导加载程序中,它设置为正确的ota_seq和ESP_OTA_IMG_VALID状态。这意味着在一个应用程序中,诊断代码不会检查您的代码,因为您只有一个可启动的应用程序,并且无法回滚。

在OTA之后,您的应用程序具有ESP_OTA_IMG_PENDING_VERIFY状态,并且只有在首次引导时才应执行此部分代码。此状态将esp_ota_mark_app_valid_cancel_rollback()函数更改为ESP_OTA_IMG_VALID。