FlashDB嵌入式数据库
- 什么是FlashDB
- 移植
- 总结
什么是FlashDB
先截一段官网的信息大家看一下哈
FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
FlashDB 提供两种数据库模式:
键值数据库 :是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
时序数据库 :时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储 。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。
使用场景
如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
键值数据库 :
产品参数存储
用户配置信息存储
小文件管理
时序数据库 :
存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
记录运行日志:存储产品历史的运行日志,异常告警的记录等
主要特性
资源占用极低,内存占用几乎为 0 ;
支持 多分区,多实例 。数据量大时,可细化分区,降低检索时间;
支持 磨损平衡 ,延长 Flash 寿命;
支持 掉电保护 功能,可靠性高;
支持 字符串及 blob 两种 KV 类型,方便用户操作;
支持 KV 增量升级 ,产品固件升级后, KVDB 内容也支持自动升级;
支持 修改每条 TSDB 记录的状态,方便用户进行管理;
看到这里是不是已经有一个大概了解了,本人也查过一些其他的嵌入式使用的数据库,但是基本上都是Linux上使用的,对资源还是有一定要求的,在单片机这个级别上使用还是不现实的。
上下源作者的开源链接: https://gitee.com/Armink/FlashDB.
膜拜一下armink大神。
个人理解:其实数据库基本就是 增、删、改、查。增是最简单的,改删查就需要花点心思了。
看了下数据库,API接口还是很丰富的,比如遍历整个数据库和按时间戳检索数据库;以及修改数据库,删除数据库,还增加了扇区的平衡和磨平。基本上功能都包括了,个人以前做项目的时候也想过存取,最后还是没有很好的解决快速检索的功能,后期打算看下底层,专门写一下这一块的处理逻辑。
移植
- FlashDB的移植是建立的Fal,flash抽象层的基础上使用的,官方给的demo也是如此,如果fal还没移植好,看上一篇文章
- 一样的先下源码
打开demos目录下有多个工程 - 个人用的是spi-flash,所以选择stm32f405rg_spi_flash这个工程
- 把源码加入工程之后
完成后就这个样子
- 然后修改一下配置文件fdb_cfg.h文件
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#define FAL_DEBUG 1 //启动打印
#define FAL_PART_HAS_TABLE_CFG //启动设备表
#define FAL_USING_SFUD_PORT //使用sfud通用串行flash
/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "fdb_tsdb1", "norflash0", 0, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "fdb_kvdb1", "norflash0", 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
运行一下看下日志
中间太长了,省略把
可以发现第一次运行会初始化一次flash,应该是在扇区头写入了一些标记
还可以发现最后写入了二条数据到数据库中
接着在复位一次
这一次的日志简单很多,没有了初始化的过程,第一次真的好慢,差点都以为进死循环了
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 1
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 2
这里记录了启动次数,一共启动了二次
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 3) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 4) status from 2 to 3
[FlashDB][sample][tsdb] ===========================================================
一共写入了4条数据,分二次写入的,且遍历之后打印出来。
总结
移植算是结束了,也跟着日志理了一遍。API函数还是比较齐全的,使用也还算方便,看了作者介绍这个库也有几年历史了,更新了5个大版本了。打算看下底层,深入理解一下再和大家分享。