Основная проблема в том, что в исходной собранной библиотеке arduino-esp32 для PlatformIO функции сбора статистики (vTaskGetRunTimeStats / vTaskList) отключены. Библиотека используется как есть, ссылки на гайды по сборке своих библиотек устарели (404), а актуальных доступных всем инструкций просто нет. К тому же issues по добавлению этих функций также не рассматривают, т.к. они связаны с использованием сторонней библиотеки.
Чтобы добавить эти функции - нужно пересобрать библиотеку с измененными параметрами. В качестве OS используем Ubuntu (Windows - пользователи могут поднять виртуалку в WSL).
Esp32 arduino lib builder
Инструкция установке билдера и сборке есть на официальном сайте. Устанавливаем зависимости:
sudo apt-get install git wget curl libssl-dev libncurses-dev flex bison gperf cmake ninja-build ccache jq python3 sudo pip install --upgrade pip pip install --user setuptools pyserial click cryptography future pyparsing pyelftools
Можно дальше по инструкции клонировать репозиторий и запустить сборку. Скачивание всех зависимостей и сборка занимают примерно час.
А потом результаты сборки можете ... удалить, потому что версии самого билдера и всех используемых библиотек отличаются и использовать их в 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 удалось найти статью на японском (!), которая описывает, что действительно нужно сделать для пересборки библиотеки. Билдер мы ставили не зря, но вот дальше начинаются приключения - каждую из этих библиотек придется установить вручную.
Для начала все же клонируем билдер и переключим версию:
git clone https://github.com/espressif/esp32-arduino-lib-builder cd esp32-arduino-lib-builder git switch release/v4.4
Далее необходимо зафиксировать каждую версию библиотеки, поэтому нужно закомментировать в билдере автоматическое обновление компонентов (build.sh:84-87):
# echo "* Installing/Updating ESP-IDF and all components..." # update components from git # ./tools/update-components.sh # if [ $? -ne 0 ]; then exit 1; fi
Теперь придется вручную загрузить все компоненты, включая ESP-IDF и ядро Arduino для ESP32 .
TLDR установка всех зависимостей в одну строку
git clone -b v4.4.7 --recursive https://github.com/espressif/esp-idf.git && git -C ./esp-idf/ reset --hard 38eeba213a && git clone -b 2.0.17 --recursive https://github.com/espressif/arduino-esp32 ./components/arduino && git -C ./components/arduino reset --hard d75795f5 && git clone --recursive https://github.com/espressif/esp32-camera ./components/esp32-camera && git -C ./components/esp32-camera reset --hard f0bb429 && git clone --recursive https://github.com/espressif/esp-dl.git ./components/esp-dl && git -C ./components/esp-dl reset --hard 0632d24 && git clone --recursive https://github.com/joltwallet/esp_littlefs.git ./components/esp_littlefs && git -C ./components/esp_littlefs reset --hard 41873c2 && git -C ./components/esp_littlefs submodule update --init --recursive && git clone --recursive https://github.com/espressif/esp-rainmaker.git ./components/esp-rainmaker && git -C ./components/esp-rainmaker reset --hard d8e9345 && git -C ./components/esp-rainmaker submodule update --init --recursive && git clone --recursive https://github.com/espressif/esp-dsp.git ./components/espressif__esp-dsp && git -C ./components/espressif__esp-dsp reset --hard 9b4a8b4 && git clone --recursive https://github.com/hathach/tinyusb.git ./components/arduino_tinyusb/tinyusb && git -C ./components/arduino_tinyusb/tinyusb reset --hard a0e5626bc
Ниже разбивка по библиотекам и командам.
esp-idf
git clone -b v4.4.7 --recursive https://github.com/espressif/esp-idf.git git -C ./esp-idf/ reset --hard 38eeba213a
arduino-esp32
git clone -b 2.0.17 --recursive https://github.com/espressif/arduino-esp32 ./components/arduino git -C ./components/arduino reset --hard d75795f5
esp32-camera
git clone --recursive https://github.com/espressif/esp32-camera ./components/esp32-camera git -C ./components/esp32-camera reset --hard f0bb429
esp-dl
git clone --recursive https://github.com/espressif/esp-dl.git ./components/esp-dl git -C ./components/esp-dl reset --hard 0632d24
esp_littlefs
git clone --recursive https://github.com/joltwallet/esp_littlefs.git ./components/esp_littlefs git -C ./components/esp_littlefs reset --hard 41873c2 git -C ./components/esp_littlefs submodule update --init --recursive
esp-rainmaker
git clone --recursive https://github.com/espressif/esp-rainmaker.git ./components/esp-rainmaker git -C ./components/esp-rainmaker reset --hard d8e9345 git -C ./components/esp-rainmaker submodule update --init --recursive
espressif__esp-dsp
git clone --recursive https://github.com/espressif/esp-dsp.git ./components/espressif__esp-dsp git -C ./components/espressif__esp-dsp reset --hard 9b4a8b4
tinyusb
git clone --recursive https://github.com/hathach/tinyusb.git ./components/arduino_tinyusb/tinyusb git -C ./components/arduino_tinyusb/tinyusb reset --hard a0e5626bc
Сборка
Теперь можем запустить сборку для esp32 (если у вас другая ревизия платы - указывайте её):
./build.sh -t esp32
Сборка занимает продолжительное время, если по итогу создан каталог с именем «out» - операция прошла успешно.
$ ls out package_esp32_index.template.json platform.txt tools
Sdkconfig
Если хотите, можете посмотреть текущие настройки sdkconfig:
. ./esp-idf/export.sh idf.py menuconfig
Можно использовать menuconfig только для просмотра настроек сборки, редактировать здесь настройки не выйдет.

