ulog+EasyFlash使用笔记

背景介绍

ulog是用来打印日志的,EasyFlash是用来存储数据的,这两个软件包加在一起,就可以实现日志的掉电保存功能,并且支持日志打印等级的动态设置,这些等级等级可以存储在EasyFlash中,这样不需要每次上电都设置一次调试等级。

问题介绍

移植成功EasyFlash+ulog以后,我直接就在main函数中初始化了EasyFlash,因为EasyFlash依赖FAL,因此也需要先初始化FAL。而ulog是自动初始化的,我就没有对他进行初始化了。如下所示,

int main(void)
{
    fal_init();
    easyflash_init();
	
    while (1)
    {
        rt_thread_mdelay(10);
    }
}

然后发现使用ulog_lvl命令设置的过滤等级在重启以后失效了,如下所示,

2222.gif

排查过程

经过排查发现,当我们添加了软件包ulog_easyflash以后,查找INIT_APP_EXPORT这个自动初始化机制,会发现有两个相关的函数会自动初始化,请看下图
1.jpg

ulog_ef_backend_init函数会将EasyFlash注册到ulog中,这样打印的时候,会同时将日志写入EasyFlash。因此,我们必须在此之前将EasyFlash初始化。

int ulog_ef_backend_init(void)
{
    flash_backend.output = ulog_easyflash_backend_output;//日志的输出函数,会写EasyFlash

    ulog_backend_register(&flash_backend, "easyflash", RT_TRUE);

    return 0;
}

ulog_ef_filter_cfg_load函数会将EasyFlash中的参数读取出来,例如调试全局过滤等级、全局标签等级等等。这里面会读取EasyFlash的数据,所以我们必须在此之前将EasyFlash初始化。

int ulog_ef_filter_cfg_load(void)
{
    char *value;

    /* restore the saving global level */
    if ((value = ef_get_env(ENV_FILTER_GLOBAL_LVL_NAME)) != NULL)//读取全局过滤等级,这里会去读取easyflash上的数据
    {
        ulog_global_filter_lvl_set(atoi(value));
    }

    /* restore the saving global tag */
    if ((value = ef_get_env(ENV_FILTER_GLOBAL_TAG_NAME)) != NULL)//读取全局标签过滤等级,这里会去读取easyflash上的数据
    {
        ulog_global_filter_tag_set(value);
    }

    ...

    return 0;
}

解决办法

基于以上两点,我这里使用INIT_COMPONENT_EXPORT初始化机制,将EasyFlash在组件这层进行初始化,这样可以保证它初始化在INIT_APP_EXPORT之前。如下所示:
5.png

2.jpg

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值