ESP-IDF学习笔记-调试等级打印

ESP32IDF中提供了一个LOG库,根据不同调试等级打印信息,这里记录一下简单用法。

官方的LOG库文档

官方给的库用法很多还有一些高级用法,但是我们只需要使用简单的就行了。

一,调试级别

ESP32LOG库定义的如下调试级别(按等级高低从低到高排列):

  • ESP_LOGE - error (lowest)
  • ESP_LOGW - warning
  • ESP_LOGI - info
  • ESP_LOGD - debug
  • ESP_LOGV - verbose (highest)

对应的在IDF中的调试级别设置如图:

image-20230420235300470

对应的设置选项为:

  • CONFIG_LOG_DEFAULT_LEVEL:默认调试级别
  • CONFIG_LOG_MAXIMUM_LEVEL:最高调试级别

高于默认调试级别的调试信息不会打印

CONFIG_LOG_MAXIMUM_LEVEL用来设置esp_log_level_set() 可以设置的最高级别的调试等级(代码中动态调整调试等级)。

剩下一个设置项用来设置调试时间戳的来源,可以设置为来自于FreeRTos的时基,从系统重启后到现在的ms;或者为实际时间,来自RTC外设(可通过SNTP在重启置0后校准)。

二,API函数

常用函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//打印调试信息
ESP_LOGE();//error (lowest)

ESP_LOGW();//warning

ESP_LOGI();//info

ESP_LOGD();//debug

ESP_LOGV();//verbose (highest)
//设置调试等级

void esp_log_level_set(const char *tag, esp_log_level_t level);//设置TAG的调试等级

esp_log_level_t esp_log_level_get(const char *tag);//获得TAG的调试等级

使用方法:

  1. 定义TAG
1
2
3
static const char* TAG = "MyModule";
//others
#define TAG "MyModule"
  1. 调用打印函数
1
ESP_LOGW(TAG, "Baud rate error %.1f%%. Requested: %d baud, actual: %d baud", error * 100, baud_req, baud_real);

通过在esp_log.h前定义LOG_LOCAL_LEVEL来重新设置默认调试等级:

1
2
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"

对于组件(component)可以在CMakeLists中设置来重设:

1
target_compile_definitions(${COMPONENT_LIB} PUBLIC "-DLOG_LOCAL_LEVEL=ESP_LOG_VERBOSE")

可以通过``在运行时设置各个TAG的调试等级:

1
2
3
esp_log_level_set("*", ESP_LOG_ERROR);        // set all components to ERROR level
esp_log_level_set("wifi", ESP_LOG_WARN); // enable WARN logs from WiFi stack
esp_log_level_set("dhcpc", ESP_LOG_INFO); // enable INFO logs from DHCP client

三,高级用法

输出端口

默认情况下,日志输出到串口,使用类vsprintf函数。

通过调用以下函数,可以将输出定向到JATG:

1
esp_log_set_vprintf(esp_apptrace_vprintf);

如果想重新设置回UART:

1
esp_log_set_vprintf(vprintf);

其他输出API

1
ESP_EARLY_LOGx()

在系统早期启动过程使用:在堆分配前和系统调用前使用

1
ESP_DRAM_LOGx()

在中断被关闭或者Flash缓存无法访问时使用,由于对系统性能考虑,应尽可能少使用。