ESP32S3的ESP_LOGx()控制台输出详细介绍

前言

(1)接触一款新的芯片,第一步要么是点灯,要么是进行串口的输出。现在我将介绍如何快速的利用ESP32S3进行控制台的日志输出。
(2)对于ESP32进行日志输出还是相对简单的,不像其他芯片需要配置波特率,设置数据位校验位等等的东西。简单很多,但是也给很多像我这种经常做单片机开发的骚年不安全感。虽然简单,但是用起来总感觉变扭。
(3)ESP32的很多操作,感觉和Linux有关,特别是本文要讲到的menuconfig配置,感觉就是与Linux内核裁剪差不多。这样会导致很多没有对这方面接触的兄弟们,看起来懵懵懂懂的。为了追求简单易懂,本文是通过vscode的ESP32-IDF插件进行设置。其他环境的我也会进行简单介绍。
(4)这边需要注意一点,如果你使用的是通过U0Tx,U0Rx,U1Tx,U1Rx。这种通过串口进行日志打印,会和通过USB数据线的日志打印有些许不同。

日志打印

日志的6个等级

(1)ESP32的日志输出是分等级的,他会根据预设的条件,通过编译器进行调整输出数据。
(2)而其他芯片不同,如果想给串口输出数据分级,需要通过宏定义处理。如下图

#include <stdio.h>

#define NO_output  0
#define Error      1
#define Warning    2
#define Info       3
#define Debug      4
#define Verbose    5
 
#define Set_LOG_Level Info  //设置日志输出等级

void main()
{
    
    
#if Set_LOG_Level >= Verbose
	printf("所有数据都打印\r\n");
#endif
#if Set_LOG_Level >= Debug
	printf("打印用于调试阶段的数据\r\n");
#endif
#if Set_LOG_Level >= Info
	printf("只打印一些普通信息\r\n");
#endif
#if Set_LOG_Level >= Warning
	printf("打印警告信息\r\n");
#endif
#if Set_LOG_Level >= Error
	printf("打印报错信息\r\n");
#endif
#if Set_LOG_Level >= NO_output 
	printf("不进行信息打印\r\n");
#endif
}

在这里插入图片描述

(3)根据上面这一段代码和测试结果我们就能够清晰的知道ESP32的日志打印工作原理。这种日志打印的分级没有什么好神秘的,其实就是利用的编译器预处理阶段,根据你本人设置的编译条件进行的处理。如果不相信的话,可以利用gcc的-E指令,对c文件只进行预处理,最终看到的结果如下:
注意:本人只截取了main()函数部分,因为预处理阶段,stdio.h 这个头文件信息都会被复制进入当前的C文件。不理解的可以看:深入理解C程序的#include和头文件,让c工程只有.h文件(狗头)

在这里插入图片描述

如何进行日志输出等级设置

(1)现在我们已经知道的日志等级的概念了,那么我如何设置输出的日志等级呢?对于上面的代码,我们是通过 #define Set_LOG_Level Info 这个宏来进行设置最终的日志输出等级的。
(2)这个根据操作环境不同使用方法不同,我先介绍最简单的办法。

方法1 — vscode独有配置日志输出等级

在这里插入图片描述

方法2 — menuconfig配置

(1)在命令行中输入idf.py menuconfig,进入配置界面。如果打不开menuconfig,可看一下ESP32S3无法打开idf.py menuconfig — windows环境这个下载指定的文件。
<2>找到如下的目录,配置即可。

在这里插入图片描述

方法3 — 直接修改sdkconfig文件

(1)在项目路径中找到sdkconfig文件

在这里插入图片描述

(2)搜索Bootloader config,找到下面这几段话,根据需求复制粘贴我的下面配置,最后保存即可。因为太多了,我就只举三个例子。

/*--- 日志输出等级为INFO ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
CONFIG_BOOTLOADER_LOG_LEVEL_INFO=y
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=3
/*--- 日志输出等级为DEBUG ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG=y
# CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE is not set
CONFIG_BOOTLOADER_LOG_LEVEL=4
/*--- 日志输出等级为VERBOSE ---*/
# CONFIG_BOOTLOADER_LOG_LEVEL_NONE is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_ERROR is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_WARN is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_INFO is not set
# CONFIG_BOOTLOADER_LOG_LEVEL_DEBUG is not set
CONFIG_BOOTLOADER_LOG_LEVEL_VERBOSE=y
CONFIG_BOOTLOADER_LOG_LEVEL=5

日志输出函数介绍

(1)如下为我们可以使用的几个函数(准确来说其实是宏定义,感兴趣的可以看一下他的实现原理)。
(2)日志输出等级如果设置为INFO,那么ESP_LOGI(),ESP_LOGW(),ESP_LOGE()这几个函数的打印信息可以输出。

ESP_LOGE() // 错误
ESP_LOGW() // 警告
ESP_LOGI() // 信息
ESP_LOGD() // 调试
ESP_LOGV() // 详细

(3)ESP_LOGx()这类型的宏使用,第一个都是一个字符串。一般是用于说明执行到了哪一个文件中,后续通过查看日志信息,就可以根据第一个字符串快速定位到出问题的代码。
(4)第二个参数也是一个字符串,这个字符串里面的%可以决定之后的可变参数能够拥有几个。
题外话:如果想了解可变参数的原理可看如何编写一个可变参数函数?如何让所有单片机的所有串口实现printf函数?

static const char *TAG = "main";
ESP_LOGI(TAG, "tast1: 1");
ESP_LOGI(TAG, "Compile time: %s %s", __DATE__, __TIME__);

(5)vscode中查看日志信息方法:

在这里插入图片描述

(6)其他平台中查看日志信息方法,输入下面命令行开始监控

idf.py monitor

关于日志打印不全问题

vscode的独有解决办法

(1)之前我USB的端口一直识别不到,所以一开始对ESP32S3是使用的CH340通过串口进行烧录程序的。之后研究ESP_LOGx()控制台输出的时候,发现我的ESP_LOGI()一直无法输出数据,折磨的我想吐。
(2)后面联系到乐鑫的官方工作人员,才知道问题所在。
(3)进入menuconfig配置界面,搜索Channel for console output,即可设置ESP_LOGx()控制台输出设置。
(4)下面这一段是关于这个配置选项的介绍,说实话,我本人没看懂就不乱介绍了。图片中的那个配置是根据乐鑫的官方工作人员的说明来些的,所以不会有问题。
<1>默认情况下,在预定义的gpio上使用UART0。
<2>如果选择“Custom”,可以选择UART0或UART1,并且可以选择任意引脚。
<3>如果选择“None”,则除了ROM引导程序的初始输出外,任何UART上都不会有控制台输出。该ROM输出可以通过GPIO捆扎或EFUSE抑制,详细信息请参阅芯片数据表。
<4>在带有USB OTG外设的芯片上,“USB CDC”选项将输出重定向到CDC端口。此选项使用芯片ROM中的CDC驱动程序,此选项与TinyUSB堆栈不兼容。
<5>在带有USB串行/JTAG调试控制器的芯片上,选择该选项可将输出重定向到该设备的CDC/ACM(串行端口仿真)组件。

在这里插入图片描述

menuconfig处理办法

(1)在命令行中输入idf.py menuconfig,进入配置界面。
(2)顶层目录—>Component config—>ESP System Settings—>Channel for console output根据你的条件选择

在这里插入图片描述

(3)如果你感觉找路径很麻烦,可以输入"/"进入搜索界面,再输入Channel for console output 即可查找到此选项。(注意,在命令行中,粘贴命令是ctrl+shift+v)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_63922192/article/details/132852003
今日推荐