当前位置:首页 > 科技  > 软件

好用的嵌入式设备日志输出模块 log.h

来源: 责编: 时间:2023-11-07 09:14:44 376观看
导读相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方

相信大多数嵌入式开发者都会碰到对程序进行调试或者查找BUG的情况,常见的两种方法都是仿真和通过日志进行的。GV928资讯网——每日最新资讯28at.com

有条件仿真的是更好,单是在编写嵌入式软件程序过程中,并不是所有的硬件都支持仿真或者方便仿真,这样大多数方法便是加打印信息进行找问题。GV928资讯网——每日最新资讯28at.com

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

GV928资讯网——每日最新资讯28at.com

目的:GV928资讯网——每日最新资讯28at.com

  • 方便查找打印日志
  • 日志格式规范
  • 可以查看用户添加信息,文件信息,函数接口,以及文件所在行号
  • 支持format格式
  • 可以支持实时时间

基本知识

C语言中的__FILE__、LINE__和__FUNCTION:GV928资讯网——每日最新资讯28at.com

  • FILE 用于指示本行代码所在源文件的文件名;
  • __LINE__用于指示本行代码所在源文件中的位置(行数);
  • __FUNCTION__用于指示本行代码所在函数(函数名);

注:GV928资讯网——每日最新资讯28at.com

  • "FILE "、"LINE"、"FUNCTION"等均大小写敏感
  • 支持需要添加头文件#include

源码

#define DEBUG_EN (1u) #if (DEBUG_EN) #define DEBUG_MAX_SIZE 512extern 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

GV928资讯网——每日最新资讯28at.com

源码主要使用宏定义的方式,为了支持文件、行号,函数等等,不能使用单独的函数进行定义。具体原因可以思考下,不过多赘述。GV928资讯网——每日最新资讯28at.com

C文件目前只有一个数组定义char szBuf[DEBUG_MAX_SIZE];。GV928资讯网——每日最新资讯28at.com

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

当然移植的时候完全可以根据自己的接口和实现方式进行更换。GV928资讯网——每日最新资讯28at.com

实现效果:

[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]

图片图片GV928资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-17409-0.html好用的嵌入式设备日志输出模块 log.h

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用 Python 在视频上渲染文本

下一篇: 虚拟线程原理及性能分析

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 国行版三星Galaxy Z Fold5/Z Flip5发布 售价7499元起

    2023年8月3日,三星电子举行Galaxy新品中国发布会,正式在国内推出了新一代折叠屏智能手机三星Galaxy Z Fold5与Galaxy Z Flip5,以及三星Galaxy Tab S9
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
Top