通过ESP32 logging库来启发我们的思维吧~~
Posted Wireless_Link
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过ESP32 logging库来启发我们的思维吧~~相关的知识,希望对你有一定的参考价值。
零. 声明
本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下:
第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对ESP-IDF开发有一个总体的认识,比我们后续学习打下基础!
第二篇:ESP32-IDF外设驱动介绍,主要会根据esp-idf现有的driver,提供各个外设的驱动,比如LED,OLED,SPI LCD,TOUCH,红外,Codec ic等等,在这一篇中,我们不仅仅来做外设驱动,还会对常用的外设总线做一个介绍,让大家知其然又知其所以然!
第三篇:目前比较火热的GUI LVGL介绍,主要会设计LVGL7.1,LVGL8的移植介绍,并且也会介绍各个组件,知道原理后,最后,我们会推出一款组态软件来构建我们的GUI,来提升我们的效率!
第四篇:ESP32-蓝牙,熟悉我的,应该都知道,我即使从事蓝牙协议栈的开发的,所以这个是我们独有的优势,在这一篇章,我们会提供不仅仅是蓝牙应用方法的知识,也会应用结合蓝牙底层协议栈的理论,让你彻底从上到下打通蓝牙任督二脉!
第五篇:Wi-Fi介绍,熟悉我的,应该也知道,我们也做过一款sdio wifi的驱动教程板子,所以在wifi这方面我们也是有独有的优势,在这一篇章,我们同样不仅仅提供Wi-Fi应用方面的知识,也会结合底层理论,让你对Wi-Fi有一个清晰的认知!
另外,我们的教程包括但是不局限于以上篇章,为了给你一个更好的导航,以下信息尤其重要,请详细查看!!
------------------------------------------------------------------------------------------------------------------------------------------
蓝牙交流扣扣群:539357317
微信公众号↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
------------------------------------------------------------------------------------------------------------------------------------------
一.概述
日志库有两种管理日志详细程度的方法:
编译阶段,通过菜单设置;
运行阶段,使用esp_log_level_set()函数设置。
日志等级有:错误,警告,信息,调试和详细(详细度从最低到最高)。
在编译阶段,使用CONFIG_LOG_DEFAULT_LEVEL选项过滤。所有等级状态高于CONFIG_LOG_DEFAULT_LEVELD的日志将会被处理器移除。
在运行阶段,所有低于CONFIG_LOG_DEFAULT_LEVEL的日志被默认使能。esp_log_level_set()函数可以用来减少每个模块的日志等级。模块通过标签识别,这些标签是可读的零结尾的ASCII字符串。
注意:esp_log_level_set()函数不能提高到超过CONFIG_LOG_DEFAULT_LEVEL设置的等级。在编译阶段,为了给特殊文件提高日志等级,可以使用LOG_LOCAL_LEVEL宏(详见下)。
二.如何使用库
在每个C文件里使用日志功能,需要这样定义TAG变量:
static const char* TAG = "MyModule";
然后使用一条日志宏来产生输出,比如:
ESP_LOGW(TAG, "Baud rate error %.1f%%. Requestd: %d baud, actual: %d", error * 100, baud_req, baud_real);
以下是一些不同复杂度的日志宏:
. ESP_LOGE - error(lowest)
. ESP_LOGW - warning
. ESP_LOGI -info
. ESP_LOGD -debug
. ESP_LOGV -verbose(highest)
另外有一个_EARLY变量对应以上每一个宏(比如ESP_EARLY_LOGE)。这些变量可以在启动代码中运行,在堆栈分配和系统调用被初始化前。当编译引导程序时,普通的ESP_LOGx宏不像ESP_EARLY_LOGx那么有效。所以ESP_EARLY_LOGx明确的唯一用处是在启动代码里,比如堆栈分配初始化代码。
为了覆盖一个文件或部件作用范围的默认详细度,定义LOG_LOCAL_LEVEL宏。在文件作用范围,在 inclueing esp_log.h 前定义它,比如:
#define LOG_LOCAL_LEVEL ESP_LOG_VERBOSE
#include "esp_log.h"
在部件范围,在部件的makefile里定义:
CFLAGS += -D LOG_LOCAL_LEVEL=ESP_LOG_DEBUG
在运行阶段,为了配置每个模块的日志输出,增加条用 esp_log_level_set() 函数:
esp_log_level_set("*", ESP_LOG_ERROR); // 设置所有的部件日志详细度为ERROR
esp_log_level_set("wifi", ESP_LOG_WARN); // 使能来自WiFi栈的警告日志
esp_log_level_set("dhcpc", ESP_LOG_INFO); // 使能来自DHCP客户端的信息日志
API的比较简单,具体可以详细参照下以下链接:Logging library - ESP32 - — ESP-IDF Programming Guide latest documentation
我们比较常用的就是以下几个吧
ESP_LOGE(tag, format, ...)
ESP_LOGW(tag, format, ...)
ESP_LOGI(tag, format, ...)
ESP_LOGD(tag, format, ...)
ESP_LOGV(tag, format, ...)
ESP_LOG_BUFFER_HEX(tag, buffer, buff_len)
三.使用logging库
1.menuconfig配置
Default log verbosity: 编译的log等级,决定哪些log能输出
Use ANSI terminal colors in log output: log等级是否有颜色输出。
NOTED:当然也要串口工具也要支持此功能才行,否则在颜色tag部分会输出乱码
Log Timestamps:日志时间戳
2.代码
我们在上面已经说明了怎么使用,我们直接来贴代码,然后看效果
#include "esp_log.h"
static const char* TAG = "Wireless Link";
void esp32_logging_lib_show()
ESP_LOGE(TAG, "I am error log");
ESP_LOGW(TAG, "I am warning log");
ESP_LOGI(TAG, "I am info log");
ESP_LOGD(TAG, "I am debug log");
ESP_LOGV(TAG, "I am verbose log");
void app_main(void)
esp32_logging_lib_show();
效果:
由于我们menuconfig设置的是info,所以debug跟verbose没有显示
四.自己写一个log系统
我们看到上面这么炫酷,又是可以增加log等级,又是可以根据log等级显示不同的颜色的,那么他们是怎么实现的呢?我们要做到知其然又知其所以然,他的logging系统代码很简单,你们可以自己追下,我们来写一个简单的logging系统来看下效果吧,目的是起到抛砖引玉的作用:
wl_log.h的代码如下:
#include <stdio.h>
/* Define trace levels */
#define WL_TRACE_LEVEL_NONE 0 /* No trace messages to be generated */
#define WL_TRACE_LEVEL_ERROR 1 /* Error condition trace messages */
#define WL_TRACE_LEVEL_WARNING 2 /* Warning condition trace messages */
#define WL_TRACE_LEVEL_INFO 3 /* Debug messages for info */
#define WL_TRACE_LEVEL_DEBUG 4 /* Full debug messages */
#define WL_TRACE_LEVEL_VERBOSE 5 /* Verbose debug messages */
#define MAX_TRACE_LEVEL 6
#define DEFAULT_LOG_LEVEL WL_TRACE_LEVEL_INFO
#define LOG_COLOR_YELLOW "\\033[40;33m"
#define LOG_COLOR_RED "\\033[40;31m"
#define LOG_COLOR_BLUE "\\033[40;36m"
#define LOG_COLOR_PURPLE "\\033[40;35m"
#define LOG_COLOR_RESET "\\033[0m"
#define LOGCOMMON(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET fmt "\\n", tag, ##__VA_ARGS__);
#define LOGWARN(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET LOG_COLOR_YELLOW fmt LOG_COLOR_RESET"\\n", tag, ##__VA_ARGS__);
#define LOGERR(tag, fmt, ...) printf(LOG_COLOR_BLUE"[ %s ] "LOG_COLOR_RESET LOG_COLOR_RED fmt LOG_COLOR_RESET"\\n", tag, ##__VA_ARGS__);
#define WL_LOGE(tag,fmt,...) do if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_ERROR)LOGERR(tag,fmt,##__VA_ARGS__); while(0)
#define WL_LOGW(tag,fmt,...) do if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_WARNING)LOGWARN(tag, fmt,##__VA_ARGS__); while(0)
#define WL_LOGI(tag,fmt,...) do if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_INFO)LOGCOMMON(tag, fmt,##__VA_ARGS__); while(0)
#define WL_LOGD(tag,fmt,...) do if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_DEBUG)LOGCOMMON(tag, fmt,##__VA_ARGS__); while(0)
#define WL_LOGV(tag,fmt,...) do if(DEFAULT_LOG_LEVEL >= WL_TRACE_LEVEL_VERBOSE)LOGCOMMON(tag, fmt,##__VA_ARGS__); while(0)
main.c的效果如下:
#include "esp_log.h"
#include "wl_log.h"
static const char* TAG = "Wireless Link";
void esp32_logging_lib_show()
ESP_LOGE(TAG, "I am esp32 error log");
ESP_LOGW(TAG, "I am esp32 warning log");
ESP_LOGI(TAG, "I am esp32 info log");
ESP_LOGD(TAG, "I am esp32 debug log");
ESP_LOGV(TAG, "I am esp32 verbose log");
void wl_logging_lib_show()
WL_LOGE(TAG, "I am wireless link(wl) error log");
WL_LOGW(TAG, "I am wireless link(wl) warning log");
WL_LOGI(TAG, "I am wireless link(wl) info log");
WL_LOGD(TAG, "I am wireless link(wl) debug log");
WL_LOGV(TAG, "I am wireless link(wl) verbose log");
void app_main(void)
esp32_logging_lib_show();
wl_logging_lib_show();
输出效果
这个并不是让你在esp32中让你使用自己的log系统(当然你也可以),而是介绍下log系统想分log等级以及模块其实没有那么复杂的!!
CSDN 社区图书馆,开张营业! 深读计划,写书评领图书福利~以上是关于通过ESP32 logging库来启发我们的思维吧~~的主要内容,如果未能解决你的问题,请参考以下文章
Arduino框架下ESP32 EEPROM库函数实现对各数据类型保存示例