Нужная мне опция находится в Component config ---> FreeRTOS ---> Enable FreeRTOS to collect run time stats. Как видим, по умолчанию флаг сброшен:

Нужно внести изменения относительно стандартного sdkconfig. Для esp32 нужно отредактировать configs/defconfig.esp32. Для esp32c2 и esp32c3 результирующее имя файла — defconfig.esp32c2 и defconfig.esp32c3 соответственно (рядом можете найти и другие ревизии).
CONFIG_BTDM_CTRL_MODE_BTDM=y CONFIG_BTDM_SCAN_DUPL_CACHE_SIZE=20 CONFIG_BT_BTC_TASK_STACK_SIZE=8192 CONFIG_BT_BTU_TASK_STACK_SIZE=8192 CONFIG_BT_CLASSIC_ENABLED=y CONFIG_BT_A2DP_ENABLE=y CONFIG_BT_SPP_ENABLED=y CONFIG_BT_HFP_ENABLE=y CONFIG_BT_STACK_NO_LOG=y CONFIG_BT_BLE_DYNAMIC_ENV_MEMORY=y CONFIG_ESP32_SPIRAM_SUPPORT=y CONFIG_SPIRAM_OCCUPY_HSPI_HOST=y CONFIG_ESP32_ULP_COPROC_ENABLED=y CONFIG_ESP32_XTAL_FREQ_AUTO=y # CONFIG_ESP_TASK_WDT_CHECK_IDLE_TASK_CPU1 is not set CONFIG_FREERTOS_FPU_IN_ISR=y # CONFIG_USE_WAKENET is not set # CONFIG_USE_MULTINET is not set CONFIG_TWAI_ERRATA_FIX_BUS_OFF_REC=y CONFIG_TWAI_ERRATA_FIX_TX_INTR_LOST=y CONFIG_TWAI_ERRATA_FIX_RX_FRAME_INVALID=y CONFIG_TWAI_ERRATA_FIX_RX_FIFO_CORRUPT=y CONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS=y
Я добавил последнюю строку для включения функций сбора статистики. Все прочие уже были в файле.
Собираем все заново:
./build.sh -t esp32
После завершения сборки проверяем конфиг сборки (каждый раз нужно делать экспорт):
. ./esp-idf/export.sh idf.py menuconfig
Если нужный флаг установлен - мы все сделали правильно.

PlatformIO
Осталось дело за малым, скопировать нашу библиотеку в PlatformIO.
Предварительно соxраняем исходную библиотеку и копируем собранную в PlatformIO:
mv -r ~/.platformio/packages/framework-arduinoespressif32/tools/sdk/ ./platformio-sdk-backup/ cp -r ./out/tools/sdk ~/.platformio/packages/framework-arduinoespressif32/tools
Можно переходить в PlatformIO и попробовать собрать прошивку, функции должны быть доступны.
Вот такой минимальный код можно использовать для проверки:
#include <Arduino.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" void TaskLog(void *pvParameters) { static const int statsBufferSize = 1024; static char statsBuffer[statsBufferSize]; static const int listBufferSize = 1024; static char listBuffer[listBufferSize]; while (true) { Serial.println("\n============ Task Stats ============"); // Get runtime stats for CPU usage // This requires configGENERATE_RUN_TIME_STATS to be enabled vTaskGetRunTimeStats(statsBuffer); Serial.println("Run Time Stats:"); Serial.println(statsBuffer); // Get task list with state, priority, stack, and task number // Note: vTaskList output depends on configuration and may not include core affinities by default vTaskList(listBuffer); Serial.println("Task List:"); Serial.println(listBuffer); Serial.println("====================================="); vTaskDelay(5000 / portTICK_PERIOD_MS); } } void setup() { // Инициализация последовательного порта Serial.begin(115200); Serial.println("ESP32 example with stats"); // Создание задачи для вывода логов на ядре 1 xTaskCreatePinnedToCore( TaskLog, // Функция задачи "Log", // Имя задачи 2048, // Увеличили размер стека для доп. вычислений NULL, // Параметры задачи 1, // Приоритет задачи NULL, // Дескриптор задачи 1 // Ядро, на котором будет выполняться задача ); } void loop() { delay(1000); }
Каждые 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 не предоставляют более удобный способ конфигурирования основных библиотек.
UPD
Сообщество PlatformIO также предложило использовать pioarduino — форк платформы platform-espressif32, — чтобы включить поддержку последней версии Espressif32 Arduino 3.x в PlatformIO. Эта версия включает встроенную поддержку статистических функций. PlatformIO пока официально не поддерживает Arduino 3.x. Кроме того, между этими версиями есть довольно значительные различия.
UPD 2
Если вы используете Arduino IDE - можно использовать библиотеку esp32 3.* от espressiv systems вместо ардуиновской, там эти функции включены по умолчанию. В остальном описанный алгоритм остается актуальным для изменения других параметров sdkconfig для обеих IDE. Спасибо @shadrapза помощь.
