嵌入式软件调试中的打印开关及打印等级

简介: 嵌入式软件调试中的打印开关及打印等级


      今天来分享下项目中经常使用到的打印,应该是每个嵌入式软件工程师在日常调试项目中都需要的必备技能(并不是什么很难或者不常见的方法,其实是今天公众号没啥写的,就来简单的分享一下,也一定有人能受益)之前有关打印也在公众号中发过一篇文章,关于彩色打印的,有需要的小伙伴可以看下小编写的这篇文章的介绍。                                EasyLogger--不一样的打印输出


       看过文章的都知道Easylogger的方便之处是在控制台中断打印出彩色的打印信息,并且能在软件上设置打印的颜色、闪烁等效果,但是其在移植的时候势必会占用一些内存空间,其带来的好处也是不言而喻的,我现在在项目中也会使用Easylogger,能够一眼在多如牛毛的打印信息中看到红色的错误信息,有利于定位错误代码。


       今天要说的就是怎么在占用更小的内存空间,控制打印信息的输出,实现打印的开关控制以及过滤打印等级较低的打印信息输出。虽然不能实现不同颜色的打印,但带来的好处是在片内空间比较紧张的情况下,简单的实现过滤打印信息的效果,两种方法根据自己的硬件环境做评估。
·    打印开关        我们在项目中调试的代码都有Debug版本和Release版本,Debug版本用于输出一些log方便日常调试以及bug定位,但是打印信息影响整个系统的性能,因此在发布Release版本的时候一般都会要求把log信息关闭,如果要一行一行的去注释所有的打印信息,项目代码比较庞大的时候,似乎这个操作会累S个人,怎么才能实现更简单的控制呢?        方法还是有的,使用一个宏定义,如下:

#define  __DEBUG
#ifdef  __DEBUG
#define  DEBUG(msg)  printf(msg)
#else
#define  DEBUG(msg)
#endif

当定义宏__DEBUGDE时候就能打开打印信息,屏蔽__DEBUG宏定义的时候就能关闭打印信息输出,这样操作后就变得很简单了。
       但是上面的代码有个问题,不知道细心的小伙伴能不能发现。问题在于这个DEBUG宏如果用来打印可变参数似乎编译不过去,会有错误产生,例如下面的代码:

DEBUG("Hello %s\n", "linux");  /* 此代码结合上面的打印无法编译通过 */

因此还需要对其进行改造。改造后如下:

#define  __DEBUG
#ifdef  __DEBUG
#define  DEBUG(msg, ...)  printf(msg, ##__VA_ARGS__)
#else
#define  DEBUG(msg, ...)
#endif

  这里可以很好的解决上述问题,支持可变参数打印,__VA_ARGS__这个宏会获取可变参数的个数
       这里有一个要注意的是,在C99的标准下,上述代码还可以优化一下,变得稍微简单点,如下:

#define  __DEBUG
#ifdef  __DEBUG
#define  DEBUG(...)  printf(__VA_ARGS__)
#else
#define  DEBUG(...)
#endif

 对比两个代码段,发现DEBUG少了参数msg,实现的效果也是一样的,注意的是C99标准哦!

·    打印等级        打印开关了,接着来看下打印等级吧。        分等级的打印能打印出等级较高的内容,过滤一些无关的打印。这是其优点。        我在示例代码中分了三个打印等级,并定义了PRINT_LEVEL,只有打印等级大于PRINT_LEVEL的才会被打印出来,那就直接看代码。(写法千千万,按照自己喜欢的风格去实现这个功能就好,这里只是一种思路)

#if#include <stdio.h>
#define  __DEBUG                    /* 打印开关控制 */
#ifdef   __DEBUG
#define  DEBUG(...)   printf(__VA_ARGS__)
#else
#define  DEBUG(...)
#endif
/* 数值越大,等级越高 */
#define  INFO_LEVEL    1            /* 打印等级最低 */
#define  WARN_LEVEL    2            /* 打印等级2 */
#define  ERROR_LEVEL   3            /* 打印等级3 */
#define  DEBUG_NULL    255          /* printf off */
#define  PRINT_LEVEL   WARN_LEVEL   /* 打印等级大于或等于WARN_LEVEL的会被打印出来 */
#define  DEBUG_INFO(...)   do{                                   \
                                if(INFO_LEVEL >= PRINT_LEVEL)    \
                                    DEBUG(__VA_ARGS__);          \
                              }while(0)
