通过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有一个清晰的认知!

另外,我们的教程包括但是不局限于以上篇章,为了给你一个更好的导航,以下信息尤其重要,请详细查看!!

------------------------------------------------------------------------------------------------------------------------------------------

购买开发板(点击我)

文档目录(点击我)

Github代码仓库(点击我)

蓝牙交流扣扣群: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库来启发我们的思维吧~~的主要内容,如果未能解决你的问题,请参考以下文章

ESP32 Logging库

ESP32学习笔记之I2C总线

esp32怎么实现14位dac输出

Arduino框架下ESP32 EEPROM库函数实现对各数据类型保存示例

ESP32 + Python 还不知道怎么垃圾分类? 用HaaS DIY一个智能垃圾桶吧

ESP32 + Python 还不知道怎么垃圾分类? 用HaaS DIY一个智能垃圾桶吧