1. 简介

在嵌入式产品开发时,需要存储一些用户数据,如:设备账户密码、SN、校准参数等,可以使用一款叫做EasyFlash的开源轻量级存储库,该存储库资源占用极低,移植简单。

GitHub连接:https://github.com/armink/EasyFlash

2. 移植介绍

2.1 init接口

EfErrCode ef_port_init(ef_env const **default_env, size_t *default_env_size) {
    EfErrCode result = EF_NO_ERR;

    *default_env = default_env_set;
    *default_env_size = sizeof(default_env_set) / sizeof(default_env_set[0]);
	
	// 存储硬件初始化
	drv_flash_init();
    return result;
}

2.2 read接口

EfErrCode ef_port_read(uint32_t addr, uint32_t *buf, size_t size) {
    EfErrCode result = EF_NO_ERR;

	// 存储硬件read接口
	drv_flash_read(addr, size, (uint8_t *)buf);

    return result;
}

2.3 erase接口

EfErrCode ef_port_erase(uint32_t addr, size_t size) {
    EfErrCode result = EF_NO_ERR;
    // 存储硬件erase接口
    drv_flash_erase(addr, size);
    return result;
}

2.4 write接口

EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
    EfErrCode result = EF_NO_ERR;
    // 存储硬件write接口
    drv_flash_write(addr, size, (const uint8_t *)buf);
    return result;
}

2.5 lock接口

void ef_port_env_lock(void) {
    
	//关闭全局中断
   __disable_irq();
}

void ef_port_env_unlock(void) {
    
	//打开全局中断
	__enable_irq();
    
}

2.5 调试日志信息打印接口

在定义PRINT_DEBUG宏后,打印调试日志信息。

void ef_log_debug(const char *file, const long line, const char *format, ...)

2.6 普通日志信息打印接口

void ef_log_info(const char *format, ...)

2.7 无格式信息打印接口

该方法输出无固定格式的打印信息,为ef_print_env方法所用(如果不使用ef_print_env则可以忽略)。而ef_log_debug及ef_log_info可以输出带指定前缀及格式的打印日志信息。

void ef_print(const char *format, ...)

2.8 默认环境变量集合

在 ef_port.c 文件顶部定义有 static const ef_env default_env_set[] ,我们可以将产品上需要的默认环境变量集中定义在这里。当 flash 第一次初始化时会将默认的环境变量写入。

static uint32_t boot_count = 0;
static time_t boot_time[10] = {0, 1, 2, 3};
static const ef_env default_env_set[] = {
        {"username", "armink", 0},   //类型为字符串的环境变量可以设定值的长度为 0 ,此时会在初始化时会自动检测其长度
        {"password", "123456", 0},
        {"boot_count", &boot_count, sizeof(boot_count)},  //整形
        {"boot_time", &boot_time, sizeof(boot_time)},  //数组类型,其他类型使用方式类似
};

3 参数设置

3.1 环境变量功能

  • 默认状态:开启
  • 操作方法:开启、关闭EF_USING_ENV宏即可
3.1.1 自动更新(增量更新)

可以对 ENV 设置版本号。当 ENV 初始化时,如果检测到产品存储的版本号与设定版本号不一致,会自动追加默认环境变量集合中新增的环境变量。

该功能非常适用于经常升级的产品中,当产品功能变更时,有可能会新增环境变量,此时只需要增大当前设定的 ENV 版本号,下次固件升级后,新增的环境变量将会自动追加上去。

  • 默认状态:关闭
  • 操作方法:开启、关闭EF_ENV_AUTO_UPDATE宏即可
3.1.2 环境变量版本号

该配置依赖于 3.1.1 配置。设置的环境变量版本号为整形数值,可以从 0 开始。如果在默认环境变量表中增加了环境变量,此时需要对该配置进行修改(通常加 1 )。

  • 操作方法:修改EF_ENV_VER_NUM宏对应值即可

3.2 在线升级功能

  • 默认状态:开启
  • 操作方法:开启、关闭EF_USING_IAP宏即可

3.3 日志功能

默认状态:开启
操作方法:开启、关闭EF_USING_LOG宏即可

3.4 Flash 擦除粒度(最小擦除单位)

操作方法:修改EF_ERASE_MIN_SIZE宏对应值即可,单位:byte

3.5 Flash 写入粒度

操作方法:修改EF_WRITE_GRAN宏对应值即可,单位:bit,仅支持:1/8/32

3.6 备份区

备份区共计包含3个区域,依次为:环境变量区、日志区及在线升级区。

4 API介绍

有关EasyFlash库的API使用,可参考以下链接:

https://github.com/armink/EasyFlash/blob/master/docs/zh/api.md

5 最后

在使用开源库的时候,尽量要弄清其设计原理与思想,以便后期针对产品需求,对其进行修改与完成,同时可学习下大佬的设计思想,了解EasyFlash设计思想,可阅读以下链接接:

https://github.com/armink/EasyFlash/blob/master/docs/zh/design.md
https://mculover666.blog.csdn.net/article/details/105715982

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