EasyFlash - 嵌入式小型数据库学习
在嵌入式产品开发时,需要存储一些用户数据,如:设备账户密码、SN、校准参数等,可以使用一款叫做EasyFlash的开源轻量级存储库,该存储库资源占用极低,移植简单。
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
更多推荐
所有评论(0)