Найти в Дзене
K12 :: О ESP32 и не только

Настройка ESP-IDF проекта

Оглавление

Добрый день, уважаемый читатель! Продолжаем тему ESP-IDF, сегодня обсудим конфигурирование собственно самой Espressiff IoT Development Framework.

Делается это с помощью специального файла sdkconfig.h, в котором объявлено великое множество макросов препроцессора с различными настройками. Этот файл можно найти в каталоге /.pio/config и он доступен из любого файла ESP-IDF, и с помощью него можно, например, "включать" или "отключать" некоторые функции. Или изменять их поведение. Выглядит он примерно так:

sdkconfig.h
sdkconfig.h

Но, открыв этот файл в редакторе, мы сразу же видим предупреждение, что это "Автоматически сгенерированный файл. НЕ РЕДАКТИРОВАТЬ". Всё правильно, редактировать его вручную бесполезно - всё равно все ваши изменения затрутся при следующей компиляции. То есть для нас он совершенно бесполезен.

Дело в том, что основой для этого файла служит другой файл, расположенный в "корне" проекта, называется он примерно так: sdkconfig.esp32dev, то есть расширением является целевая плата.

sdkconfig.esp32dev
sdkconfig.esp32dev

Но и здесь мы можем увидеть то же самое предупреждение - не редактировать.

По своему опыту могу сказать, что этот файл можно редактировать вручную, если нужно, но делать это нужно очень осторожно. Или например можно скопировать этот файл из другого проекта - и все настройки ESP-IDF будут перенесены.

Меню конфигурации проекта

Существует другой способ конфигурирования ESP-IDF - с помощью команды menuconfig. Если обратиться к справочной системе (кстати, рекомендую ознакомится), для вызова меню конфигурации проекта необходимо выполнить команду: idf.py menuconfig. Прямо из командной строки. Но, увы, в PlatformIO это не работает - вместо меню вы получите ошибку что-то вроде ""idf.py" не является внутренней или внешней командой, исполняемой программой или пакетным файлом."

В PlatformIO для вызова меню конфигурации (да и вообще любых команд, связанных с idf.py) существует своя: pio run -t menuconfig. То есть pio run -t вызывает тот самый idf.py неявным образом.

Можно попытаться сделать это прямо в терминале VSCode:

Вызов menuconfig из встроенного терминала VS Code
Вызов menuconfig из встроенного терминала VS Code

Но делать это неудобно, по двум причинам:

  • Во-первых, каждый раз приходится увеличивать высоту терминала, а после завершения восстанавливать обратно. Недолго, но напрягает.
  • На Windows 10 в терминале VSCode для навигации не работают клавиши со стрелками, увы, и приходится вместо них использовать клавиши J и K, постоянно путаешься.

Поэтому я рекомендую делать это по другому - через командную строку. Нажимаем клавиши Win+R, в открывшемся окошке вводим cmd (не спешите вводить pio run) и нажимаем Enter. Открывается черное окно терминала. Не спешим набирать команду, вначале нам нужно перейти в каталог проекта, например с помощью системной команды chdir, и только после этого набираем тайное заклинание:

Вызов меню конфигурации проекта через командную строку
Вызов меню конфигурации проекта через командную строку

Жмем Enter, и через несколько десятков секунд попадаем в заветное меню:

Меню конфигурации проекта
Меню конфигурации проекта

Теперь давайте разберем каждый из разделов более подробно.

Опций очень много, большинство из них я не изменял, да и не знаю их назначения. Я приведу только те опции, которые я использую сам, и в назначении которых я сумел разобраться на текущий момент. Если Вы используете другие и знаете их назначение - прошу в комментарии.

Итак.

SDK tool configuration

Тут по сути, ничего менять не требуется, сразу пропускаем

Build type

Здесь вы можете выбрать тип вашего приложения: bin-приложение с отдельным загрузчиком либо elf-файл, загружаемый в RAM. Я никогда не трогал, на ваш страх и риск.

Application manager

Тоже ничего менять не требуется, пропускаем

Bootloader config

