Как установить уровень отладки в модуле кода ESP-IDF? Печать
Добавил(а) microsin   

В ESP-IDF можно установить уровень детализации логов на этапе компиляции и динамически во время выполнения, чтобы выводить только необходимые отладочные сообщения.

[Управление уровнями логов]

В ESP-IDF используется шесть уровней детализации (от низшего к высшему): Error, Warning, Info, Debug, Verbose и None (полное отключение вывода макросов ESP_LOGx). Основные способы управления показаны в таблице:

Способ настройки Описание Где настраивается
Глобальный (по умолчанию) Уровень для всего приложения. Сообщения выше этого уровня удаляются компилятором. sdkconfig (CONFIG_LOG_DEFAULT_LEVEL, изменяется командой idf.py menuconfig)
Локальный (для файла) Переопределяет глобальный максимум для отдельного файла кода. В начале `.c` файла (#define LOG_LOCAL_LEVEL ...)
Динамический, runtime (в коде) Позволяет менять уровень для всех модулей или конкретного тега (TAG) во время работы. Функция esp_log_level_set()

[Практическое применение]

1. Установка глобального уровня.

Самый простой способ — использовать menuconfig для настройки CONFIG_LOG_DEFAULT_LEVEL. Например, Чтобы включить Debug-сообщения выполните команду:

$ idf.py menuconfig

Затем перейдите в Component config → Log output → Default log verbosity и выберите нужный уровень.

2. Повышение уровня для отдельного файла.

Если для одного файла нужны более детальные логи (например, Verbose), определите макрос в начале файла перед включением esp_log.h:

// В вашем файле some_debug_file.c
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE // Повышает уровень для этого файла
#include "esp_log.h"
static const char* TAG = "MyDebugModule";

Это позволит компилятору включить в прошивку ESP_LOGV()-сообщения только из этого файла.

3. Динамическое изменение уровня во время выполнения.

Уровень можно менять в коде приложения с помощью функции esp_log_level_set(). Это особенно полезно для включения отладки в конкретном модуле.

#include "esp_log.h"

void app_main() {
// По умолчанию используется уровень, заданный в menuconfig
// Включить вывод Warning и выше для всех модулей
esp_log_level_set("*", ESP_LOG_WARN);

// Для конкретного модуля "my_component" включить Debug-сообщения
esp_log_level_set("my_component", ESP_LOG_DEBUG);

// Дальнейший код... }

Важное ограничение: динамически нельзя поднять уровень выше значения, заданного CONFIG_LOG_DEFAULT_LEVEL при компиляции. Например, если глобальный уровень Info, то установить для тега уровень Debug или Verbose не получится.

Вот пример, который демонстрирует основные принципы:

// Файл: main.c

// 1. Локальное повышение уровня для этого файла
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"

// 2. Определяем тег для этого модуля
static const char* TAG = "MAIN";

void some_function() {
// Будет выведено, если глобальный уровень >= Info:
ESP_LOGI(TAG, "Функция запущена.");
// Будет выведено, если локальный уровень >= Debug:
ESP_LOGD(TAG, "Значение переменной: %d", 42);
// Будет выведено только благодаря LOG_LOCAL_LEVEL:
ESP_LOGV(TAG, "Внутреннее состояние..."); }

void app_main() {
// 3. Динамически меняем уровень для нашего тега:
esp_log_level_set("MAIN", ESP_LOG_DEBUG); // Включаем Debug для модуля MAIN
ESP_LOGE(TAG, "Пример ошибки.");
ESP_LOGW(TAG, "Пример предупреждения.");
ESP_LOGI(TAG, "Информационное сообщение.");

some_function(); // Вызовем функцию с разными уровнями логов }

[Полезные советы]

● Использование тегов: всегда объявляйте TAG как static const char* в начале `.c`-файла. Использование одного и того же имени переменной упрощает копирование кода.

● Ограничение для памяти: максимальный уровень детализации влияет на размер прошивки. Включение Verbose для всего проекта сильно увеличит её размер.

● Для раннего запуска: в коде, который выполняется до инициализации кучи (например, в bootloader), используйте макросы ESP_EARLY_LOGx.

● Решение проблем: если esp_log_level_set() не работает для конкретного тега, проверьте, что глобальный уровень в menuconfig (CONFIG_LOG_DEFAULT_LEVEL) установлен достаточно высоко.

Настройка логов позволяет эффективно отлаживать код, не перегружая вывод в терминале и не увеличивая излишне размер прошивки. Если вы планируете использовать платформу PlatformIO, настройки выполняются в файле platformio.ini через параметры сборки.

[Ссылки]

1. Библиотека ESP-IDF для вывода в лог.
2. ESP-IDF FAQ: Q013, Q024, Q045.