虽然现在的嵌入式设备配置越来越高。
比如目前在创客圈比较流行且配置比较高的有:
这些开发板跟早期的pc来说,性能有得一比,一个printf可以对整个系统来说,占用的cup资源不会很多,对这个系统的运行影响基本可以忽略不计。
但是如果在系统资源比较紧缺的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 设置。
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。
注意
由于微信公众号近期改变了推送规则,为了防止找不到,可以星标置顶,这样每次推送的文章才会出现在您的订阅列表里。
猜你喜欢:
实用 | 10分钟教你搭建一个嵌入式web服务器
嵌入式设备AP配网实例分享
嵌入式Linux单板连接飞燕物联网平台
分享一种灵活性很高的协议格式(附代码例子)
嵌入式大杂烩周记 | 第 16 期
嵌入式大杂烩周记 | 第 15 期
访问非法内存为什么不会出错?
嵌入式大杂烩周记 | 第 14 期
分享几个实用的代码片段(第二弹)
分享一种你可能不知道的bug定位方法
分享一种修改配置文件的方法
《嵌入式大杂烩周记第 13 期:lz4》
《嵌入式并行多线程处理器,了解一下!》
《分享一种修改配置文件的方法》
《分享几个实用的代码片段(附代码例子)》
《废旧板子再利用:搭建无线调试环境!》
《嵌入式段错误的3种调试方法汇总!》
《简说TCP通信非阻塞接收(附代码例子)》
《TCP通信常用接口的使用封装》
《嵌入式软件中,总线错误的坑?替大家先踩一步》
《分享嵌入式软件调试方法及几个有用的工具!》
《分享两点提高编程能力的建议!》
在公众号聊天界面回复1024,可获取嵌入式资源;回复 m ,可查看文章汇总