轻量级嵌入式数据库FlashDB的介绍与使用

[复制链接]
1805|7
手机看帖
扫描二维码
随时随地手机跟帖
keer_zu|  楼主 | 2021-10-26 09:50 | 显示全部楼层 |阅读模式
一、FlashDB的介绍
FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。 FlashDB 提供两种数据库模式: 键值数据库 和 时序数据库。
二、移植
定义 flash 设备
在定义 Flash 设备表前,需要先定义 Flash 设备。可以是片内 flash, 也可以是片外基于 SFUD 的 spi flash:
定义片内 flash 设备可以参考 fal_flash_stm32f2_port.c 。
定义片外 spi flash 设备可以参考 fal_flash_sfud_port.c 。
定义具体的 Flash 设备对象,用户需要根据自己的 Flash 情况分别实现 init、 read、 write、 erase 这些操作函数:
static int init(void):可选 的初始化操作。
static int read(long offset, uint8_t *buf, size_t size):读取操作。
offset 读取数据的 Flash 偏移地址
buf 存放待读取数据的缓冲区
size 待读取数据的大小
return 返回实际读取的数据大小
static int write(long offset, const uint8_t *buf, size_t size) :写入操作。
offset 写入数据的 Flash 偏移地址
buf 存放待写入数据的缓冲区
size 待写入数据的大小
return 返回实际写入的数据大小
static int erase(long offset, size_t size) :擦除操作
offset 擦除区域的 Flash 偏移地址
size 擦除区域的大小
return 返回实际擦除的区域大小


使用特权

评论回复
keer_zu|  楼主 | 2021-10-26 09:50 | 显示全部楼层
用户需要根据自己的 Flash 情况分别实现这些操作函数。在文件最底部定义了具体的 Flash 设备对象 ,如下示例定义了 stm32f2 片上 flash:stm32f2_onchip_flash

const struct fal_flash_dev stm32f2_onchip_flash =
{
    .name       = "stm32_onchip",
    .addr       = 0x08000000,
    .len        = 1024*1024,
    .blk_size   = 128*1024,
    .ops        = {init, read, write, erase},
    .write_gran = 8
};
/*
"stm32_onchip" : Flash 设备的名字。

0x08000000: 对 Flash 操作的起始地址。

1024*1024:Flash 的总大小(1MB)。

128*1024:Flash 块/扇区大小(因为 STM32F2 各块大小不均匀,所以擦除粒度为最大块的大小:128K)。

{init, read, write, erase} :Flash 的操作函数。 如果没有 init 初始化过程,第一个操作函数位置可以置空。

8 : 设置写粒度,单位 bit, 0 表示未生效(默认值为 0 ),该成员是 fal 版本大于 0.4.0 的新增成员。各个 flash 写入粒度不尽相同,可通过该成员进行设置,以下列举几种常见 Flash 写粒度:

nor flash: 1 bit
stm32f2/f4: 8 bit
stm32f1: 32 bit
stm32l4: 64 bit
*/


使用特权

评论回复
keer_zu|  楼主 | 2021-10-26 09:50 | 显示全部楼层
定义 flash 设备表
Flash 设备表定义在 fal_cfg.h 头文件中,定义分区表前需 新建 fal_cfg.h 文件 ,请将该文件统一放在对应 BSP 或工程目录的 port 文件夹下,并将该头文件路径加入到工程。
设备表示例:
/* ===================== Flash device Configuration ========================= */
extern const struct fal_flash_dev stm32f2_onchip_flash;
extern struct fal_flash_dev nor_flash0;

/* flash device table */
#define FAL_FLASH_DEV_TABLE                                          \
{                                                                    \
    &stm32f2_onchip_flash,                                           \
    &nor_flash0,                                                     \
}
Flash 设备表中,有两个 Flash 对象,一个为 STM32F2 的片内 Flash ,一个为片外的 Nor Flash。



使用特权

评论回复
keer_zu|  楼主 | 2021-10-26 09:51 | 显示全部楼层
定义 flash 分区表
分区表也定义在 fal_cfg.h 头文件中。Flash 分区基于 Flash 设备,每个 Flash 设备又可以有 N 个分区,这些分区的集合就是分区表。在配置分区表前,务必保证已定义好 Flash 设备 及 设备表。
分区表示例:
#define NOR_FLASH_DEV_NAME             "norflash0"
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE                                                               \
{                                                                                    \
    {FAL_PART_MAGIC_WORD,        "bl",     "stm32_onchip",         0,   64*1024, 0}, \
    {FAL_PART_MAGIC_WORD,       "app",     "stm32_onchip",   64*1024,  704*1024, 0}, \
    {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME,         0, 1024*1024, 0}, \
    {FAL_PART_MAGIC_WORD,  "download", NOR_FLASH_DEV_NAME, 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */



使用特权

评论回复
keer_zu|  楼主 | 2021-10-26 09:53 | 显示全部楼层
上面这个分区表详细描述信息如下:

分区名                 Flash 设备名            偏移地址        大小                说明
“bl”                         “stm32_onchip”            0                        64KB                引导程序
“app”                “stm32_onchip”            64*1024        704KB        应用程序
“easyflash”        “norflash0”            0                        1MB                EasyFlash 参数存储
“download”        “norflash0”            1024*1024        1MB                OTA 下载区


使用特权

评论回复
keer_zu|  楼主 | 2021-10-26 09:53 | 显示全部楼层
用户需要修改的分区参数包括:分区名称、关联的 Flash 设备名、偏移地址(相对 Flash 设备内部)、大小,需要注意以下几点:
1.分区名保证 不能重复;
2.关联的 Flash 设备 务必已经在 Flash 设备表中定义好 ,并且 名称一致 ,否则会出现无法找到 Flash 设备的错误;
3.分区的起始地址和大小 不能超过 Flash 设备的地址范围 ,否则会导致包初始化错误;
注意:每个分区定义时,除了填写上面介绍的参数属性外,需在前面增加 FAL_PART_MAGIC_WORD 属性,末尾增加 0 (目前用于保留功能)

二、源码下载
完整源码下载(gitee上有)


使用特权

评论回复
keer_zu|  楼主 | 2021-10-27 08:21 | 显示全部楼层
@gaoyang9992006
这个有用过没有

使用特权

评论回复
gaoyang9992006| | 2021-10-27 11:51 | 显示全部楼层
keer_zu 发表于 2021-10-27 08:21
@gaoyang9992006
这个有用过没有

没有

使用特权

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

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1288

主题

12163

帖子

53

粉丝