| Библиотека ESP-IDF для вывода в лог |
|
| Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Библиотека лога предоставляет 2 способа установки подробности вывода информации (verbosity level): · В момент компиляции (compile time): в menuconfig установить verbosity level по умолчанию, используя опцию CONFIG_LOG_DEFAULT_LEVEL. Существуют следующие уровни подробности лога (verbosity level): · Error (самый низкий уровень, выводятся только ошибки) Замечание: функция esp_log_level_set() не может установить уровни подробности лога выше, чем это указано опцией CONFIG_LOG_MAXIMUM_LEVEL. Чтобы увеличить уровень лога для определенного файла выше этого максимума в момент компиляции, используйте макрос LOG_LOCAL_LEVEL (подробнее об этом см. далее). [Как использовать библиотеку лога ESP-IDF] В каждом C-файле (модуле), в котором используется лог, определите переменную TAG, как показано ниже: static const char* TAG = "MyModule"; Затем используйте макросы вывода, например: ESP_LOGW(TAG, "Baud rate error %.1f%%. Requested: %d baud, actual: %d baud", error * 100, baud_req, baud_real); Доступны несколько макросов для разных уровней подробности вывода: ESP_LOGE - error (самый низкий уровень) Эти макросы отличаются друг от друга двумя моментами: во-первых, будет или не будет выведено макросом сообщение, зависит от текущего установленного уровня подробности. Во-вторых, отличается цвет текста выводимых сообщений в команде idf.py monitor. Например, ESP_LOGI выведет сообщение зеленым текстом, ESP_LOGW желтым текстом, а ESP_LOGE красным текстом. Дополнительно существуют версии ESP_EARLY_LOGx для этих макросов, например ESP_EARLY_LOGE. Эти версии явно используются только в коде раннего запуска (startup), до того момента, как инициализируется куча (heap allocator) и системные вызовы (syscalls). Обычные макросы ESP_LOGx могут также использоваться, когда компилируется bootloader, однако для них произойдет откат обратно к той же реализации, что и у макросов ESP_EARLY_LOGx. Также существуют версии ESP_DRAM_LOGx этих макросов, например ESP_DRAM_LOGE. Эти версии используются в некоторых местах, где вывод в лог может привести в условиях запрещенных прерываний, или когда кэш памяти flash недоступна. Использование этих макросов должно быть максимально щадящим, поскольку вывод в лог на таких местах кода вообще следует избегать по соображениям производительности. Замечание: внутри критических секций кода прерывания запрещены, так что можно использовать только лишь ESP_DRAM_LOGx (что предпочтительнее) или ESP_EARLY_LOGx. Несмотря на то, что есть возможность использовать такой лог в этих ситуациях, лучше всего хорошо структурировать программу, чтобы это вовсе не потребовалось. Чтобы отменить уровень подробности лога по умолчанию для области файла или области компонента, определите макрос LOG_LOCAL_LEVEL. Для области файла определите этот макрос перед подключением esp_log.h, например: #define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"
В области компонента определите его в файле CMakeLists компонента: target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLOG_LOCAL_LEVEL=ESP_LOG_VERBOSE")
Уровни лога определены в заголовке esp-idf/components/log/include/esp_log_level.h: /** Для конфигурирования вывода в области модуля runtime, добавьте вызовы функции esp_log_level_set() следующим образом: esp_log_level_set("*", ESP_LOG_ERROR); // установить уровень ERROR для всех компонентов esp_log_level_set("wifi", ESP_LOG_WARN); // разрешить логи WARN для стека WiFi esp_log_level_set("dhcpc", ESP_LOG_INFO); // разрешить логи INFO из клиента DHCP Замечание: варианты макросов лога "DRAM" и "EARLY", упомянутые выше, не поддерживают установку подробности вывода в лог в области модуля. Эти макросы всегда будут использовать verbosity level по умолчанию, который можно поменять runtime только вызовом esp_log_level("*", level). В качестве первого параметра указывается текстовый идентификатор драйвера (const char* tag), для которого задается уровень лога. Этот идентификатор определен в соотетствующем модуле драйвера. В следующей таблице приведены идентификаторы некоторых драйверов.
Лог на хост через JTAG. По умолчанию библиотека лога использует функцию наподобие vprintf для форматированного вывода в выделенный для программирования и лога UART. Вместо этого простым API-вызовом вывод может быть перенаправлен в JTAG, что сделает вывод в лог в несколько раз быстрее. За подробностями обратитесь в раздел "Logging to Host" документации [2]. [Пример приложения] Библиотека лога используется в большинстве компонентов примеров и примеров ESP-IDF как основной метод отладки и поиска ошибок. Для демонстрации функционала вывода в лог просмотрите содержимое директории examples каталога установки ESP-IDF. Наиболее подходящие примеры для исследования работы лога: system/ota [Справочник по API] Заголовочный файл библиотеки лога components/log/include/esp_log.h. В следующей таблице приведен общий список API-функций и макросов лога с кратким описанием. Подробное описание с назначением параметров, возвращаемых значений, типов данных см. в документации [1]. API-функции
Макросы
[Настройки уровня лога в idf.py menuconfig] Настройка idf.py menuconfig: Для чего нужны параметры "Default log verbosity" и "Maximum log verbosity"? Представьте себе фильтр для ваших логов. Один параметр решает, какие сообщения будут видны сразу после запуска, а другой — какие сообщения в принципе могут быть показаны, если вы решите изменить настройки позже. Default log verbosity (уровень логирования по умолчанию) Этот параметр устанавливает уровень детализации, с которым система будет писать логи сразу после запуска (и во время компиляции). Все сообщения с уровнем выше (т.е. менее детальные), чем выбранный, будут выводиться. Сообщения с уровнем ниже (более детальные) будут по умолчанию отключены. ● Где используется: работает на этапе компиляции и как настройка по умолчанию при старте программы. Например, если вы выставите значение `Info`, то в логах вы увидите сообщения `Error`, `Warning` и `Info`. Сообщения `Debug` и `Verbose` будут скрыты, но их можно будет включить позже (см. следующий пункт). Maximum log verbosity (максимальный уровень логирования) Этот параметр определяет "потолок" детализации, который в принципе доступен в прошивке. Другими словами, он задает, какие уровни логов будут скомпилированы и включены в бинарный файл прошивки. ● Где используется: исключительно на этапе компиляции. Это позволяет не включать в прошивку код для самых детальных логов, если вы уверены, что они вам никогда не понадобятся, экономя место в памяти. Например, вы установили `Maximum log verbosity` в значение `Info`. Это значит, что сообщения уровней `Debug` и `Verbose` не будут скомпилированы в прошивку. Даже если вы очень захотите их увидеть и вызовете специальную функцию, они не появятся, потому что их физически нет в коде. Взаимосвязь параметров на простом примере Чтобы стало совсем понятно, представьте себе "лестницу" уровней логирования: Уровень 5: `Verbose` (самый подробный) 1. Вы включаете в `menuconfig` `Default log verbosity = Warning`, `Maximum log verbosity = Verbose`. Что на выходе: в прошивку будут скомпилированы сообщения всех уровней (от Error до Verbose). Однако, сразу после запуска вы будете видеть только `Error` и `Warning`. Если вам понадобится отладить какую-то проблему, вы можете в коде с помощью `esp_log_level_set()` временно включить для нужного модуля уровень `Debug` или `Verbose`, и они начнут выводиться. 2. Вы включаете в `menuconfig` `Default log verbosity = Warning`, `Maximum log verbosity = Info`. Что на выходе: в прошивку будут скомпилированы только сообщения уровней `Error`, `Warning` и `Info`. Уровни `Debug` и `Verbose` будут вырезаны. Сразу после запуска вы будете видеть `Error` и `Warning` (как и в прошлом примере). Но теперь, как бы вы ни старались, вы никогда не сможете увидеть сообщения `Debug` и `Verbose`, потому что их код не был включен в прошивку . Таким образом, `Default log verbosity` управляет тем, что вы видите "сейчас", а `Maximum log verbosity` — тем, что вы потенциально можете увидеть "вообще". [Ссылки] 1. ESP-IDF Logging library site:espressif.com. |