良许Linux教程网 干货合集 关于嵌入式系统日志打印的建议

关于嵌入式系统日志打印的建议

尽管现在的嵌入式设备配置越来越高,比如在创客圈流行的开发板(如Raspberry Pi、pcduino、Cubieboard、switf board、Beaglebone black、Edison、Galileo)配置相当强大,但与早期的个人电脑相比,性能仍有一定差距。

在这些高配置的开发板上,一个printf函数调用对整个系统的CPU资源消耗相对较小,对系统运行的影响可以忽略不计。然而,对于资源紧张的MCU系统,主频可能只有几十kHz或几百MHz,大量调用日志输出函数(如printf)可能会严重影响系统的运行效率,甚至导致明显的延时等问题。

因此,在开发阶段,我们需要规范日志输出的方式。下面是我个人的一些建议,希望能够相互学习。

首先,尽量避免直接使用系统的输出函数(如printf等)。而是封装自己的日志输出接口,例如:

alex_log( char*pLog,... );

这样子用alex_log();代替printf(),

而在alex_log( )接口里面重定义数据流的接口,可以把数据流导入到uart,tcp,udp,屏幕,任何你想在那个你想看的client端去。

为什么要这么做呢?

这样做可以灵活变化日志的显示终端。

因为嵌入式的运行环境是千千万万的,不像PC或者手机端,大部分都有一个显示屏可以看,如果在一个只有uart口的设备,那么我们可以通过把数据导到uart来,然后通过串口助手工具来查看。

或者对于wifi设备,可以把log导到socket的某个接口,这样不用直接硬件连接,可以在pc或者手机端查看log,等等。

日志格式的规范

"日志模块+日志级别+日志内容”

一下为日志例子:

"LOCALDEBUGGAgent Get Hal wifiStatus :0002”    
"LOCALINFOwifiStatus : 000a new:0002"                  
:CLOUDCRITICALGAgent Cloud Pong …”

那么接口可以这么设计:

alex_log( module,level,const char *format,…  );

参数解说:

moduel:决定摸个函数功能模块的log是否打开。

level: 决定打开的日志级别,debug 信息,还是warning信息,还是error信息,还是普通info.等。

后面剩下的就是变参的输入了,跟printf函数参数一样。

为什么这么设计呢?

1.为什么设置功能模块的日志开关:

当我们的函数设计有多个功能函数模块的时候,模块功能模块出现问题,这个时候想通过log来定位,而这个时候我们只是关心此模块,那么可以先把其他模块的日志功能关闭掉,只是打开关心模块的日志。

不然有A,B,C,D。4个模块,A模块出现问题,那么把B,C,D的日志功能关闭,剩下A模块的功能,当我们看日志的时候,就不用从一大堆日志找出A模块的日志,这样子发现问题的效率就大大提升了。

2.为什么设置日志等级的开关:

日志等级关系到日志的重要性,如果是非常重要的日志,比如error级别,我们在定位问题的时候可以只打开此级别的日志,而不打印普通日志级别的,当我们在处于debug阶段,我们可以把debug功能打开,尽可能看到详细的日志。

而当我们准备发布版本的时候,可以把一些debug信息关闭,或者就是不输出日志。

3.通过开关来关闭或打开日志功能

也就是第二点提到的 module level 设置。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部