ESP32 LOG库使用

2023-05-16

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,从而使日志记录速度提高了几倍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 LOG库使用 的相关文章

  • GTX1650 搭建TensorFlow-GPU 2.4框架(CUDA11.0 + cudnn 8.04 + anaconda 3.8)

    内容简介 序言个人电脑配置采用的方案安装anaconda在anaconda中配置 默认通道 清华镜像源安装pycharmpycharm导入anaconda安装CUDA安装cuDNN安装TensorFlow GPU版 个人感悟安装过程第一问题
  • 单片机电子琴模拟系统

    单片机电子琴模拟系统 实验一 xff1a 电子琴模拟系统即电子琴模拟器当选择不同的按键时 xff0c 扬声器发出不同音阶的声音 xff0c 仪器的最基本组成部分应包括 xff1a 扬声器 模数转换电路 单片机控制电路 设计一个用蜂鸣器模拟电
  • 串口通信实验(通过串口控制LED、蜂鸣器)

    需要添加的固件库文件有 stm32f4xx gpio c stm32f4xx rcc c misc c stm32f4xx usart c 四个 1 串口时钟和 GPIO 时钟使能 串口3是挂载在 APB1 下面的外设 xff0c xff0
  • (一)ADRC自抗扰控制-各部分简介与仿真

    前言 简单的说 xff0c ADRC可以理解为PID增强版 xff0c 主要由ESO xff08 扩展状态观测器 xff09 非线性 xff08 或线性 xff09 控制器 TD xff08 跟踪微分器 xff09 组成 xff0c 其灵魂
  • python—遍历文件夹下所有的图片(或其他文件)

    span class token triple quoted string string 34 34 34 日期 xff1a 2021年01月26日 34 34 34 span span class token keyword import
  • Python—给图片加椒盐噪声(包含读取写入图片)

    span class token comment 2021年1月27日 span span class token keyword import span glob span class token keyword import span
  • python cv2

    函数 xff1a cv2 threshold 这个函数有四个参数 xff0c 第一个原图像 xff0c 必须是单通道 第二个进行分类的阈值 xff0c 第三个是高于 xff08 低于 xff09 阈值时赋予的新值 xff0c 第四个是一个方
  • 信息量与交叉熵损失的关系

    目录 1 信息量 2 信息熵 3 相对熵 xff08 KL散度 xff09 4 交叉熵 xff08 cross entropy xff09 5 二值交叉熵 xff08 binary cross entropy xff09 在机器学习领域 x
  • 树莓派镜像系统—兼容3B、3B+、4B,已编译opencv

    树莓派镜像系统 xff08 转载 xff09 这个镜像是基于树莓派官方raspios buster arm64桌面版镜像制作 xff0c 内核版本为5 4 72 xff0c OpenCV版本为4 5 0 xff0c 默认开启ssh和vnc
  • python遇到的语法问题

    python什么时候加self xff0c 什么时候不加self self代表对象本身 xff0c 换个思维应该认为self是全局变量 xff0c 如果变量前面加了self xff0c 那么在任何实例方法 xff08 非staticmeth
  • python Jetson tx2和 stm32之间的通信(16进制和10进制的转换,包括负数),BCC校验(异或)运算

    tx2接收16进制数据 含16进制转化为10进制 xff0c 负数怎么表示 我发现tx2接收stm32的16进制的数据 xff0c 不能达到我想要的效果 并且16进制数还会转换成ASCLL码的字符 如下图 xff1a 通过如下操作可以获得字
  • ROS 学习记录(五)

    在运行moveit xff01 例程的时候发现没有Moveit包 xff0c 于是在网上下载 xff0c 发现普通的 sudo apt get install ros kinetic moveit 无法完成安装 会提示找不到安装包 尝试更换
  • rosbag使用介绍

    rosbag 1 录制包 span class token comment 录制所有的topic span rosbag record span class token operator span a 2 查看包的信息 rosbag inf
  • Python基础

    输出函数print 输出内容可以是 1 数字 print 66 6 2 字符串 print hello world 单引号双引号都可 3 含有运算符的表达式 print 3 43 1 4 输出到文件中 fp 61 open D text t
  • PID控制器的优缺点和周期

    PID控制器参数优缺点 PID控制器简介 PID控制器是非常经典的一种控制算法 xff0c 是不需要知道系统的模型 xff0c 仅仅根据期望与现状的偏差调节 xff0c 使之能够到达期望的一种线性控制器 优点 xff1a 使用简单 xff0
  • 嵌入式开发自救指南(嵌入式怎么高薪基本思路)

    文章目录 前言打工的基本逻辑 xff1a 生产者思维价值与价格概念介绍需求与价值供给与价值 总结 一 为什么选择嵌入式四个角度个人需求现有资源与长板职业优先级排序 二 距离目标还有多远距离目标距离 三 路线半年路线为什么这样做 前言 为什么
  • docker安装firefox

    下载镜像 docker pull jlesage firefox 运行容器 docker run d name 61 firefox e TZ 61 Asia Hong Kong p 5800 5800 p 5900 5900 shm si
  • freertos学习之路1-裸机和rtos的区别

    写在最前 由于工作需要 xff0c 需要开始学习freertos的相关知识 xff0c 本专题主要记录freertos的相关内容 参考 xff1a https www bilibili com video BV19g411p7UT 正点原子
  • Windows10 配置 VSCode 的 C++环境

    目录 0 不同符号代表的 CPU 的位数 xff1a 1 下载 MinGW64 包 xff0c 配置C C 43 43 的Windows环境 2 在 VSCode 里配置 C 43 43 0 不同符号代表的 CPU 的位数 xff1a x8
  • MPU MCU CPU GPU之间的关系

    CPU xff08 Central Processing Unit xff0c 中央处理器 是计算机系统的主要处理器 xff0c 它负责执行指令 处理数据和控制计算机系统的操作 CPU通常被用于通用计算和控制任务 xff0c 如桌面电脑 服

随机推荐

  • stm32外设-中断详解

    0 写在最前 本栏目笔记都是基于stm32F10x 1 中断是啥 xff1f 什么是中断 xff1a CPU在处理某一事件A时 xff0c 发生的另外某一事件B请求CPU去处理 xff08 产生了中断 xff09 xff0c 随后CPU暂时
  • Darknet——yolo3训练自己的数据集+在ros环境下实现目标检测实战教程(三)——应用在ROS上

    文章目录 前言一 darknet ros代码简析二 修改ros驱动包的文件内容三 ros系统下运行效果总结 前言 Darknet yolo3训练自己的数据集 43 在ros环境下实现目标检测实战教程 xff08 一 xff09 环境配置 D
  • LSB(Linux Standard Base)通用部分学习自用(1)

    前言 什么是LSB xff08 借用了这位博主的高见 xff09 LSB文档下载 自用 xff0c 如有错误请指出 xff0c 不胜感激 本系列基于LSB Core Generic 5 0 介绍 The LSB defines a bina
  • cocos2dx 第七课 动作和动画

    一 动作的行为 runAction Action act 运行动作 stopAction Action act 停止动作 stopActionByTag int tag 停止动作 stopAllActions 停止节点所有动作 二 动作的种
  • 线性最小方差估计理论推导

    线性最小方差估计理论推导 定义 也叫线性最小均方误差估计 xff0c 顾名思义 xff0c 就是使估计误差的平方和的均值达到最小 理论推导 假设系统 z 61 H x 43
  • D435i、D435、D415、T265的Realsense_viewer环境搭配及安装

    安装步骤 1 注册服务器公钥 sudo apt span class token operator span key adv span class token operator span keyserver keys span class
  • VS Code下利用Cmake开发C++-单文件

    单文件 xff1a 第一步 xff1a 创建CmakeLists txt文件 第二步 xff1a 编写CmakeLists 设置最小版本 span class token function cmake minimum required sp
  • ECharts学习--主题设置

    xff08 1 xff09 内置主题 echarts中默认主题有两个 light dark 在初始化对象方法中 xff0c init可以指明 xff1a xff08 1 xff09 dark var mCharts 61 echarts i
  • 隔壁老王看了都会的文章:STM32串口实验——单片机与上位机交互信息

    今天介绍USART串口通信的使用 xff0c 目的在于会用串口传送和接收数据 内容包含了NVIC中断的知识 xff0c 下一篇着重讲NVIC中断 ADC在下下一篇 主要还是先看懂USART的相关代码 什么是串行通信 我们对通信的字面意思理解
  • C++ 字符串(string)常用操作总结

    目录 0 常用功能汇总 1 定义一个字符串 2 读写 string 操作 3 查询字符串信息 索引 4 拼接 比较等操作 5 cctype 头文件 判断字符类型 xff1a 大 小写字母 标点 数字等 6 for 循环遍历 7 修改 str
  • USB学习笔记——USB通信过程与枚举过程

    在网上看到一篇文章就是讲这个的 xff0c 仔细阅读后获得了很多感触 xff0c 整理总结如下 一 USB接口 在USB的集线器端D xff0c D 43 都接了下拉电阻 xff0c 而USB设备端的D xff0c D 43 接了上拉电阻
  • BGP协议的难点笔记和重要性

    bgp的报文 有五种报文类型bgp的包头长什么样 xff1a 由market 标记 length 长度 type 报文类型 这3个东西组成open报文 xff1a 用来维护bgp的建立 xff0c 就是bgp对等体之间的信息建立update
  • 使用xfsdump及xfsrestore备份并恢复文件

    xfs提供了xfsdump和xfsrestore工具 xff0c 协助备份xfs文件系统中的数据 xfsdump按inode顺序备份一个xfs文件系统8 xfs备份级别有2种 xff1a 0表示完全备份 xff0c 1 9表示增量备份 xf
  • 电赛准备过程记录

    电赛记录 xff08 1 xff09 2021全国大学生电子设计大赛参赛纪实 xff08 无人机赛题 xff09 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 电赛记录 xf
  • Jetson TX2新手上路全记录(1)

    Jetson TX2小白零基础上手记录 xff08 1 xff09 暑假申请了一块TX2进行学习 xff0c 从头开始记录学习过程 趁着在装虚拟机先唠两句 文章目录 Jetson TX2小白零基础上手记录 xff08 1 xff09 开箱环
  • Jetson TX2新手上路全记录(3)

    ng 3 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 例如 xff1a 第一章 Python 机器学习入门之pandas的使用 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff
  • 傅里叶变换详解

    一 用途 xff1a 任意 的函数经过一定的分解 xff0c 都能够表示为正弦函数的线性组合形式 比如想要过滤一首音乐中的噪音 xff0c 我们可以使用傅里叶变换将叠加后的图像分离为一个个纯声的正弦图像 xff0c 去掉特定频率的噪声就能实
  • git如何删除本地所有未提交的更改

    在使用git的时候 xff0c 如果本地做的修改都不想保留了 xff0c 可以通过下面命令恢复成HEAD版本 xff0c 未提交的以及加入暂存区中的修改都会被舍弃 git reset hard git clean xdf 转自
  • ESP32的RMT模块项目实用

    1 技术背景 最近公司在用ESP32的模组方案实现智能音箱的相关功能的项目 需要展示模组的网络状态以及音箱的语音交互状态 xff0c 找了一家RGB灯板供应商 需要模组通过一个io口输出脉冲波形 xff0c 来控制灯板切换模式 xff0c
  • ESP32 LOG库使用

    ESP32 log库 官方文档 一 printf是不可重入函数 printf不能在中断中被调用的原因是它是一个不可重入函数 xff0c 而在中断中要避免调用不可重入函数 xff0c 首先我们先说说什么是不可重入函数 简单说来 xff0c 区