研发设计门户网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 288|回复: 5

打造实用个性的Log输出宏

[复制链接]

该用户从未签到

13

主题

16

帖子

164

积分

版主

Rank: 7Rank: 7Rank: 7

积分
164
发表于 2017-9-12 08:26:32 | 显示全部楼层 |阅读模式

高速电路PCB网,专注于嵌入式方案,信号完整性和电源完整性仿真分析,高速电路PCB设计,各种EDA工具(Cadence\Mentor\\AD\\CAM\ANSYS HFSS)交流学习。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 蓝凌风 于 2017-9-12 08:27 编辑

       我们在调试嵌入式程序的时候,用IDE+调试器是最直接的方式,但是很多时候我们还需要用串口输出来打印一些Debug的信息,来帮助我们调试。串口调试最简单的方式的话,最简单就是用printf来打印。但是只有Printf不能很好的控制输出的信息,或者让代码变得很臃肿。我们就用宏来封装下Printf,让它更好的使用,更加便利。这里给大家分享一个我在别人基础再改进的Log宏代码
  1. #ifndef __LOG_H__
  2. #define __LOG_H__
  3. #include "bsp.h"
  4. #define LOG_ERROR                      (0x01)
  5. #define LOG_WARNING                    (0x02)
  6. #define LOG_NOTICE                     (0x04)
  7. #define LOG_INFO                       (0x08)
  8. #define LOG_DEBUG                      (0x10)

  9. /* This log macro must be set befor compiler, output error, warning, info debug lever */
  10. #define DEBUG_LEVEL_SWITCH             (0xFF)
  11. #define LOGHEARD            "LLFeng"
  12. #define DebugPrintf(fmt, arg...)          UART_Printf(huart1,(const char*)fmt, ##arg)

  13. #if ((DEBUG_LEVEL_SWITCH & LOG_ERROR) == LOG_ERROR)
  14. #define log_err(fmt, arg...)      DebugPrintf("%s:[%s@%s,%d]"fmt"\r\n",LOGHEARD,__FUNCTION__,__FILE__,__LINE__, ##arg)
  15. #else
  16.     #define log_err(fmt, arg...)
  17. #endif

  18. #if ((DEBUG_LEVEL_SWITCH & LOG_WARNING) == LOG_WARNING)
  19.     #define log_warn(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
  20. #else
  21.     #define log_warn(fmt, arg...)
  22. #endif

  23. #if ((DEBUG_LEVEL_SWITCH & LOG_NOTICE) == LOG_NOTICE)
  24.     #define log_notice(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
  25. #else
  26.     #define log_notice(fmt, arg...)
  27. #endif

  28. #if ((DEBUG_LEVEL_SWITCH & LOG_INFO) == LOG_INFO)
  29.     #define log_info(fmt, arg...)      DebugPrintf("%s:"fmt"\r\n",LOGHEARD, ##arg)
  30. #else
  31.     #define log_info(fmt, arg...)
  32. #endif

  33. #if ((DEBUG_LEVEL_SWITCH & LOG_DEBUG) == LOG_DEBUG)
  34. #define log_debug(fmt, arg...)      DebugPrintf("%s:[%s@%s,%d]"fmt"\r\n",LOGHEARD,__FUNCTION__,__FILE__,__LINE__, ##arg)
  35. #else
  36.     #define log_debug(fmt, arg...)
  37. #endif

  38. #if ((DEBUG_LEVEL_SWITCH & LOG_DEBUG) == LOG_DEBUG)
  39. #define log_data(data,size)    HAL_UART_Transmit(&huart1,data,size,100)     
  40. #else
  41.     #define log_data(data, size)
  42. #endif
  43. #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

主题

52

帖子

104

积分

技术员

Rank: 2

积分
104
发表于 2017-9-12 08:37:01 | 显示全部楼层
谢谢分享,

该用户从未签到

0

主题

61

帖子

122

积分

技术员

Rank: 2

积分
122
发表于 2017-9-12 08:49:01 | 显示全部楼层

该用户从未签到

0

主题

54

帖子

107

积分

技术员

Rank: 2

积分
107
发表于 2017-9-12 08:54:16 | 显示全部楼层
好贴,值得分享,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /3 下一条

QQ|我的微博|Archiver|手机版|小黑屋|YanFa.Tech(gaosupcb Inc.)  |人工智能  

GMT+8, 2019-6-26 13:45 , Processed in 0.094427 second(s), 33 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表