OTA — обновление прошивки по воздуху
Устройство на ESP32 уже установлено, и подключать его к компьютеру для новой прошивки неудобно. Механизм OTA позволяет программе самой скачать новый образ по сети, записать его в свободный слот флеш-памяти и перезагрузиться в него, сохранив старую версию на случай ошибки.
Обновлено Редакция GAW
OTA (over-the-air update, обновление по воздуху) — механизм обновления прошивки, при котором работающая программа сама получает новый образ по Wi-Fi, Bluetooth или Ethernet, записывает его во флеш-память и перезагружается в него (ESP-IDF, Over The Air Updates). В ESP-IDF для приложения он построен на двух слотах: новый образ пишется в слот, который сейчас не используется, и только после проверки загрузчику указывается загружать его.
Разделы для OTA
| Раздел | Тип / подтип | Назначение |
|---|---|---|
| otadata | data / ota | какой слот загружать; два сектора 0x2000 |
| ota_0, ota_1 | app / ota_0, ota_1 | слоты приложения |
| factory | app / factory | необязательная заводская прошивка |
Если otadata пуст (все байты 0xFF), загрузчик запускает factory, а без него — первый слот ota_0. После первого обновления otadata указывает на слот, из которого грузиться. Разметку задаёт таблица разделов: в стандартном варианте ESP-IDF «Factory app, two OTA definitions» слоты ota_0 и ota_1 по 1 МБ лежат с адресов 0x110000 и 0x210000.
Проверка и откат
С опцией CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE новый образ проходит состояния NEW → PENDING_VERIFY: после первой загрузки программа проверяет себя и вызывает esp_ota_mark_app_valid_cancel_rollback(). Если вместо этого случится перезагрузка или программа вызовет esp_ota_mark_app_invalid_rollback_and_reboot(), загрузчик вернёт предыдущую версию. Защита от отката на старую уязвимую прошивку (anti-rollback) хранит номер secure_version в eFuse; поле 32-битное, поэтому поднять номер можно не больше 32 раз. Подлинность образа проверяют подписью — вместе с безопасной загрузкой или отдельно.
Безопасный и небезопасный режим
Безопасно, с сохранением рабочей копии, обновляется только приложение. Загрузчик, таблица разделов и разделы данных обновляются через временный раздел и копирование, и сбой питания во время копирования может сделать устройство незагружаемым (ESP-IDF, OTA). Здесь описан механизм ESP-IDF для ESP32; ESP8266 тоже обновляют по сети, требования к объёму флеш-памяти для OTA у него приведены на странице ESP8266. Прошивку ESP32 по кабелю через esptool описывает статья «Прошивка ESP32».
Частые вопросы
Что будет, если питание пропадёт во время OTA?
Для приложения ESP-IDF использует безопасный режим: новый образ пишется в слот, который сейчас не выбран для загрузки, а раздел otadata переключается только после проверки образа. Поэтому при обрыве устройство загрузит прежнее приложение. Сам otadata занимает два сектора и пишется по очереди, чтобы пережить сбой при его записи (ESP-IDF, OTA).
Как откатиться, если новая прошивка не работает?
Включить CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE. Тогда новое приложение после первой загрузки находится в состоянии ESP_OTA_IMG_PENDING_VERIFY и должно подтвердить работоспособность вызовом esp_ota_mark_app_valid_cancel_rollback(). Если до перезагрузки этого не произошло, загрузчик помечает образ как ABORTED и запускает предыдущий (ESP-IDF, OTA, App Rollback).
Сколько флеш-памяти нужно для OTA?
Минимум два слота приложения одинакового назначения — ota_0 и ota_1 — плюс раздел otadata на 0x2000 байт. В стандартной таблице ESP-IDF «Factory app, two OTA definitions» это три раздела приложений по 1 МБ (factory, ota_0, ota_1), то есть такой таблице нужна флеш-память не меньше 4 МБ (наш расчёт по адресам: последний слот заканчивается на 0x310000).
Источники
- Espressif. ESP-IDF Programming Guide v6.1: Over The Air Updates (OTA) (ESP32) — OTA — обновление по данным, полученным работающей прошивкой (Wi-Fi, Bluetooth, Ethernet); безопасный режим для приложения: минимум два слота ota_0 и ota_1 и раздел OTA data, запись в слот, не выбранный для загрузки, после проверки otadata указывает новый слот; небезопасный режим для загрузчика, таблицы разделов и разделов данных; otadata — два сектора 0x2000, при расхождении выбирается по счётчику; пустой otadata (0xFF) — загрузка factory или первого слота; откат: esp_ota_mark_app_valid_cancel_rollback() и esp_ota_mark_app_invalid_rollback_and_reboot(), CONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE, состояния NEW → PENDING_VERIFY → VALID или ABORTED; anti-rollback: поле secure_version в eFuse, до 32 раз; проверка подписи без secure boot (CONFIG_SECURE_SIGNED_APPS_NO_SECURE_BOOT)
- Espressif. ESP-IDF Programming Guide v6.1: Partition Tables (ESP32) — таблица «Factory app, two OTA definitions»: otadata 0xd000/0x2000, factory 0x10000, ota_0 0x110000, ota_1 0x210000 по 1 МБ; раздел OTA data должен быть 0x2000 байт; загрузчик выбирает приложение по otadata, при пустом otadata — factory
Нашли ошибку?
Смотрите также
- Таблица разделов ESP32Карта флеш-памяти ESP32: где приложение, NVS, OTA и данные
- ESP8266ESP8266EX: статус, отличия от ESP32, выводы и загрузка, АЦП, сон через GPIO16
- Безопасная загрузкаЗапуск только подписанной прошивки: подпись, ключи в OTP, откат версий
- Загрузчик (bootloader)Прошивка МК без программатора через UART или USB
- Прошивка ESP32Загрузчик ПЗУ, GPIO0 и автосброс, write-flash и адреса, ошибки esptool и питание
- eFuse и OTPОднократно программируемые биты: настройки, ключи, калибровка