
299
Включаем функции сбора статистики в ESP32-arduino
Дополненная версия статьи на habr.
Основная проблема в том, что в исходной собранной библиотеке arduino-esp32 функции сбора статистики (vTaskGetRunTimeStats
/ vTaskList
) отключены. Библиотека используется как есть в Platformio, ссылки на гайды по сборке своих библиотек устарели (404), а актуальных доступных всем инструкций просто нет. К тому же issues по добавлению этих функций также не рассматривают, т.к. они связаны с использованием сторонней библиотеки.
Чтобы добавить эти функции - нужно пересобрать библиотеку с измененными параметрами. В качестве OS используем Ubuntu (windows - пользователи могут поднять виртуалку в WSL).
Esp32 arduino lib builder
Инструкция установке билдера и сборке есть на официальном сайте. Устанавливаем зависимости:
Можно дальше по инструкции клонировать репозиторий и запустить сборку. Чтобы вы понимали - скачивание всех зависимостей и сборка занимают примерно час.
А потом результаты сборки можете ... выкинуть, потому что версии самого билдера и всех используемых библиотек отличаются и использовать их в Platformio не получится.
Нам нужны конкретные версии конкретных пакетов, билдер из коробки такой возможности не предоставляет, поэтому придется ему помочь. Актуальные версии пакетов, которые используются в Platformio, можно посмотреть в ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/version.txt
, у меня файл выглядит так:
esp-idf: v4.4.7 38eeba213a
arduino: idf-38eeba213a d75795f5
esp-dl: master 0632d24
esp-rainmaker: master d8e9345
esp32-camera: master f0bb429
esp_littlefs: master 41873c2
espressif__esp-dsp: master 9b4a8b4
tinyusb: master a0e5626bc
Каким-то чудом по хешу коммита версии одной из библиотек в Platformio удалось найти статью на японском (!), которая описывает, что действительно нужно сделать для пересборки библиотеки. Билдер мы ставили не зря, но вот дальше начинаются приключения - каждую из этих библиотек придется установить вручную.
Для начала все же клонируем билдер и переключим версию:
Далее необходимо зафиксировать каждую версию библиотеки, поэтому нужно закомментировать в билдере автоматическое обновление компонентов (build.sh:84
):
Теперь придется вручную загрузить все компоненты, включая ESP-IDF и ядро Arduino для ESP32 .
TLDR установка всех зависимостей в одну команду:
Ниже разбивка по библиотекам и командам.
esp-idf
arduino-esp32
esp32-camera
esp-dl
esp_littlefs
esp-rainmaker
espressif__esp-dsp
tinyusb
Сборка
Теперь можем запустить сборку для esp32 (если у вас другая ревизия платы - указывайте её):
Сборка занимает продолжительное время, если по итогe создан каталог с именем «out» - операция прошла успешно.
Sdkconfig
Если хотите, можете посмотреть текущие настройки sdkconfig:
Можно использовать menuconfig
только для просмотра настроек сборки, редактировать здесь настройки не выйдет.
Нужная мне опция находятся в Component config ---> FreeRTOS ---> Enable FreeRTOS to collect run time stats. Как видим, по умолчанию флаг сброшен:
Нужно внести изменения относительно стандартного sdkconfig. Для esp32 нужно отредактировать configs/defconfig.esp32
.
Для esp32c2 и esp32c3 результирующее имя файла — defconfig.esp32c2
и defconfig.esp32c3
соответственно (рядом можете найти и другие ревизии).
Я добавил последнюю строку для включения функций сбора статистики. Все прочие уже были в файле.
Собираем все заново:
После завершения сборки заново проверяем конфиг сборки (каждый раз нужно экспортировать заново):
Если нужный флаг установлен - мы все сделали правильно.
Platformio
Осталось дело за малым, скопировать нашу библиотеку в Platformio.
Предварительно соxраняем исходную библиотеку и копируем собранную в Platformio:
Можно переходить в Platformio и попробовать собрать прошивку, функции должны быть доступны.
Вот такой минимальный код можно использовать для проверки:
Каждые 5 секунд в консоль выводится статистика по загрузке CPU каждой задачей, а также список задач:
============ Task Stats ============
Run Time Stats:
Log 11614 <1%
IDLE0 20176378 97%
IDLE1 20618561 99%
loopTask 1060 <1%
esp_timer 24 <1%
Tmr Svc 22 <1%
ipc1 47571 <1%
ipc0 32460 <1%
Task List:
Log X 1 624 10
IDLE0 R 0 552 5
IDLE1 R 0 548 6
loopTask B 1 7292 8
Tmr Svc B 1 1584 7
ipc1 B 24 484 2
ipc0 B 24 508 1
esp_timer S 22 4096 3
=====================================
Вот таким замысловатым способом вы можете менять параметры библиотеки esp32-arduino для использования в Platformio.
Список параметров значительно шире, чем включение функций получения статистики, жаль что IDE не предоставляют более удобный способ конфигурирования основных библиотек.
В решении этой задачи никакие ИИ-модели, к сожалению, не помогли, хотя я довольно упорно пытался заставить o1, sonnet 3.5 и o3-mini мне помочь. Старый добрый гугл, копание в архиве форумов и единственная статья по теме на японском (не перестаю удивляться этому факту) - все еще вполне рабочий пайплайн.
По крайней мере сейчас, по крайней мере для эмбеддинга.
Послесловие
Зачем вообще может понадобиться этот сбор статистики?
- Если вы хотите оптимизировать прошивку / быстродействие системы.
- Если вы хотите сравнить различные решения.
- Просто если интересно разобраться, как работают те или иные функции.
Изначально я собирался написать бенчмарк для esp32-cam (и пока окончательно от этого плана не отказался), где будут сравниваться различные протоколы передачи видеопотока / обратного управления для устройства. Для чего мне это - узнаете из следующих статей.
Но суть в том, что я уперся в невозможность получения статистики на arduino framework штатными средствами esp-idf, переключил платформу на esp-idf в Platformio и там настроил вывод статистики - это было чудесно.
Дальше я на esp-idf попробовал банально подключиться к wi-fi, открыл getting started и в ужасе закрыл, реализация настолько низкоуровневая по сравнению с библиотеками arduino, что я даже смотреть в сторону esp-idf больше не хочу.
Тем не менее, сбор статичтики мне покоя не давал и я написал простенький сбор своими руками, что-то такое:
Ну т.е. через ручные вызовы в начале и конце задачи через micros() я пытался посчитать загрузку задачами по времени. Получилась вот такая статистика (те же 5 секунд):
Task Usage Statistics:
Blink (Core 0): 0.0066% (Active: 267 us / Total: 4021757 us)
HTTP Server (Core 1): 16.6422% (Active: 831341 us / Total: 4995383 us)
Log (Core 1): 0.0000% (Active: 0 us / Total: 5000384 us)
Помимо сложностей в разработке, учета только пользовательских задач - посмотрите на якобы загрузку от задачи http сервера, в разных кейсах она доходила до 50% без запросов. Причем если появлялся запрос на обработку - процент загрузки даже уменьшался.
А теперь сравните это с нормальной статистикой, полученной внутренней функцией:
HttpServer 1382186 <1%
Т.е. на самом деле эта задача почти ничего не потребляет. Здесь сказывается разница в учете времени - http сервер, насколько я понимаю, не занимает задачу все время ожидания запроса и работает через таймер / события / что-то там еще внутри. Кастомная реализация статистики этого, разумеется не учитывает и не может учитывать. Так что использовать её абсолютно бессмысленно.
UPD
Сообщество PlatformIO также предложило использовать pioarduino — форк платформы platform-espressif32, — чтобы включить поддержку последней версии Espressif32 Arduino 3.x в PlatformIO. Эта версия включает встроенную поддержку статистических функций. PlatformIO пока официально не поддерживает Arduino 3.x. Кроме того, между этими версиями есть довольно значительные различия.
Комментариев пока нет
-
Реанимируем основание вешалок
Есть дома пара вешалок с плечиками, на которых удобно располагается одежда для… -
Ложемент для столовых приборов
Органайзинг - одна из сфер, куда я периодически пытаюсь приложить руку. На этот… -
Кросс-постинг инженерного DIY-контента
Начал выходить за рамки личного блога, кажется, что часть контента заслуживает… -
Композитная будка в стиле Сиднейской оперы. Часть 1
Как вам такой проект? Без электроники, но все еще с ИИ, 3д моделированием и еще… -
Грабли для выравнивания
Как-то так наложилось, что мне нужно обустроить новую площадку для газона, а со… -
Вкатываемся в видеоблогинг
Некоторые проекты на мой взгляд заслуживают более широкого охвата, видео в этом…