打印
[其他]

(分享)MM32F013x——移植EasyLogger组件

[复制链接]
3589|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2021-7-14 15:49 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本篇通过移植开源的EasyLogger组件结合EasyFlash,使用MM32F013x内置空闲的FLASH存储空间来实现LOG日志的存储记录,使用芯片自带的RTC功能使日志在存储的时候带有日期和时间信息。
EasyLogger介绍
EasyLogger是一款超轻量级、高性能的C/C++日志库,非常适合对资源敏感的软件项目。相比于log4c、zlog这些知名的C/C++日志库,EasyLogger的功能更加简单,提供给用户的接口更少,但上手会很快,更多实用功能支持以插件(Flash、File等)形式进行动态扩展。

使用特权

评论回复
沙发
cr315|  楼主 | 2021-7-14 15:52 | 只看该作者
EasyLogger主要特性
  • 支持用户自定义输出方式(例如:终端、文件、数据库、串口、RS-485、Flash等等)
  • 日志内容可包含级别、时间戳、线程信息、进程信息等
  • 日志输出被设计为线程安全的方式,并支持异步输出和缓冲输出模式
  • 支持多种操作系统(例如:RT-Thread、uCOS、Linux、Windows等等),也支持裸机平台
  • 日志支持RAW格式(未经过格式化的原始日志)、支持HEXDUMP
  • 支持按标签、级别、关键词进行动态过滤
  • 各级别日志支持不同颜色显示,用户也可以根据自己的喜好,在 elog_cfg.h 对各个级别日志的颜色及字体风格进行单独设置
  • 扩展性强,支持以插件的形式扩展新功能

使用特权

评论回复
板凳
cr315|  楼主 | 2021-7-14 15:54 | 只看该作者
EasyLogger资源占用
最低要求:ROM < 1.6KB,RAM < 0.3KB。

EasyLogger移植说明
下载最新的EasyFlash源代码:
https://github.com/ARMink/EasyLogger

使用特权

评论回复
地板
cr315|  楼主 | 2021-7-14 15:55 | 只看该作者
01
添加EasyLogger源文件
将\easylogger\目录下的inc、src、port及plugins文件夹拷贝到项目中:

使用特权

评论回复
5
cr315|  楼主 | 2021-7-14 15:58 | 只看该作者
02
添加工程文件
添加\ easylogger \src\、\ easylogger \port\、\ easylogger \plugins\flash文件夹下的源文件到项目工程目录中:

使用特权

评论回复
6
cr315|  楼主 | 2021-7-14 15:58 | 只看该作者
03
添加路径
根据项目需求,选择性添加\ easylogger \src\中的其他源码文件,\easylogger\inc\和\ easylogger \plugins\flash文件夹到编译的头文件目录列表中;


EasyLogger接口移植

使用特权

评论回复
7
自己造声卡| | 2021-7-14 16:53 | 只看该作者
可以分享到网盘上吗?git我还是上不去。

使用特权

评论回复
8
cr315|  楼主 | 2021-7-14 17:11 | 只看该作者
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();
    }
}

使用特权

评论回复
9
cr315|  楼主 | 2021-7-14 17:22 | 只看该作者
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);
}

使用特权

评论回复
10
cr315|  楼主 | 2021-7-14 17:23 | 只看该作者
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("\r\nelog_flash read \r\n"); elog_flash_output_all();
    }
    else if(!strcmp(argv, "clean"))
    {
        printf("\r\nelog_flash clean\r\n"); elog_flash_clean();
    }
    else if(!strcmp(argv, "flush"))
    {
        printf("\r\nelog_flash flush\r\n"); elog_flash_flush();
    }
    else
    {
        printf("\r\nelog_flash error\r\n");
    }
}
SHELL_EXPORT_CMD(elog_flash, EasyLogger_SHELL_elog_flash, EasyLogger read/clean/flush flash log);

使用特权

评论回复
11
cr315|  楼主 | 2021-7-14 17:25 | 只看该作者
运行测试
01
下载程序后
待EasyFlash成功初始化完成后,再进行EasyLogger的初始化和配置,并记录Info类型日志信息,如下图所示:

02
elog功能测试
在命令行窗口中,我们输入TAB按键可以查看当前程序支持的SHELL命令;我们通过elog_test命令来进行log信息的更新和记录,通过elog_flash flush命令来将当前的log日志信息存储到用户自定义规划的MM32F013x芯片片内Flash空间,使用elog_flash clean命令来清除存储在Flash内的所有log日志信息,使用elog_flash read命令可以将存储在Flash内的所有log日志信息读取出来;测试过程如下图所示:

本次实验参考代码:
https://github.com/Samplecode-MM32/MM32MCU_Code


使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1324

主题

3809

帖子

0

粉丝