广告

原创 打造实用个性的Log输出宏

2017-9-12 08:15 339 0 分类: MCU/ 嵌入式

 我们在调试嵌入式程序的时候,用IDE+调试器是最直接的方式,但是很多时候我们还需要用串口输出来打印一些Debug的信息,来帮助我们调试。串口调试最简单的方式的话,最简单就是用printf来打印。但是只有Printf不能很好的控制输出的信息,或者让代码变得很臃肿。我们就用宏来封装下Printf,让它更好的使用,更加便利。这里给大家分享一个我在别人基础再改进的Log宏代码。

[C] 纯文本查看
复制代码

?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#ifndef __LOG_H__
#define __LOG_H__
#include "bsp.h"
#define LOG_ERROR                      (0x01)
#define LOG_WARNING                    (0x02)
#define LOG_NOTICE                     (0x04)
#define LOG_INFO                       (0x08)
#define LOG_DEBUG                      (0x10)
 
/* This log macro must be set befor compiler, output error, warning, info debug lever */
#define DEBUG_LEVEL_SWITCH             (0xFF)
#define LOGHEARD            "LLFeng"
#define DebugPrintf(fmt, arg...)          UART_Printf(huart1,(const char*)fmt, ##arg)
 
#if ((DEBUG_LEVEL_SWITCH & LOG_ERROR) == LOG_ERROR)
#define log_err(fmt, arg...)      DebugPrintf("%s:[%s@%s,%d]"fmt"\r\n",LOGHEARD,__FUNCTION__,__FILE__,__LINE__, ##arg)
#else
    #define log_err(fmt, arg...)
#endif
 
#if ((DEBUG_LEVEL_SWITCH & LOG_WARNING) == LOG_WARNING)
    #define log_warn(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
#else
    #define log_warn(fmt, arg...)
#endif
 
#if ((DEBUG_LEVEL_SWITCH & LOG_NOTICE) == LOG_NOTICE)
    #define log_notice(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
#else
    #define log_notice(fmt, arg...)
#endif
 
#if ((DEBUG_LEVEL_SWITCH & LOG_INFO) == LOG_INFO)
    #define log_info(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
#else
    #define log_info(fmt, arg...)
#endif
 
#if ((DEBUG_LEVEL_SWITCH & LOG_DEBUG) == LOG_DEBUG)
#define log_debug(fmt, arg...)      DebugPrintf("%s:[%s@%s,%d]"fmt"\r\n",LOGHEARD,__FUNCTION__,__FILE__,__LINE__, ##arg)
#else
    #define log_debug(fmt, arg...)
#endif
 
#if ((DEBUG_LEVEL_SWITCH & LOG_DEBUG) == LOG_DEBUG)
#define log_data(data,size)    HAL_UART_Transmit(&huart1,data,size,100)    
#else
    #define log_data(data, size)
#endif
#endif


       代码里一开始就是定义的log输出的等级LOG_ERROR,LOG_WARNING,LOG_NOTICE,LOG_INFO,LOG_DEBUG,每个等级控制Printf输出不同的内容,我们D 通过改变DEBUG_LEVEL_SWITCH的宏定义就能近山Log的等级输出,比如定义DEBUG_LEVEL_SWITCH 为LOG_ERROR,那最终程序只会打印log_debug这个Log宏函数的输出,其它等级就不会有输出。这里的log_debug还加入了打印函数名,文件名跟行数等信息,我们只要像printf那样调用log_debug就会加上打印我们前面说的内容来帮助我们更好的定位问题,这里还加上个性化输出的字符串LOGHEARD,我们改变LOGHEARD的定义就让Log输出变的很有个性。如下图用log_info和log_debug打印的输出。

       在实际写代码的过程,我们只根据实际情况去调用不同的Log函数去打印我们所要的信息。调试完毕后我们再定义DEBUG_LEVEL_SWITCH调试等级来控制log不同等级的输出或者压根就不输出。比如我代码定义DEBUG_LEVEL_SWITCH 为0xFF,就是打开了所有的输出,等我们调试完了,不需要看其它没必须的信息,我们不用去删除代码,只需要再改输出等级DEBUG_LEVEL_SWITCH 为LOG_ERROR|LOG_DEBUG ,这样log就会打印对应的这两条宏函数的输出。这样就既便利又有修改。

广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
mzwhhwj 2017-12-07 08:49
物联网前端后台1——一条硬件狗的学习历程
        距上次写MQTT的文章,不知不觉已经过了三个月了,本来打算写自己搭建MQTT Borker的,但这方面的资料只要一百度都有,难度也不大,又加上项目比较忙,一直没时间写文章。从上个月开始...
mzwhhwj 2017-09-12 08:18
物联网核心之MQTT移植
在上一篇文章中,只是讲了MQTT的主要内容,至于怎么移植到STM32上,怎么使用才是最重要的关键。这里使用的平台是RT8711的WIFI SOC,使用的LWIP跟FreeRTOS,移植使用跟STM32...
mzwhhwj 2017-08-24 08:39
物联网核心之MQTT(一)
       MQTT,目前物联网的最主要的协议,基本所有收费的云平台都是基于MQTT协议,比如机智云,和所有的开放云平台比如中国移动的oneNet、百度的云平台也都支持MQTT的接入。虽然MQTT很...
mzwhhwj 2016-03-18 18:47
硬件狗的浪漫
硬件平台:STM32F4-discovery开发平台:VS2013+VisualGDB5.12   ...
mzwhhwj 2015-11-06 09:24
评论:@sunyzz 博客中提到的“【博客大赛】“虚短”“虚断”两板斧,搞定运算放大器!”
学习了...
我要评论
0
0
广告
关闭 热点推荐上一条 /2 下一条