Добрый день, уважаемый читатель!
Давно не следил за новыми версиями Espressif32 и ESP-IDF, но сегодня то-то навеяло, видимо. Вроде бы недавно обновился до ESP-IDF 4.4.3, а сегодня опять обновление “прилетело”. ?
На этот раз уж как прилетело, так прилетело – версия Espressif32 6.0.1, которая содержит в себе ESP-IDF 5.0.0.
Никогда такого не было, и вот опять!
Насколько я знаю, разработчики PlatformIO обычно придерживаются стратегии, когда в новую версию платформы Espressif32 подпадают только стабильные релизы. Значит пришло время…
И понеслось… Вагон и маленькая тележка ошибок при компиляции.
Часть проблем, конечно, моих рук дело – то есть я сам когда-то заложил проблемы в коде, но до сих пор почему-то работало ?. Ну да с такими проблемами ладно – сами разберемся… Обсуждать здесь такие проблемки не буду, просто постараюсь исправить в ближайшее время и обновить библиотеки на GitHub-е.
Но часть проблем связана просто с тем, что разработчики ESP-IDF что-то поменяли внутри самой платформы. И теперь придется привыкать “жить по новому”. Вот я их здесь и перечислю, вдруг кому-то пригодится.
Особенности версии
Приведу краткое описание новой версии из официальной документации по выпуску
- Предварительно зашифрованное распространение прошивки во время обновлений OTA
- Более надежная схема безопасности (на основе SRP6a+AES-GCM) в компоненте обеспечения WiFi
- Интеграция стека mbedTLS-3.x (3.2.1)
- Поддержка схемы безопасной загрузки v2 на основе ECDSA для ESP32-C2.
- Включено ядро SMP FreeRTOS (исходная версия AWS)
- Дополнительные функции Wi-Fi:802.11r (быстрый переход BSS)
Поддержка PMF для softAP
Поддержка регистратора WPS в softAP
Поддержка WPA3 OWE для станции
Поддержка WPA3 SAE H2E для станции
Теперь о проблемах, с которыми пришлось столкнуться после обновления….
Не забудьте выполнить PlatformIO: Clean
Сразу после обновления не забудьте выполнить команду PlatformIO: Clean – это удалить все ранее скомпилированные файлы из папки проекта. Иначе будет ещё большая куча маловразумительных ошибок.
Многие функции теперь не доступны без явного #include соответствующего модуля
Многие функции и объявления типов, которые казались ранее системными, теперь не доступны без явного #include модуля, в котором они объявлены. Это, например, касается функции ets_timeout_us(), для доступа к которой теперь требуется #include “rom/ets_sys.h” (а в прежних версиях всё работало “и так”).
Поэтому если вы столкнулись с проблемой, когда компилятор что-то там не находит – воспользуйтесь поиском пор содержимому фреймфорка, скорее всего нужно просто добавить воды #include.
ADC полностью переписан
Полностью изменили механизм работы с ADC (АЦП), везде и всюду – и в измерениях, и в калибровке. Теперь доступны два режима изменения – oneshot и сontinuous. Первый вариант в целом равнозначен прежнему режиму. Во втором случае под результаты изменений создается буфер для фильтрации, дальше я пока не разбирался, так как без надобности.
Код работы с АЦП придется переделывать полностью. К сожалению, справка по новым функциям написана “на отвали” и почти ничего не понятно. Но хотя бы есть примеры кода.
Получается, что хорошо, что статья по ADC до сих пор в черновиках, иначе переписывать всю пришлось бы, а не часть, как сейчас
Modbus вынесен в отдельный репозиторий
Ещё одним сюрпризом стало удаление протокола Modbus из ESP-IDF. Шта???!!! Посчитали ненужным и выпилили из проекта. Вынесли в отдельный репозиторий, который теперь просто не компилируется!
Подключить через platformio.ini не получилось – библиотека скачивается, но не компилируется. Решение оказалось достаточно простым:
portTICK_RATE_MS исключён
Если вы использовали макрос portTICK_RATE_MS для пересчета миллисекунд в тики RTOS, то знайте, что его больше нет. Используйте вместо него другие макросы – portTICK_PERIOD_MS или pdMS_TO_TICKS(time_in_ms)
Добавили функцию sys_delay_ms()
Наконец-то добавили аналог ардуиновского delay(): это самый обычный vTaskDelay(ms / portTICK_PERIOD_MS), но пользоваться удобно.
Замены устаревших типов
Вообще, замененных типов и макросов в ESP-IDF 5.0.0 довольно много:
- eTaskStateGet -> eTaskGetState
- portTickType -> TickType_t
- xTaskHandle -> TaskHandle_t
- xQueueHandle -> QueueHandle_t
- xSemaphoreHandle -> SemaphoreHandle_t
- xQueueSetHandle -> QueueSetHandle_t
- xQueueSetMemberHandle -> QueueSetMemberHandle_t
- xTimeOutType -> TimeOut_t
- xMemoryRegion -> MemoryRegion_t
- xTaskParameters -> TaskParameters_t
- xTaskStatusType -> TaskStatus_t
- xTimerHandle -> TimerHandle_t
- xCoRoutineHandle -> CoRoutineHandle_t
- pdTASK_HOOK_CODE -> TaskHookFunction_t
- portTICK_RATE_MS -> portTICK_PERIOD_MS
- pcTaskGetTaskName -> pcTaskGetName
- pcTimerGetTimerName -> pcTimerGetName
- pcQueueGetQueueName ->pcQueueGetName
- vTaskGetTaskInfo -> vTaskGetInfo
- xTaskGetIdleRunTimeCounter -> ulTaskGetIdleRunTimeCounter
- tmrTIMER_CALLBACK -> TimerCallbackFunction_t
- pdTASK_CODE -> TaskFunction_t
- xListItem -> ListItem_t
- xList -> List_t
- pxContainer -> pvContainer
gpio_pad_select_gpio() больше не доступен
Функция gpio_pad_select_gpio() обычно использовалась во всех демо-проектах для инициализации GPIO и перевода его в режим ввода-вывода. Теперь придется окончательно переходить на gpio_reset_pin().
Модуль “soc/cpu.h” изменен на “esp_cpu_utils.h”
Этот модуль у меня используется для перехвата стека при различных сбоях и исключениях.
MQTT клиент теперь настраивается совсем по другому
Параметров стало больше и теперь они сгруппированы в разделы:
- broker – параметры брокера, в свою очередь теперь делится на блоки address и verification
- credentials – параметры авторизации, то есть логин, пароль и всё что с этим связано
- session – параметры сессии: протокол, чистая сессия, keepalive, LWT и т.д.
- network – конфигурация сети (в основном таймауты)
- task – приоритет и размер стека для задачи
- buffer – размеры буферов для отправки и приема
То есть “старые” параметры “переехали” в другие разделы, например:
- Был host -> стал broker.address.hostname
- Был port -> стал broker.address.port
Ну и появились новые параметры, так что если вы пользовались встроенным MQTT клиентом, рекомендую ознакомится с документацией.
HTTPS OTA теперь тоже инициализируется немного по другому
Для “обновлений по воздуху” добавили несколько параметров, и теперь конфигурирование OTA приходится выполнять за два этапа – вначале необходимо настроить esp_http_client_config_t (как и раньше), а затем прицепить его к esp_https_ota_config_t, который уже можно передать в esp_https_ota():
Но это не так страшно, как с MQTT клиентом – там почти всю конфигурацию перелопачивать пришлось.
На этом в моих проектах проблемы с переходом закончились. А у вас?
В ближайшее время протестирую работу новой версии и выложу обновленные библиотеки для проекта термостат
Официальную документацию о выпуске можно посмотреть здесь на английском
На этом пока всё, до встречи на сайте и на dzen-канале!
💠 Полный архив статей вы найдете здесь
Пожалуйста, оцените статью:
-= Каталог статей (по разделам) =- -= Архив статей (подряд) =-