#define  DEBUG_WARN(...)   do{                                   \
                                if(WARN_LEVEL >= PRINT_LEVEL)    \
                                    DEBUG(__VA_ARGS__);          \
                              }while(0)
#define  DEBUG_ERR(...)   do{                                    \
                                if(ERROR_LEVEL >= PRINT_LEVEL)   \
                                    DEBUG(__VA_ARGS__);          \
                            }while(0)
int main(void)
{
    DEBUG_INFO("Debug_Info msg.\r\n");
    DEBUG_WARN("Debug_Warning msg.\r\n");
    DEBUG_ERR("Debug_Error msg.\r\n");
    return 0;
}

 上面的代码运行结果是:

Debug_Warning msg.
Debug_Error msg.

   可以看出过滤掉了Info的打印信息,当我们只需要看错误信息的时候,就可以修改打印等级去实现,这样能更好的查看各种打印信息。

       好了,到此就结束了,今天的分享还是很简单易懂的,哪怕是在51平台上也能简单实现打印的过滤(常用的89C51  89C52上再去移植Easylogger跑起来彩色打印,应该是有点困难的,内部资源不够,因此,简单的实现log过滤就要依赖今天分享的这种方式啦)

       如果觉得本篇文章多少有点帮助的话大家不要忘了,点赞、关注、评论、转发哦,创作不易!你们的支持是小编创作的最大动力。(PS:如果后面有时间的话也可以和大家分享下Linux下重定向的相关问题,解锁打印、调试的更多操作)

相关文章
|
5月前
|
C++
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
spdlog 日志库部分源码说明——日志格式设定,DIY你自己喜欢的调试信息,你能调试的远比你想象的还要丰富
279 6
|
6月前
|
iOS开发
XCode控制台调试无法看到函数跟踪或无法看到输出的日志问题及解决方案
XCode控制台调试无法看到函数跟踪或无法看到输出的日志问题及解决方案
268 0
|
6月前
|
安全 Linux
嵌入式Linux系统关闭串口调试信息的输出
嵌入式Linux系统关闭串口调试信息的输出
254 1
|
编解码 算法
打印【A级条码】的方法
条码的检测等级是条码能否被识别扫描的关键,条码的等级分为“A B C D F”五个等级,A级是最高级别,一些出口欧美的标签上的条码都要求达到A级,主要是保证条码的扫描识别率。
111 0
打印【A级条码】的方法
|
传感器 定位技术
(5)(5.3) 飞行前检查清单(Copter)
(5)(5.3) 飞行前检查清单(Copter)
113 0
|
编解码 开发工具 Windows
案例分享:Qt管道焊接参数条码打印系统(条码打印机TSC 244 Pro、打印条码、打印中文、打印字符、多张连续打印)
案例分享:Qt管道焊接参数条码打印系统(条码打印机TSC 244 Pro、打印条码、打印中文、打印字符、多张连续打印)
案例分享:Qt管道焊接参数条码打印系统(条码打印机TSC 244 Pro、打印条码、打印中文、打印字符、多张连续打印)
|
Android开发
快应用 调试输出
快应用在调试时需要输出信息查看中间结果 类似android的toast 使用如下: import prompt from '@system.prompt' //导入包 export default { data: { key: '' }, onInit () { prompt.
856 0
|
Python
beeprint:让你的调试打印更友好
beeprint:让你的调试打印更友好 推荐一个国人的开源项目 beeprint,可以更加漂亮的打印你的调试信息。对标 Python 标准库的 pprint。 下面我们就来看一下 beeprint 和 pprint 打印 Python 对象的对比。
2260 0
|
数据库
条码打印软件如何批量打印快递单
随着快递行业的兴起,也会出现各种各样的快递单,快递单上除了有“收件人”“收件人地址”“收件人电话”等固定不变的数据,还应该有相对应的可变数据,需要一起打印出来才能应用于快递包裹上,如果一两条可以手动输入打印,但是如果是几十上百条,手动输入就会非常的麻烦。
2123 0
斑马标签打印机蛋疼的打印错误处理方法
斑马标签打印机蛋疼的打印错误处理方法 默认自动检测的纸张,打印预览的时候没有问题,但是打印出来的效果,就一小块,打印不全。这个蛋疼的问题,可能和操作系统有关系,win10打印的时候没有问题,win7就不行。
1374 0