0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

CHANBAEK 来源:嵌入式学习之路 作者: 创客小巴 2023-05-14 16:38 次阅读

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

看过文章的都知道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 


#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过滤就要依赖今天分享的这种方式啦)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开关
    +关注

    关注

    19

    文章

    3126

    浏览量

    93482
  • 嵌入式
    +关注

    关注

    5068

    文章

    19013

    浏览量

    303080
  • 软件
    +关注

    关注

    69

    文章

    4765

    浏览量

    87147
  • 调试
    +关注

    关注

    7

    文章

    572

    浏览量

    33892
  • DEBUG
    +关注

    关注

    3

    文章

    89

    浏览量

    19879
收藏 人收藏

    评论

    相关推荐

    嵌入式开发习惯和嵌入式gdb调试步骤

    嵌入式linux开发过程,出现BUG是在所难免的,这时就需要用到调试技术了,最常用、最简单的调试方法当属printf打印了。 如果ubu
    发表于 12-17 23:39

    嵌入式系统软件开发环境调试器的设计

    调试软件开发流程是一个比较重要的环节,调试器是衡量一个软件开发环境优劣的重要因素.本文对嵌入式
    发表于 05-30 13:51 29次下载

    嵌入式系统Internet打印的设计与实现

    本文通过设计实例介绍了一种嵌入式网络打印的实现方案。该方案选用ATmega128 为MPU、LAN91C111 为网络控制器,以通用的SPP 打印并口作为物理输出端 口,硬件构成上具有典型意义。软
    发表于 06-23 13:40 20次下载

    基于嵌入式Linux的B超图像打印的实现

    本文实现了一种基于嵌入式Linux 的B 超图像打印方案,可以在多种常用喷墨打印机上输出256 灰度级的超声图像硬拷贝。通过对个人计算机Linux 下的打印系统的分析,提出了符合
    发表于 08-22 11:24 16次下载

    基于嵌入式Linux的打印控制系统的设计

    本文介绍了一种基于嵌入式Linux 的打印控制系统,并给出了软、硬件的整体设计方案。这一方案应用先进的ARM 嵌入式技术,使当前必须由计算机来驱动的打印机,完全脱离了计算
    发表于 08-28 09:36 22次下载

    基于开源软件嵌入式网络打印服务器

    基于开源软件嵌入式网络打印服务器   引 言   目前常用的打印机有两种接口形式:USB口和Eth-ernet网口。由于价格相对较低,USB口的
    发表于 11-27 09:57 2094次阅读
    基于开源<b class='flag-5'>软件</b>的<b class='flag-5'>嵌入式</b>网络<b class='flag-5'>打印</b>服务器

    嵌入式应用的能耗调试技术

    嵌入式应用的能耗调试技术
    发表于 02-12 17:28 888次阅读
    <b class='flag-5'>嵌入式</b>应用<b class='flag-5'>中</b>的能耗<b class='flag-5'>调试</b>技术

    嵌入式软件打印调试信息的方法

    在我们的嵌入式开发,常常把printf重定向到MCU的串口外设,再配合上位机界面软件,通过打印调试信息的方式来
    的头像 发表于 04-04 17:35 3242次阅读

    嵌入式软件的开发流程_嵌入式软件调试

    本文首先介绍了嵌入式软件的发展,其次阐述了嵌入式软件的开发流程,最后介绍了嵌入式软件
    发表于 08-31 16:02 6231次阅读

    嵌入式arm usb打印机完整教程

    嵌入式arm usb打印机完整教程(嵌入式开发实习手册)-该文档为嵌入式arm usb打印机完整教程文档,是一份很不错的参考资料,具有较高参
    发表于 08-04 09:54 32次下载
    <b class='flag-5'>嵌入式</b>arm usb<b class='flag-5'>打印</b>机完整教程

    嵌入式开发实用的宏打印函数

    打印函数在我们的嵌入式开发,使用printf打印一些信息是一种常用的调试手段。但是,在打印
    的头像 发表于 09-16 10:05 1617次阅读
    <b class='flag-5'>嵌入式</b>开发<b class='flag-5'>中</b>实用的宏<b class='flag-5'>打印</b>函数

    嵌入式开发putty串口打印乱码

    目录嵌入式开发putty串口打印乱码编码格式问题波特率设置错误嵌入式开发putty串口打印乱码在使用putty连接串口打印的时候,发现
    发表于 11-02 18:21 12次下载
    <b class='flag-5'>嵌入式</b>开发putty串口<b class='flag-5'>打印</b>乱码

    单片机没有串口时如何打印调试信息

    输出调试信息是嵌入式开发必不可少的调试利器,嵌入式开发的一个特点是很多时候没有操作系统,或者没有文件系统,常规的
    的头像 发表于 03-10 17:19 2560次阅读
    单片机没有串口时如何<b class='flag-5'>打印</b><b class='flag-5'>调试</b>信息

    如何选择(集成)嵌入式热敏打印

    各种自助终端机在集成嵌入式热敏打印机时候应该考虑和关注哪些因素和技术点
    的头像 发表于 08-02 11:07 1759次阅读
    如何选择(集成)<b class='flag-5'>嵌入式</b>热敏<b class='flag-5'>打印</b>机

    (集成)嵌入式热敏打印机的选择

    各种自助终端机在集成嵌入式热敏打印机时候应该考虑哪些因素,关注哪些技术点?选择比较适合的嵌入式热敏打印机。
    发表于 08-09 15:53 3次下载