printf不能在中断中被调用的原因是它是一个不可重入函数,而在中断中要避免调用不可重入函数,首先我们先说说什么是不可重入函数。
简单说来,区分一个函数是否可重入就是看这个函数能否在未返回的时候再次被调用。而造成一个函数不可重入的原因往往是使用了全局变量,如果一个函数未返回再执行一次会导致对全局变量的操作是不安全的。就例如我们常用的printf、malloc、free都是不可重入的函数,printf会引用全局变量stdout,malloc,free会引用全局的内存分配表,在多线程的环境下,如果没有很好的处理数据保护和互斥访问,就会发生错误。
日志记录库提供了两种设置日志详细程度的方法:
在编译时:在menuconfig中,使用选项设置详细程度CONFIG_LOG_DEFAULT_LEVEL
。详细程度高于的所有日志记录语句CONFIG_LOG_DEFAULT_LEVEL
?将被预处理器删除。
在运行时:详细级别低于的所有日志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
来输出调试信息和打印消息。
#include "esp_log.h"
在每个使用日志记录功能的C文件中,定义TAG变量,如下所示:
static const char* TAG = "MyModule";
然后使用日志记录宏之一生成输出,例如:
uint16_t ap_count = 0;
ESP_LOGI(TAG, "Total APs scanned = %u", ap_count);
要在文件或组件范围内覆盖默认的详细级别,请定义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
默认情况下,日志记录库使用类似于vprintf的函数将格式化的输出写入专用UART。通过调用一个简单的API,所有日志输出都可以路由到JTAG,从而使日志记录速度提高了几倍。有关详细信息,请参阅“登录到主机”部分。
? 由 Leung 写于 2021 年 4 月 20 日
微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很...
本文将研究 ES6 的 for ... of 循环。 旧方法 在过去,有两种方法可以遍历 javas...
一石激起千层浪,继中国区浩浩荡荡的大裁员告一段落之后,甲骨文并未因此收起手...
前言 相信大家都知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也...
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
【排序算法】之lowb三人组冒泡、插入、选择 什么是lowb三人组 冒泡排序bubble so...
计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持...
ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可...
vbs:把一段文字中指定字符颜色变成红色的正则 functionc(Tstr,Word) Dimre Setre...
一、正则表达式概述 二、正则表达式在VBScript中的应用 三、正则表达式在VavaScr...