Опции загрузчика. А вот здесь остановимся поподробнее.

  • Bootloader log verbosity - здесь лучше отключить понизить уровень отладки для загрузчика до уровня ERROR. На загрузчик все равно мы никак повлиять не можем, а размер загрузчика немного снизится.
  • Enable app rollback support - если в дальнейшем вы будете использовать OTA (обновления по воздуху / обновления через WiFi), то я настоятельно рекомендую включить эту опцию сразу же. Эта опция позволяет задействовать механизм автоматического отката неудачной прошивки, когда при OTA что-то пошло не так, и устройство не смогло нормально загрузиться. "Потом" через OTA включить её не получится, так как при OTA сам загрузчик не обновляется, придется подключать устройство кабелем.
  • Bootloader optimization Level - рекомендую поставить уровень Size. Загрузчик используется один раз при старте, нет смысла оптимизировать его другими способами.

Остальные опции лучше не трогать, чтобы чего-нибудь не сломать случайно.

Security features

Опции безопасной загрузки. Я не использую, no comments.

Serial flasher config

Здесь находятся опции UART-порта и Flash-памяти. Здесь можно выбрать тип памяти (QIO / DIO), частоту SPI шины и ее размер. Параметры по умолчанию оптимальные, ничего менять не требуется.

Здесь же можно изменить скорость передачи текстовых логов в режиме монитора порта, по умолчанию 115200 бод, если это необходимо. Только не забудьте потом поменять настройки в platformio.ini

Partition Table

В этом меню вы можете выбрать свою таблицу разделов Flash-памяти. Об этом мы поговорим в другой раз, а пока пропускаем.

Compiler options

Опции компилятора. Здесь можно попробовать изменить уровень оптимизации компилятора или включить исключения. На ваш страх и риск.

Compatibility options

Да, да, я пока "перескочил" через одну строчку, оставим её на "вкусное". Здесь же можно включить режим совместимости с предыдущими версиями ESP-IDF. Я не использую.

Component config

Основной и самый большой раздел. Отвечает за различные подсистемы и сервисы.

Component config
Component config
Чтобы не перегружать статью, я отмечу только те пункты, которыми я пользуюсь.
  • Log output → Default log verbosity - выберите уровень отладки "по умолчанию" для библиотеки esp_log.h

Системные настройки

  • ESP32-specific → CPU frequency - здесь вы можете выбрать частоту процессора 80 / 160 / 240 MHz. Всё как обычно - больше частота, больше производительность, но и больше потребление электроэнергии. Выбирайте то, что вам важнее в данный момент. По умолчанию 160, достаточно в большинстве случаев.
  • ESP32-specific → Support for external, SPI-connected RAM - если вы используете модуль WROVER, то в этом меню можно подключить внешнюю QSPI оперативную память.
  • ESP System Settings → Main task stack size - размер стека для главной задачи. Если вы используете app_main() только для запуска других задач, что вполне достаточно 2048. Если в app_main() у вас будет выполняться какая-то прикладная работа, подберите оптимальный размер самостоятельно.
  • ESP System Settings → Event loop task stack size - размер стека для цикла событий. Я увеличил размер стека до 3072, как как из цикла событий могут вызываться различные процедуры и функции. Что такое цикл событий, поговорим позже.
  • FreeRTOS → Enable FreeRTOS trace facility - включение этой опции позволяет включить функции для отладки списка задач. Полезно на начальном этапе разработки, чтобы подобрать оптимальный размер стека.
  • Heap memory debugging → Abort if memory allocation fails - если включить эту опцию, устройство перезагрузится при ошибке выделения памяти из кучи. Выделение памяти из кучи должно быть корректно обработано, если этого не сделать - это может привести к непредсказуемым последствиям. В этом случае установка этой опции может помочь. Но если Вы корректно обрабатываете запросы к памяти каждый раз - проблем быть не должно, и это опцию можно деактивировать.

Таймеры

  • High resolution timer (esp_timer) → High-resolution timer task stack size - здесь можно настроить размер стека для задачи, из которой выполняются программные таймеры. Пока только отметим, что такой пункт имеется, про программные таймеры поговорим позже.
  • High resolution timer (esp_timer) → Hardware timer to use for esp_timer - здесь вы можете выбрать, какой из аппаратных таймеров будет использоваться для программных

