我们在调试嵌入式程序的时候,用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条评论)
登录后参与讨论