完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
`在上篇文章中我们介绍了EasyFlash组件三大功能中的ENV功能及使用,本篇通过移植开源的EasyLogger组件结合EasyFlash,使用MM32F013x内置空闲的FLASH存储空间来实现LOG日志的存储记录,使用芯片自带的RTC功能使日志在存储的时候带有日期和时间信息。 EasyLogger介绍 EasyLogger是一款超轻量级、高性能的C/C++日志库,非常适合对资源敏感的软件项目。相比于log4c、zlog这些知名的C/C++日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件(Flash、File等)形式进行动态扩展。 EasyLogger主要特性
EasyLogger资源占用 最低要求:ROM < 1.6KB,RAM < 0.3KB。 EasyLogger移植说明 下载最新的EasyFlash源代码: https://github.com/ARMink/EasyLogger 01 添加EasyLogger源文件 将easylogger目录下的inc、src、port及plugins文件夹拷贝到项目中: 02 添加工程文件 添加 easylogger src、 easylogger port、 easylogger pluginsflash文件夹下的源文件到项目工程目录中: 添加路径 根据项目需求,选择性添加 easylogger src中的其他源码文件,easyloggerinc和 easylogger pluginsflash文件夹到编译的头文件目录列表中; 01 初始化和配置 easyflash_init初始化EasyLogger移植所需的资源等等。在easyflash_init成功后,我们再来进行easylogger的初始化和配置操作。 /******************************************************************************* * @Brief * @param * @retval * @attention *******************************************************************************/ int main(void) { InitSystem(); if(easyflash_init() == EF_NO_ERR) { EasyFlash_ENV_Demo(); if(elog_init() == EF_NO_ERR) { elog_set_fmt(ELOG_LVL_ASSERT, ELOG_FMT_ALL & ~ELOG_FMT_P_INFO); elog_set_fmt(ELOG_LVL_ERROR, ELOG_FMT_LVL | (ELOG_FMT_TAG | ELOG_FMT_tiME)); elog_set_fmt(ELOG_LVL_WARN, ELOG_FMT_LVL | (ELOG_FMT_TAG | ELOG_FMT_TIME)); elog_set_fmt(ELOG_LVL_INFO, ELOG_FMT_LVL | (ELOG_FMT_TAG | ELOG_FMT_TIME)); elog_set_fmt(ELOG_LVL_DEBUG, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO)); elog_set_fmt(ELOG_LVL_VERBOSE, ELOG_FMT_ALL & ~(ELOG_FMT_FUNC | ELOG_FMT_P_INFO)); /* set EasyLogger assert hook */ elog_assert_set_hook(elog_user_assert_hook); /* initialize EasyLogger Flash plugin */ elog_flash_init(); /* start EasyLogger */ elog_start(); } } while(1) { TASK_Scheduling(); } } 02 elog接口输出 日志最终输出的末端接口,可以在里面增加输出到终端、输出到文件、输出到Flash等方法。 /** * 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); elog_flash_write(log, size); } 03 elog获取时间信息 返回当前时间,将会显示在日志中。 /** * get current time interface * * @Return current time */ const char *elog_port_get_time(void) { /* add your code here */ memset(elog_time, 0, sizeof(elog_time)); sprintf(elog_time, "%d-%02d-%02d %02d:%02d:%02d", RTC_Calendar.year, RTC_Calendar.month, RTC_Calendar.day, RTC_Calendar.hour, RTC_Calendar.minute, RTC_Calendar.second); return elog_time; } 参数设置 配置时需要修改项目中的elog_cfg.h文件,开启、关闭、修改对应的宏即可。 可以配置内容参数有输出开关、输出级别、断言开关、每行日志缓冲大小、行号最大长度、过滤标签最大长度、过滤关键字最大长度、标签+级别过滤器的最大数目、换行符、颜色和异步输出模式等,具体的配置参数方式可以参考链接。 开启缓冲输出模式后,如果缓冲区不满,用户线程在进行日志输出时,无需等待日志彻底输出完成,即可直接返回。但当日志缓冲区满以后,将会占用用户线程,自动将缓冲区中的日志全部输出干净。同时用户也可以在非日志输出线程,通过定时等机制使用 void elog_flush(void) 将缓冲区中的日志输出干净。 操作方法: 开启、关闭ELOG_BUFF_OUTPUT_ENABLE宏即可 默认大小: (ELOG_LINE_BUF_SIZE * 10) ,不定义此宏,将会自动按照默认值设置 操作方法: 修改ELOG_BUF_OUTPUT_BUF_SIZE宏对应值即可 /* EasyLogger flash log plugin's RAM buffer size */ #define ELOG_FLASH_BUF_SIZE 1024 /* @NOTE you must define it for a value */ 测试验证 我们使用了芯片内部的RTC功能,在日志存储的时候记录了当前系统的日期和时间;结合EasyFlash我们将EasyLogger的日志记录存储到片内FLASH空间,这样在芯片重启后仍能查询到之前日志信息。同时我们将需要测试的函数注册到Shell命令中,通过调用Shell命令可以便捷的进行调试过程。 01 编写elog测试记录 /******************************************************************************* * @brief * @param * @retval * @attention *******************************************************************************/ void EasyLogger_SHELL_elog_test(void) { log_a("Hello EasyLogger!"); /* 断言Assert */ log_e("Hello EasyLogger!"); /* 错误Error */ log_w("Hello EasyLogger!"); /* 警告Warn */ log_i("Hello EasyLogger!"); /* 信息Info */ log_d("Hello EasyLogger!"); /* 调试Debug */ log_v("Hello EasyLogger!"); /* 详细Verbose */ } SHELL_EXPORT_CMD(elog_test, EasyLogger_SHELL_elog_test, EasyLogger test); 02 编写elog操作Flash插件的函数 /******************************************************************************* * @brief * @param * @retval * @attention *******************************************************************************/ void EasyLogger_SHELL_elog_flash(char *argv) { if(!strcmp(argv, "read")) { printf(" elog_flash read "); elog_flash_output_all(); } else if(!strcmp(argv, "clean")) { printf(" elog_flash clean "); elog_flash_clean(); } else if(!strcmp(argv, "flush")) { printf(" elog_flash flush "); elog_flash_flush(); } else { printf(" elog_flash error "); } } SHELL_EXPORT_CMD(elog_flash, EasyLogger_SHELL_elog_flash, EasyLogger read/clean/flush flash log); 运行测试 01 下载程序后 待EasyFlash成功初始化完成后,再进行EasyLogger的初始化和配置,并记录Info类型日志信息,如下图所示: elog功能测试 在命令行窗口中,我们输入TAB按键可以查看当前程序支持的SHELL命令;我们通过elog_test命令来进行log信息的更新和记录,通过elog_flash flush命令来将当前的log日志信息存储到用户自定义规划的MM32F013x芯片片内Flash空间,使用elog_flash clean命令来清除存储在Flash内的所有log日志信息,使用elog_flash read命令可以将存储在Flash内的所有log日志信息读取出来;测试过程如下图所示: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2243个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11452 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5893 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
10779 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4550 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4268 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
934浏览 1评论
758浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-1 19:56 , Processed in 0.557418 second(s), Total 64, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号