WiFi и сетевые службы

  • Wi-Fi → WiFi Task Core ID - выбираем, на каком ядре будет выполняться задача WiFi. Я использую 0
  • LWIP → Local netif hostname - сетевое имя устройства, которое вы увидите на роутере в списке подключенных устройств. Не должно быть длиннее 15 символов
  • LWIP → SNTP → Maximum number of NTP servers – я ставлю 5, и указываю 5 разных серверов. ESP сама выберет нужный
  • mbedTLS → Memory allocation strategy - если вы используете WROVER с дополнительной памятью, здесь вы можете выбрать, где mbedTLS будет размещать свои данные
  • mbedTLS → Using dynamic TX/RX buffer - позволяет включить динамическое выделение памяти под mbedTLS буферы при каждом TLS-рукопожатии. Включение этой опции позволяет значительно сэкономить кучу, но может привести к её фрагментации при некоторых условиях.
  • mbedTLS → Certificate Bundle → Enable trusted root certificate bundle - если вам неохота возиться с подключением TLS-сертификатов к проекту, вы можете подключить сразу весь общедоступный пакет. Но памяти сожрет немеряно. Впрочем, есть опции, поговорим о них отдельно
  • ESP-MQTT Configurations - настройки MQTT клиента. Посмотрите на настройки самостоятельно, ничего сложного там нет, если знакомы с MQTT протоколом. Впрочем, это тоже обсудим позднее

Что интересно, я нигде не нашел параметра, отвечающего за размер стека WiFi службы. Ну ладно, не очень-то и хотелось.

Подробную информацию обо всех доступных опциях вы можете почерпнуть из справочной информации: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html

После того, как вы внесли какие-то изменения в конфигурацию, не забудьте сохранить её, нажав клавишу S.

Если у вас несколько похожих проектов, не обязательно выполнять одинаковые настройки для каждого из них отдельно. Вполне можно обойтись копированием файла sdkconfig.esp32dev (или аналогичного, который находится в корне проекта)

После изменения конфигурации sdkconfig PlatformIO скомпилирует все системные библиотеки заново, что занимает довольно продолжительное время. Именно по этой причине я не люблю добавлять пользовательские опции в "общий" файл конфигурации, ибо это сильно замедляет работу над проектом. Но такая возможность есть, давайте рассмотрим, как это сделать.

Пользовательские опции

SDK Config позволяет добавлять пользовательские опции в общее меню конфигурации проекта. То есть вы можете определять какие-либо произвольные опции и настройки и добавлять их в общее меню, чтобы создать единую систему настроек проекта. Очень часто этим пользуются разработчики сторонних библиотеках.

Для того, чтобы добавить свое меню в sdkconfig, вы должны создать текстовый UTF-8 файл с именем Kconfig.projbuild и поместить его в папку src проекта. Содержимое файла должно иметь примерно такую структуру:

menu "НАЗВАНИЕ МЕНЮ"
config ПАРАМЕТР
bool "Подсказка к параметру"
depends on ЗАВИСИМОСТИ_ОТ_ДРУГОГО_МОДУЛЯ
help
Здесь вы можете написать краткую справку к параметру
endmenu

Разумеется, параметров может быть любое количество, а также можно сделать многоуровневое меню.

Например, я в качестве примера сделал такой файл:

Пример файла Kconfig.projbuild
Пример файла Kconfig.projbuild

В результате в меню конфигурации появилось новое подменю с 2 уровнями вложенности:

Пользовательское меню
Пользовательское меню
Пользовательское меню
Пользовательское меню

Таким образом, вы можете добавить в общую систему параметров любые необходимые опции. Пример можно посмотреть по ссылке.

Я практически не пользовался таким способом добавления "своих" опций, поэтому я не владею этим в совершенстве.
Более подробную информацию о файла kconfig вы можете почерпнуть здесь https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/kconfig.html#project-configuration-menu или здесь: https://www.kernel.org/doc/Documentation/kbuild/kconfig-language.txt

Полезные ссылки

_______________

На этом пока всё, до встречи на сайте и на dzen-канале!

👍 Понравилась статья? Поддержите канал лайком или комментарием! Каналы на Дзене "живут" только за счет ваших лайков.

📌Подпишитесь на канал и вы всегда будете в курсе новых статей.

🔶 Полный архив статей вы найдете здесь

Благодарю за вашу поддержку! 🙏