Перейти к содержимому

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

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

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

Дело в том, что основой для этого файла служит другой файл, расположенный в “корне” проекта, называется он примерно так: 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:

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

  • Во-первых, каждый раз приходится увеличивать высоту терминала, а после завершения восстанавливать обратно. Недолго, но напрягает.
  • На 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

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

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

  • 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 – если включить эту опцию, устройство перезагрузится при ошибке выделения памяти из кучи. Выделение памяти из кучи должно быть корректно обработано, если этого не сделать – это может привести к непредсказуемым последствиям. В этом случае установка этой опции может помочь. Но если Вы корректно обрабатываете запросы к памяти каждый раз – проблем быть не должно, и это опцию можно деактивировать.

Таймеры

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

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

  1. ESP-IDF :: Project Configuration
  2. Kconfig system

Пожалуйста, оцените статью:
[ 5 из 5, всего 3 оценок ]

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *