网站建设公司有,as3 xml 网站模板 下载,南通百度网站快速优化,网站开发内部工单1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库#xff0c;非常适合对资源敏感的软件项目。例如#xff1a;IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库#xff0c;EasyLogger的功能更加简单#xff0c;提供给用户的接口更少#xff0c;但… 1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库非常适合对资源敏感的软件项目。例如IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库EasyLogger的功能更加简单提供给用户的接口更少但上手会很快更多实用功能支持以插件形式进行动态扩展。
目前EasyLogger支持以下功能 日志输出方式支持串口、Flash、文件等 日志内容可包含级别、时间戳、线程信息、进程信息等 支持多种操作系统支持裸机 各级别日志支持不同颜色显示
EasyLogger的GitHub代码地址GitHub - armink/EasyLogger: An ultra-lightweight(ROM1.6K, RAM0.3k), high-performance C/C log library. | 一款超轻量级(ROM1.6K, RAM0.3k)、高性能的 C/C 日志库https://github.com/armink/EasyLogger
2、移植EasyLogger过程 2.1整体的移植思路 1添加源码到裸机工程中 2实现需要的接口 2.2 具体添加源码到工程的操作 在移植的时候可以参考从上面的链接中下载的ZIP文件解压出来的EasyLogger-master项目的readme文档和demo工程。 通过这些可以对EasyLogger有一个大致的了解。docs中的API和port中的kernel.md有对于EasyLogger 核心功能移植说明和EasyLogger 核心功能 API 说明。重点看一下这部分 然后准备一份裸机工程文件将printf重定向到串口打印准备好之后开始移植easylogger。 首先是将下载好的开源文件中的easylogger复制到裸机工程中。本人使用的是STM32F407芯片的板子仅有LED和串口两部分的代码 将这个部分的源码复制到准备好的裸机工程的third_lib文件夹下。然后打开keil工程进行添加easylogger组件的源码文件。 port/elog_port.celog移植接口文件 src/elog.c elog核心功能源码 src/elog_utils.celog所用到的一些c库工具函数实现 src/elog_buf.c可选添加elog缓冲输出模式源码 src/elog_async.c可选添加elog异步输出模式源码 在像上图中添加了以后再将easylogger/inc的头文件路径添加到keil中。如下图 对于串口的重定向部分的代码如下(后续的输出日志信息要使用printf函数所以需要进行添加这个串口重定向代码)
int fputc(int ch, FILE *stream)
{/* 堵塞判断串口是否发送完成 */while((USART1-ISR 0X40) 0);/* 串口发送完成将该字符发送 */USART1-TDR (uint8_t) ch;return ch;
}
我将这部分代码放到了elog_port.c文件中如下图 2.3 实现elog移植接口 elog的移植接口都已经写好了在elog_port.c文件中只需要在函数体中添加代码即可。
① elog初始化接口
ElogErrCode elog_port_init(void);如果涉及到后续elog使用资源的初始化比如动态申请分配缓冲区内存可以放在此接口中本文中保持默认。这个暂时不需要调用因为该接口会在调用elog_init函数中被调用。 ② elog日志输出接口重点
//开头添加
#include stdio.h
....void elog_port_output(const char *log, size_t size) {/* add your code here *///日志使用printf输出printf已经重定向到串口USART1printf(%.*s, size, log); //%s表示字符串输出.十进制数是精度控制格式符输出字符时表示输出字符的位数
}③ 日志输出上锁/解锁接口 该接口可以对日志输出接口进行上锁/解锁以保证日志在并发输出时的正确性本文中使用的是裸机程序所以在此使用关闭全局中断来加锁打开全局中断来解锁STM32开关全局中断的方式很多这里是直接操作 PRIMASK 寄存器来快速的屏蔽/打开全局中断
//开头添加
#include stm32f4xx.hvoid elog_port_output_lock(void) {/* add your code here *///关闭全局中断__set_PRIMASK(1); //使用的是裸机程序所以在此使用关闭全局中断来加锁打开全局中断来解锁
}/*** output unlock*/
void elog_port_output_unlock(void) {/* add your code here *///开启全局中断__set_PRIMASK(0);
}
④ 系统信息获取接口 elog提供了三个接口用来获取当前时间、获取进程号、获取线程号因为本文中移植到裸机工程中并且没有提供时间支持所以这三个接口都返回空字符串。
/*** get current time interface** return current time*/
const char *elog_port_get_time(void) { //elog提供了三个接口用来获取当前时间、获取进程号、获取线程号因为本文中移植到裸机工程中并且没有提供时间支持所以这三个接口都返回空字符串/* 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 ;}2.4 配置elog elog的核心功能开启宏定义和核心参数宏定义都在配置文件elog_cfg.h中下面讲述其中重要的宏定义。 这三个地方要特别的注意第一个是日志输出的总开关该宏必须要在这里进行定义。第二个是换行符宏定义修改成\r\n。第三个是带有颜色的日志输出开关在这里进行定义。 移植时并没有添加异步输出和缓冲区输出的源码所以将这两个功能关掉到此为止就算移植并且配置完成了下面就可以进行使用了。
3、使用EasyLogger 3.1. 初始化elog elog使用之前需要初始化过程有三步 ① 初始化elog /* 初始化elog */
void elog_init(void); ② 设置日志输出格式
void elog_set_fmt(uint8_t level, size_t set); 其中第一个参数表示设置哪个日志输出级别对应的输出格式其二个参数是日志输出格式枚举给出可以自由组合搭配。 ③ 启动elog
void elog_start(void);
接下来在main函数中的串口初始化函数之后while(1)之前编写elog初始化代码 /* 初始化elog */elog_init();elog_set_text_color_enabled(true); //要想五彩缤纷的日志仅在elog_cfg.h中使能颜色输出还不够还需要使用API开启输出/* 设置每个级别的日志输出格式 *///输出所有内容elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL);//输出日志级别信息和日志TAGelog_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);/* 启动elog */elog_start(); 3.2. elog日志输出 elog中每种级别都有一种完整方式两种简化方式使用时自行选择
#define elog_assert(tag, ...)
#define elog_a(tag, ...) //简化方式1每次需填写 LOG_TAG
#define log_a(...) //简化方式2LOG_TAG 在文件顶部定义使用前无需填写 LOG_TAG 比如上面这个elog_assert函数就有两种表达方法我选择的是简化方式2。前两种在使用的时候只需要包含elog.h头文件即可第三种方式除了包含头文件之外还需要在文件开始定义TAG宏定义使用起来和printf相同。 首先在main.c文件开始定义TAG宏包含头文件 #define LOG_TAG main //使用简化方式2LOG_TAG 在文件顶部定义使用前无需填写 LOG_TAG必须是在下面包含的头文件前进行定义因为程序顺序执行
#include elog.h
然后在main函数中编写的elog初始化代码之后继续添加代码测试elog的使用 log_a(Hello EasyLogger!);log_e(Hello EasyLogger!);log_w(Hello EasyLogger!);log_i(Hello EasyLogger!);log_d(Hello EasyLogger!);log_v(Hello EasyLogger!);
然后再进行编译烧写使用串口助手查看串口输出 另外串口助手无法显示颜色如果想要输出有颜色的日志请使用使用串口终端Mobaxterm查看串口输出