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

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

3天内不再提示

硬件简单的日志打印方法

科技绿洲 来源:zsky 作者:zsky 2023-06-22 10:08 次阅读

相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。

有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。

打印的接口有很多种,比如串口,网络,显示等等。简单的硬件开发串口估计是最常用的。这里简单记录下一种日志打印方法。

目的:

1)方便查找打印日志

2)日志格式规范

3)可以查看用户添加信息,文件信息,函数接口,以及文件所在行号

4)支持format格式

5)可以支持实时时间

基本知识:

C语言中的__FILE__、LINE__和__FUNCTION

1、FILE 用于指示本行代码所在源文件的文件名;

2、__LINE__用于指示本行代码所在源文件中的位置(行数);

3、__FUNCTION__用于指示本行代码所在函数(函数名);

注:

1)"FILE "、" LINE "、" FUNCTION "等均大小写敏感

2)支持需要添加头文件#include

源码

#define DEBUG_EN (1u)
 
#if (DEBUG_EN)
 
#define DEBUG_MAX_SIZE 512
extern char szBuf[DEBUG_MAX_SIZE];
 
#define DEBUG_INFO( format, ... ) do{\\
    u16 unLen = 0;\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[INFO][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\\
}while(0)
 
#define DEBUG_WARN( format, ... ) do{\\
    u16 unLen = 0;\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[WARN][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\\
}while(0)
 
#define DEBUG_ERR( format, ... ) do{\\
    u16 unLen = 0;\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE, "[ERR][%s][@%s][#%d]:",__FILE__,__FUNCTION__,__LINE__);\\
    unLen += snprintf(szBuf+unLen,DEBUG_MAX_SIZE-unLen, format, ## __VA_ARGS__ );\\
    usart1_send_buf_with_txe((u8 *)szBuf,unLen);\\
}while(0)
 
#elif 
 
#define DEBUG_INFO(...)
#define DEBUG_WARN(...)
#define DEBUG_ERR(...)
 
#endif

源码主要使用宏定义的方式,为了支持文件、行号,函数等等,不能使用单独的函数进行定义。具体原因可以思考下,不过多赘述。

C文件目前只有一个数组定义char szBuf[DEBUG_MAX_SIZE];。

为了兼容,INFO,WARN和ERR三个共用一个buf,声明全局变量更主要的一个原因是使用了串口的中断发送函数usart1_send_buf_with_txe,而不是循环发送完成再退出,这里传输是进行指针传递的,发送使用中断的好处就是高效率,不耽误其他程序跑。

当然移植的时候完全可以根据自己的接口和实现方式进行更换。

实现效果

[INFO][..\\source\\main.c][@main][#36]:testStr[111],testInt[111],testHex[0x000015BC]
[WARN][..\\source\\main.c][@main][#37]:testStr[111],testInt[111],testHex[0x000015BC]
[ERR][..\\source\\main.c][@main][#38]:testStr[111],testInt[111],testHex[0x000015BC]

图片

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

    关注

    11

    文章

    2922

    浏览量

    64781
  • 嵌入式软件
    +关注

    关注

    4

    文章

    227

    浏览量

    26383
  • 日志
    +关注

    关注

    0

    文章

    126

    浏览量

    10526
收藏 人收藏

    评论

    相关推荐

    Labview实现txt文本文件打印简单方法

    新手学NI,为现场做了一个自动记录到txt的小程序,但要求记录到一定量时打印该txt文件,网上只有打印VI和打印EXCEL的一些教程,打电话需求NI官方的帮助,得到的解决方法是转化为W
    发表于 03-19 13:11

    Python日志打印重复解决方法

    Python日志打印重复问题
    发表于 06-12 07:18

    简单记录下最近设计的一种日志打印方法

    仿真,这样大多数方法便是加打印信息进行找问题。打印的接口有很多种,比如串口,网络,显示等等。简单硬件开发串口估计是最常用的。这里
    发表于 01-11 06:09

    STM32的常规打印方法

    常规打印方法 在STM32的应用中,我们常常对printf进行重定向的方式来把打印信息printf到我们的串口助手。在...
    发表于 02-21 06:51

    讲讲调试程序的重要方法打印日志

    今天来讲讲调试程序的重要方法打印日志。无论开发何种程序,单片机,手机APP,电脑客户端,还是服务器,日志都是最基础也是最重要的调试手段。手机APP,电脑客户端和服务器的开发环境往往提
    发表于 06-20 17:14

    数码印像机打印方

    数码印像机打印方式              打印方式实际上就是指数码印像机是采用何种打印技术进行
    发表于 12-23 14:33 757次阅读

    条码打印机的打印方

    条码打印机的打印方式         
    发表于 12-30 11:44 1378次阅读

    票据打印机的打印方

    票据打印机的打印方式              票据打印机是根据打印机的主要用途划分
    发表于 12-30 13:37 1087次阅读

    票据打印机的打印方

    票据打印机的打印方向              打印方向指的是票据打印机在
    发表于 12-30 13:55 953次阅读

    考勤/收费机的打印方

    考勤/收费机的打印方式              就是通常我们所说的根据打印的原理来划分出来的针式打印、喷墨
    发表于 12-30 15:19 676次阅读

    视频打印机的打印方

    视频打印机的打印方式              打印方式指的是产品采用的是哪种打印
    发表于 12-31 10:21 1174次阅读

    基于热敏打印机的心电图形快速打印方法的研究及应用实例

    基于热敏打印机的心电图形快速打印方法的研究及应用实例  目前,我国各医院普遍使用的心电图机绝大多数是机电式的,即通过电极检测心电信号,放大后直接记录
    发表于 02-04 09:57 1097次阅读
    基于热敏<b class='flag-5'>打印</b>机的心电图形快速<b class='flag-5'>打印方法</b>的研究及应用实例

    热敏打印机的心电图形快速打印方法

    12导同步心电图机为例,介绍以普通52单片机为主控芯片应用串行热敏打印机实现多种方式的心电图形打印,并重点描述了12导联同步打印方式的程序实现方案。
    发表于 12-05 10:03 5753次阅读
    热敏<b class='flag-5'>打印</b>机的心电图形快速<b class='flag-5'>打印方法</b>

    关于一种高效printf打印方

    一种高效printf打印方
    的头像 发表于 02-29 16:29 2689次阅读
    关于一种高效printf<b class='flag-5'>打印方</b>式

    选择 3D 医疗打印方法

    选择 3D 医疗打印方法
    的头像 发表于 12-29 10:02 604次阅读