做软件写代码的时候不管你的段位有多高,Debug版本的代码该加打印的还是要加打印来定位一些bug,发布Release的版本的时候关闭打印即可,程序猿👨💻想想在日常码代码的时候没有打印怎么调试代码呢
在我遇到EasyLogger之前呢,我的打印都是这样的
当我在里面去查找我们添加的一些特殊的打印信息的时候就不得不推一推我的“老花镜”,然而这还只是我的初始化的log输出,看完整个运行过程后通常需要去挂个眼科的专家号👀,懂得都懂~
特别是要在定位bug的时候为了捕捉几条Error信息,简直大海捞针,虽然我们可以加一些特殊的打印让我们快速的找到log位置所在,但多多少少有点费。
我们一般在加打印的时候都是通过__func__, __FILE__, __LINE__,等等输出我们的打印,再去把打印头固定下,分为Debug_Info()、Debug_Error()等等,但终归不是什么好方法。
-----------------------------------强力分割线------------------------------
下面开始请出本次文章的主角--"EasyLogger"
本篇文章分为以下几个部分:
- 1、Easylogger简介
- 2、Easylogger在MCU上的移植
- 3、Easylogger的实际运行效果展示
1、Easylogger简介
Easylogger是一款非常轻量级的打印输出开源库,小编测试过移植前后MCU的RAM和FLASH的大小变化,差不多只要5K的空间即可,我们经常使用的单片机基本上也都是64K、128K的RAM, 128K、512K等等的FLASH,是完全足够运行Easylogger了,重要的是,你调试完之后可以把他关掉呀,通过宏定义裁剪代码,那就等于没占RAM和FLASH,那不是更香?
反正不管你们觉得香不香的,小编已经上车啦,在车上的小编觉得很nice,以后定位bug应该会少掉几根宝贵的毛发了,懂得都懂~
Easylogger还可以在FreeRTOS、UCOS、Linux、裸机上都可以正常运行输出log,香气值+999
下面的内容来自百度百科:
EasyLogger [1] 是一款超轻量级、高性能的C日志库,非常适合对资源敏感的软件项目,例如:IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件形式进行动态扩展。
https://baike.baidu.com/item/EasyLogger/20787632?fr=aladdin
2、Easylogger在MCU上的移植
本次移植在国产的单片机上移植实现(国民科技的N32G455REL7),其他的单片机也是类似的方法,移植很简单,就三个文件。
-> 移植第一步:准备Easylogger的开源库的包
(关注公众号后回复:Easylogger即可获得)这里插入快捷通道~
嵌入式学习之路
记录个人学习嵌入式的心路历程,有缘相遇,共同进步.
39篇原创内容
公众号
-> 移植第二步:准备一个工程,实现串口的打印输出,重定向fput()函数,能使用printf打印。
重定向的实现如下:
int fputc(int ch, FILE* f) { while(!USART_GetFlagStatus(USART1, USART_FLAG_TXDE)); USART_SendData(USART1, (uint8_t)ch); return ch; }
然后勾选Keil的Use MicroLib库即可。
在上述准备做完后我们就开始正式往工程中添加Easylogger的开源库。
把easlogger文件夹放入工程目录下:
在Keil中添加easylogger的源码文件,主要有以下几个文件,最后两个我们可以选择添加,我这里没有使用到就不添加啦。
port/elog_port.c
:easylogger移植接口文件。src/elog.c
:easylogger核心功能源码。src/elog_utils.c
:easylogger用到的一些c库工具函数实现。src/elog_buf.c
(可选添加):easylogger缓冲输出模式源码。src/elog_async.c
(可选添加):easylogger异步输出模式源码。
添加后的效果如下:
源文件添加完成后我们还需要添加一下easylogger的头文件,在keil中包含路径进去,如下:
至此代码就添加完成啦
那么我们来编译一下,发现有很多的错误和警告,不要慌,一步一步来,很快就好!
首先在keil中把这里改成--c99
然后再elog_port.c中添加函数主体代码
/** * output log port interface * * @param log output of log * @param size log size */ void elog_port_output(const char *log, size_t size) { /* add your code here */ printf("%.*s", size, log); }
%s表示字符串输出,.<十进制数>是精度控制格式符,输出字符时表示输出字符的位数,在精度控制时,小数点后的十进制数可以使用*来占位,在后面提供一个变量作为精度控制的具体值。
下面三个函数接口因为我们是裸机的工程,没有使用到,因此直接返回空
分别是获取系统时间、进程信息、线程信息
/** * get current time interface * * @return current time */ const char *elog_port_get_time(void) { /* add your code here */ return ""; } /** * get current process name interface * * @return current process name */ const char *elog_port_get_p_info(void) { /* add your code here */ return ""; } /** * get current thread name interface * * @return current thread name */ const char *elog_port_get_t_info(void) { /* add your code here */ return ""; }
下面我们再来配置一下elog_cfg.h文件,我们来简单看下几个重要的宏定义
/* enable log output. */ #define ELOG_OUTPUT_ENABLE /* 日志输出使能 */
换行符的宏定义修改一下,如下:
/* output newline sign */ #define ELOG_NEWLINE_SIGN
使能颜色的宏定义
/* enable log color */ #define ELOG_COLOR_ENABLE
还有一点不要忘记咯,由于我们在移植的时候没有添加异步输出和缓冲区输出的源文件,因此,我们需要在配置文件中把这两个宏定义屏蔽掉。
然后我们再次编译。0-Error 0-Warning,Nice.
下面我就来使用一下这个Easylogger的打印看下效果,我直接把初始化的代码贴出来,大家可以直接拿去使用啦。
我们先不使能颜色输出看下效果。
/* * 函数名称:Easylogger_Init * 输入参数:None * 返 回 值:None * 作 者:Barry * 功能描述:初始化Easylogger打印,配置log输出的颜色、字体、输出内容等 * 修改记录:None */ void Easylogger_Init(void) { #if(EASYLOGGER_ENABLE == 1) /* 初始化Easylogger */ elog_init(); /* 使能颜色输出 */ //elog_set_text_color_enabled(true); /* 输出所有内容 */ elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL); /* 输出日志级别信息和日志TAG */ elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | ELOG_FMT_TAG); elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | ELOG_FMT_TAG); elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | ELOG_FMT_TAG); /* 除了时间、进程信息、线程信息之外,其余全部输出 */ elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_TIME | ELOG_FMT_P_INFO | ELOG_FMT_T_INFO)); /* 输出所有内容 */ elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL); /* 启动Easylogger */ elog_start(); #endif }
添加初始化代码之后如下
我们再来添加几条打印信息看下效果
log_a("This is assert log output!"); log_e("This is error log output!"); log_w("This is warning log output!"); log_i("This is info log output!"); log_d("This is debug log output!"); log_v("This is verbose log output!");
上面分别演示了断言、错误、警告、信息、调试、冗余的log输出。
到这里我们只是完成了Easylogger的输出,但还没有使用到其精髓,我们再来使能下颜色输出看下吧。效果如下:
从上图可以看出,每种打印都有他各自的颜色,我们在使用的时候就能很轻松的更具颜色定位log位置。
比如错误信息是大红的,我们这时候再寻找错误信息只需要找到大红色的那一行log即可。
到这里可能会有小伙伴会问,你这是什么串口助手,安利一下吧:Mobaxterm,做Linux的应该都知道,多么好用,懂得都懂~
使用方法的话大家去百度就好啦,这里就不详细介绍啦。
有点偏题了,我们再来看一下Easylogger的另外一个功能,闪烁:
???
log还能闪烁?
是的。
那我们来看下怎么操作吧。
在elog_cfg.h文件中找到这个宏,把错误信息改成blink blink的闪烁(其他的打印也可以改,只是小编一般喜欢错误信息blink blink的)
就没啦。就这一个宏,改完后我们来看下效果吧。
相当的nice啊!
至此移植全部结束啦。可以开启你的彩色log啦,据说有了这个打印输出,你的代码就没有bug了哦!
对啦,记得需要EasyLogger库的小伙伴们关注公众号回复“Easylogger”即可获取哦!再放一次地址。
记录个人学习嵌入式的心路历程,有缘相遇,共同进步.
39篇原创内容
公众号
好啦,创作不易,记得点赞、收藏、在看、转发之后再走哦,您的支持是小编坚持分享技术的最大的动力。
如果您还有什么想要小编分享的,可以评论区留言哦,小编都尽量满足你的好学心。