Программирование ARM ESP32: ускорение загрузки образа приложения из SPI flash Fri, December 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


ESP32: ускорение загрузки образа приложения из SPI flash Печать
Добавил(а) microsin   

Загрузчик 2-го уровня [1] можно сконфигурировать так, что он при выходе из режима глубокого сна (deep sleep) он не будет проверять целостность загружаемого образа приложения. Это может быть важным в случае, когда время старта приложения критично, и при этом оно занимает в памяти довольно большой объем.

По умолчанию образ приложения в любом случае проверяется на целостность, когда загрузчик получает управление - как после сброса, так и при выходе из режима deep sleep. Например, если приложение занимает пространство порядка 1.5 мегабайта, то время его запуска при любых условиях будет около 600 мс. Это время тратится на считывание данных приложения из текущего раздела SPI flash (обычно ota_0 или ota_1, см. [2]) и проверку его хэша. Если же сконфигурировать пропуск проверки приложения при выходе из deep sleep, то тогда при выходе из глубокого сна время старта уменьшится до 67 мс.

Конфигурируется эта опция в menuconfig приложения [3]. Зайдите в раздел Bootloader config и активируйте опцию "Skip image validation when exiting deep sleep".

menuconfig Skip image validation when exiting deep sleep

После сохранения настроек в файле sdkconfig появится настройка CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y. Она запрещает обычные проверки образа загрузчиком при выходе из deep sleep (проверка контрольных сумм, SHA256, цифровой подписи). Имейте в виду, что это выбор компромисса между скоростью выхода устройства из deep sleep и проверкой целостности загружаемого образа программы. Разрешайте эту опцию только в том случае, если понимаете, что делаете, и это по-настоящему необходимо. Это не следует использовать совместно с использованием входа в deep_sleep() и изменением активного раздела OTA, поскольку это может привести к пропуску проверки целостности раздела при первой загрузке нового OTA-раздела приложения. Эту опцию можно разрешить вместе с Secure Boot [4, 5], если в конфигурации разрешено "allow insecure options", однако настоятельно рекомендуется так не делать, поскольку может привести к пропуску проверок защищенной загрузки Secure Boot (т. е. фактически оставит дыру для взлома устройства).

Замечание: если выполнить полную очистку проекта (например командой idf.py clean или rm -r build), то опция CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP вернется в исходное состояние по умолчанию (т. е. проверка загружаемого образа будет происходить при выходе из глубокого сна). Чтобы сделать отмену проверки постоянной, добавьте в файл sdkconfig.defaults строку CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y:

# Bootloader config
CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP=y

CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC=0x10. Установка опции CONFIG_BOOTLOADER_SKIP_VALIDATE_IN_DEEP_SLEEP приведет к тому, что в sdkconfig автоматически установится и опция CONFIG_BOOTLOADER_CUSTOM_RESERVE_RTC. Она резервирует 16 байт (0x10) памяти RTC FAST (к которой имеет доступ только ядро PRO_CPU), они будут использоваться для сохранения адреса выбранного приложения. Когда происходит пробуждение микроконтроллера (выход из deep sleep), загрузчик возьмет этот адрес и загрузит соответствующее приложение без проверки.

Skip image validation from power on reset. Некоторым приложениям требуется очень быстрая загрузка при включении питания или сбросе. По умолчанию бинарник образа приложения считывается из SPI flash и при этом проверяется на целостность, на что тратится значительное время. Разрешение этой опции пропустит эту проверку, когда SoC загружается при подаче питания/сбросе. Обратите внимание, то в этом случае загрузчик не сможет проверить, поврежден ли загружаемый им образ из flash, и таким образом нельзя безопасно сделать откат на другой раздел приложения (ota_0, ota_1 или factory [2]). Такого рода повреждение содержимого flash вообще маловероятно, однако может произойти из-за серьезного бага в firmware, или в результате физического повреждения (которые включают случаи взлома устройства). Для других типов сброса (не относящихся к включению питания) загрузчик все еще будет проверять образ приложения. Это повышает шансы, что повреждение flash, приведшее к сбою, может быть обнаружено после программного сброса (например при выходе из deep sleep), и загрузчик выполнит откат на другой, не поврежденный образ приложения. Чтобы повысить шансы успешного восстановления из ситуации повреждения flash, сохраняйте разрешенной опцию BOOTLOADER_WDT_ENABLE и убедитесь, что также разрешена опция BOOTLOADER_WDT_DISABLE_IN_USER_CODE - тогда вручную запретите RTC Watchdog как только запустится приложение. Дополнительно разрешите обе опции сторожевых таймеров задач и прерываний со сбросом (Task and Interrupt watchdog timers with reset).

Skip image validation always. Разрешение этой опции приведет к тому, что никогда загрузчик не сможет проверить загружаемый образ перед его запуском. В результате любое повреждение flash выбранного раздела приложения может привести к тому, что устройство станет полностью неработоспособным ("окирпичится"). Хотя повреждение flash встречается очень редко, разрешать эту опцию не рекомендуется, и её следует устанавливать только тогда, когда время старта приложения очень критично. Вместо этого рассмотрите вариант установки опции "Skip image validation from power on reset".

[Ссылки]

1. ESP32: процесс запуска приложения.
2. ESP32: таблицы разделов.
3. Конфигурация проекта ESP-IDF.
4. ESP32 Secure Boot V1.
5. ESP32 Secure Boot V2.

 

Добавить комментарий


Защитный код
Обновить

Top of Page