Добрый день, уважаемый читатель!
В данной статье обсудим конфигурирование проекта для ESP32, собранного на базе Espressiff IoT Development Framework.
Примечание: конфигурация проектов, созданных на базе Arduino Framework for ESP32 (то есть либо в Arduino IDE, либо в PlatformIO, но с использованием Arduino платформы), не может быть изменена пользователем – по крайней мере способом, описанным в данной статье. Платформа Arduino для ESP32 имеет файл конфигурации, настроенный производителем, и влиять не него вы не можете. И это одна из главных причин, почему не стоит писать серьезный код под Arduino на ESP32.
Конфигуратор проектов ESP-IDF (Espressiff IoT Development Framework) – мощный инструмент, который позволяет изменить великое множество параметров ESP-IDF. Делается это с помощью специального файла sdkconfig.h
, в котором объявлено множество макросов препроцессора, содержащих различныt настройки, опции и параметры. Этот файл можно найти в каталоге /.pio/config
и он доступен из любого файла ESP-IDF. С помощью указанного файла можно, например, “включать” или “отключать” некоторые функции или целые API. Или изменять их поведение. Выглядит он примерно так:
Но, открыв этот файл в редакторе, мы сразу же видим предупреждение, что это “Автоматически сгенерированный файл. НЕ РЕДАКТИРОВАТЬ“. Всё правильно, редактировать его вручную бесполезно – всё равно все ваши изменения затрутся при следующей компиляции. То есть для нас он совершенно бесполезен.
Дело в том, что sdkconfig.h
– это уже “компилированный” файл, а “исходниками” для него служит другой файл, расположенный в “корне” проекта, называется он примерно так: sdkconfig.esp32dev
, то есть расширением является целевая плата.
Но и здесь мы можем увидеть то же самое предупреждение – не редактировать. Как же все-таки менять конфигурацию проекта?
По своему опыту могу сказать, что этот файл все-таки можно редактировать вручную, если нужно, но делать это нужно осторожно, дабы не сломать. Например можно скопировать этот файл из предыдущего проекта – и все настройки ESP-IDF будут перенесены в новый проект.
Меню конфигурации проекта
Основной способ конфигурирования ESP-IDF – с помощью команды menuconfig. Если обратиться к справочной системе (кстати, рекомендую ознакомится), для вызова меню конфигурации проекта необходимо выполнить команду: idf.py menuconfig
. Прямо из командной строки или терминала IDE. Но, увы, в терминале PlatformIO это не работает – вместо меню вы получите ошибку что-то вроде ““idf.py” не является внутренней или внешней командой, исполняемой программой или пакетным файлом.“
В PlatformIO для вызова меню конфигурации (да и вообще любых команд, связанных с idf.py) существует своя: pio run -t menuconfig
. То есть pio run -t
вызывает тот самый idf.py неявным образом.
Можно попытаться сделать это прямо в терминале VSCode:
Но делать это неудобно, по двум причинам:
- Во-первых, каждый раз приходится увеличивать высоту терминала, а после завершения восстанавливать обратно. Недолго, но напрягает.
- На Windows 10 в терминале VSCode для навигации не работают клавиши со стрелками, увы, и приходится вместо них использовать клавиши J и K, постоянно путаешься.
Поэтому я рекомендую делать это по другому – через командную строку. Нажимаем клавиши Win+R
, в открывшемся окошке вводим cmd
(не спешите вводить pio run) и нажимаем Enter. Открывается черное окно терминала. Не спешим набирать команду, вначале нам нужно перейти в каталог проекта, например с помощью системной команды chdir
, и только после этого набираем тайное заклинание:
Жмем Enter, и через несколько десятков секунд попадаем в заветное меню:
Теперь давайте разберем каждый из разделов более подробно.
Опций ESP-IDF очень и очень много, почти для всех подсистем и API. Большинство из них я не изменял, да это и не требуется. Я приведу только те опции, которые я использую сам. Некоторые опции могут устареть или “переехать” в другой раздел со временем.
Итак.
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
Основной и самый большой раздел. Отвечает за различные подсистемы и сервисы.
Чтобы не перегружать статью, я отмечу только те пункты, которыми я пользуюсь.
- 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 разных SNTP-серверов. 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
Разумеется, параметров может быть любое количество, а также можно сделать многоуровневое меню. Например, я в качестве примера сделал такой файл:
В результате в меню конфигурации появилось новое подменю с 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
Полезные ссылки
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью: