总结几种log打印printf函数的宏定义

本文介绍了一种在C语言中使用宏定义实现灵活调试输出的方法,并展示了如何自动记录函数名、文件名及行号来增强日志信息的实用性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://blog.chinaunix.net/u1/38994/showart_1168773.html

 

http://www.linuxsir.org/bbs/showthread.php?t=302451

 

这里有篇不错的文章,[经验分享]程序日志中自动记录所在函数名、文件名、行号

比上面的要好多了:

或者

<think>嗯,用户想找关于单片机中实现log打印函数的方法或者代码示例。我需要先理清楚他们的需求。用户可能是在开发嵌入式系统时需要调试,所以需要有效的日志记录功能。他们提到了log打印函数,可能想要了解如何在不同配置下(比如调试模式或发布模式)控制日志输出,或者如何优化日志功能以减少资源占用。 首先,我应该回顾之前提供的引用内容。引用[2]中有一个示例,展示了在单片机中通过宏定义来控制调试日志的输出。当定义了UART_DEBUG时,DEBUG和LOG宏会被替换成printf函数,否则替换成空。这可能是一个关键的参考点。用户可能需要类似的代码结构,或者更详细的实现步骤。 接下来,我需要考虑用户可能需要的不同实现方式。比如,最基本的UART打印,添加时间戳,或者带日志等级的功能。这些功能在嵌入式开发中很常见,所以分点说明会比较清晰。同时,代码示例需要符合他们的开发环境,比如使用GD32E50x系列单片机,这可能涉及到特定的库函数,如systick_get()来获取系统时间。 另外,用户可能关心如何优化日志功能,比如在发布时关闭日志以减少资源消耗,或者如何处理日志的实时性和存储问题。这些问题可以作为相关问题提出,帮助他们进一步解决问题。 需要注意的是,代码示例中的宏定义方法可以灵活控制日志输出,这在资源有限的单片机环境中非常重要。同时,时间戳和日志等级可以帮助他们更好地追踪问题。可能还需要提到如何配置UART外设,确保日志能够正确输出到串口。 最后,确保回答结构清晰,分步骤说明实现方法,并提供示例代码。同时,生成的相关问题要针对用户可能遇到的后续问题,比如性能优化、日志存储策略等。</think>### 单片机日志打印函数实现方法 #### 一、基础实现原理 在单片机中实现日志打印函数的核心是通过串口(UART)输出调试信息,并利用宏定义控制日志输出级别。以下为关键实现步骤: 1. **硬件依赖配置** - 初始化UART外设(波特率、数据位、校验位等) - 配置systick定时器用于时间戳获取(可选) 2. **宏定义控制** 通过预编译宏实现调试模式与发布模式的切换: ```c // main.h #define LOG_LEVEL_DEBUG 3 #define LOG_LEVEL_INFO 2 #define LOG_LEVEL_ERROR 1 #define LOG_LEVEL_NONE 0 #ifndef CURRENT_LOG_LEVEL #define CURRENT_LOG_LEVEL LOG_LEVEL_DEBUG // 默认调试级别 #endif ``` #### 二、代码实现示例 基于GD32E50x系列单片机的实现(引用自[^2]): ```c // uart_log.h #include "systick.h" typedef enum { LOG_ERROR = 1, LOG_INFO, LOG_DEBUG } LogLevel; #define LOG(level, format, ...) \ do { \ if (level <= CURRENT_LOG_LEVEL) { \ uint32_t _tick = systick_get(); \ printf("[%5u.%03u][%s] " format "\r\n", \ _tick/1000, _tick%1000, \ (level==LOG_ERROR)?"ERROR":(level==LOG_INFO)?"INFO":"DEBUG", \ ##__VA_ARGS__); \ } \ } while(0) // 使用示例: LOG(LOG_DEBUG, "ADC采样值: %d", adc_value); ``` #### 三、关键优化点 1. **时间戳精度**:使用systick定时器(通常1ms中断)提供时间基准 2. **输出缓冲**:建议使用环形缓冲区避免阻塞(适用于高速日志场景) 3. **多等级过滤**:通过`CURRENT_LOG_LEVEL`宏动态调整输出级别 4. **格式优化**:添加文件名、行号等信息(需使用`__FILE__`和`__LINE__`宏) #### 四、发布模式优化 在量产版本中关闭日志输出: ```c // 发布版本定义(通常在编译选项设置) #define CURRENT_LOG_LEVEL LOG_LEVEL_NONE ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值