ESP32 LOG库使用
ESP32 log库 官方文档
一、printf是不可重入函数
printf不能在中断中被调用的原因是它是一个不可重入函数,而在中断中要避免调用不可重入函数,首先我们先说说什么是不可重入函数。
简单说来,区分一个函数是否可重入就是看这个函数能否在未返回的时候再次被调用。而造成一个函数不可重入的原因往往是使用了全局变量,如果一个函数未返回再执行一次会导致对全局变量的操作是不安全的。就例如我们常用的printf、malloc、free都是不可重入的函数,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。
二、ESP_LOGx日志
日志记录库提供了两种设置日志详细程度的方法:
- 在编译时:在menuconfig中,使用选项设置详细程度CONFIG_LOG_DEFAULT_LEVEL。详细程度高于的所有日志记录语句CONFIG_LOG_DEFAULT_LEVEL 将被预处理器删除。
#ifndef LOG_LOCAL_LEVEL
#ifndef BOOTLOADER_BUILD
#define LOG_LOCAL_LEVEL CONFIG_LOG_DEFAULT_LEVEL
#else
#define LOG_LOCAL_LEVEL CONFIG_LOG_BOOTLOADER_LEVEL
#endif
#endif#define ESP_LOG_LEVEL_LOCAL(level, tag, format, ...) do { \if ( LOG_LOCAL_LEVEL >= level ) ESP_LOG_LEVEL(level, tag, format, ##__VA_ARGS__); \} while(0)
- 在运行时:详细级别低于的所有日志CONFIG_LOG_DEFAULT_LEVEL默认情况下启用。该功能esp_log_level_set()可用于按模块设置日志记录级别。模块由其标签标识,这些标签是可读的ASCII零终止字符串。
该功能esp_log_level_set()无法将日志记录级别设置为高于CONFIG_LOG_DEFAULT_LEVEL。要在编译时增加特定文件的日志级别,请使用宏LOG_LOCAL_LEVEL
有以下详细级别:
- ESP_LOGE -错误(最低)
- ESP_LOGW - 警告
- ESP_LOGI -信息
- ESP_LOGD -调试
- ESP_LOGV -详细(最高)
此外,ESP_EARLY_LOGx每个宏都有相应的版本,例如ESP_EARLY_LOGE。在初始化堆分配器和syscalls之前,只能在早期启动代码中显式使用这些版本。普通ESP_LOGx宏也可以在编译引导加载程序时使用,但是它们将退回到与ESP_EARLY_LOGx宏相同的实现方式。
考虑到线程安全,在FreeRTOS中尽量使用ESP_LOGx来输出调试信息和打印消息。
四、如何使用这个库
4.1 打印信息
在每个使用日志记录功能的C文件中,定义TAG变量,如下所示:
static const char* TAG = "MyModule";
然后使用日志记录宏之一生成输出,例如:
uint16_t ap_count = 0;
ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
4.2 更改详细级别
要在文件或组件范围内覆盖默认的详细级别,请定义LOG_LOCAL_LEVEL宏。
在文件范围内,在包含之前定义它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); // 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
4.3 通过JTAG登录到主机
默认情况下,日志记录库使用类似于vprintf的函数将格式化的输出写入专用UART。通过调用一个简单的API,所有日志输出都可以路由到JTAG,从而使日志记录速度提高了几倍。
ESP32 LOG库使用相关推荐
- ESP32学习--库添加
在esp32工程中添加第三方库 添加第三方库工程中main文件夹下的lib文件夹中 在main文件的CMakeLists.txt 文件中添加一下代码 add_subdirectory(lib/tiny ...
- iOS一个灵活可扩展的开源Log库
目前大部分iOS的小型开发团队都不是很重视log,导致很多线上发生的或者用户反馈的bug难以排查.对于App来说一个好的日志系统可以帮助我们用最小的代价来排查一些疑难bug,我们唯一要做的就是在合适的 ...
- android 自定义库,Android自定义Log库
背景 我们在开发的时候肯定会打一些Log,特别是在调试代码或者bug的时候,我们都会打一些Log日志来记录,但是当我们发布正式版本的时候,尼玛,要一行一行的去掉,这就尴尬了. 懵逼状态 励志封装Log ...
- 找个轻量级的Log库还挺难
这两天一直希望找个可以移植到VxWorks上的Log库,早就知道大名鼎鼎的Log4c,但一直想找个更好的,本来看上了Pantheios,觉得它的架构非常清晰,使用也很简便,特别是其网站上宣传它的性能非 ...
- 从 Go log 库到 Zap,怎么打造出好用又实用的 Logger
日志无论对于程序还是程序员都非常重要,有多重要呢,想要长期在公司健健康康的干下去就得学会阶段性划水,阶段性划水的一大关键的就是干活快过预期但是装作...不对,这个开头不对劲,下面重来.日志无论对于程序 ...
- Arduino ESP32 第三方库读取SD卡信息(三)
Arduino ESP32 第三方库读取SD卡信息(三) 相关篇<Arduino ESP32 第三方库读取SD卡信息(一)> <Arduino ESP32 第三方库读取SD卡信息(二 ...
- logger(三):其他log库的介绍(glog的用法)
Glog等一些log库 在写代码的过程中,打log肯定是少不了的,毕竟不能总靠调试来发现问题.我们可以试着使用自己写一些log库,也可以使用现成的log库,成熟的log库非常多,log4cpp.log ...
- esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案
esp32 TFT_eSPI库 屏幕显示不全,颜色错误的解决方案 打开Arduino库文件目录,找到TFT_eSPI文件夹,打开如图片所示的目录 st7789 135x240 和 240x240屏幕 ...
- log库spdlog简介及使用
spdlog是一个开源的.快速的.仅有头文件的C++11 日志库,code地址在 https://github.com/gabime/spdlog ,目前最新的发布版本为0.14.0.它提供了向流.标 ...
最新文章
- 一文览尽LiDAR点云目标检测方法
- python 调用函数内部参数
- 使IIS服务器支持下载 apk/ipa 安装包
- 使用git clone的时候报错:Received HTTP code 503 from proxy after CONNECT
- 用python抓取糗事百科的小程序
- 《Shell脚本学习指南》第一章 背景知识
- 获取表中的某个字段名
- sicily vector有序插入
- css-第一个CSS
- oracle 表约束非空,oracle--约束(主键、非空、检查)
- Ajax--serialize应用表单数据序列化
- asp.net简单的投票系统代码 转载牛腩兄弟的
- JavaScript服务器端高级编程(Array.indexOf()和lastIndexOf()方法)
- https报文 完整_报文 HTTP HTTPS
- 局域网 访问计算机 软件,局域网查看工具
- npm 安装yarn
- Python报错unindent does not match any outer indentation level如何解决?
- Perl操作excel2007的模块
- c-lodop自定义分页打印
- 【XSY-Contest2618.Problem A】抢夺