加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

轻如羽翼,超轻量的嵌入式数据库!

03/02 11:25
2857
阅读需 13 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

FlashDB简介

FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。

FlashDB 提供两种数据库模式:

键值数据库:是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。

时序数据库时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照时间顺序存储。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高。

https://gitee.com/armink/FlashDB

应用场景

如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:

键值数据库

  • 产品参数存储
  • 用户配置信息存储
  • 小文件管理

时序数据库

    存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等记录运行日志:存储产品历史的运行日志,异常告警的记录等

主要特性

        • 资源占用极低,内存占用几乎为

      0

        ;支持 多分区,多实例。数据量大时,可细化分区,降低检索时间;支持磨损平衡,延长 Flash 寿命;支持掉电保护功能,可靠性高;支持 字符串及 blob 两种 KV 类型,方便用户操作;支持 KV增量升级,产品固件升级后, KVDB 内容也支持自动升级;支持 修改每条 TSDB 记录的状态,方便用户进行管理;

例子

使用键值数据库存储UUID

#include <stdio.h>
#include <pthread.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <flashdb.h>

#define FDB_LOG_TAG "[main]"

static pthread_mutex_t kv_locker;
static uint32_t init_data = 0;
static struct fdb_kvdb kvdb = { 0 };

static struct fdb_default_kv_node default_kv_table[] = 
{
    {"init_data", &init_data, sizeof(init_data)}, 
};

static void lock(fdb_db_t db)
{
    pthread_mutex_lock((pthread_mutex_t *)db->user_data);
}

static void unlock(fdb_db_t db)
{
    pthread_mutex_unlock((pthread_mutex_t *)db->user_data);
}

int main(void)
{
    fdb_err_t result;
    bool file_mode = true;
    uint32_t sec_size = 4096, db_size = sec_size * 4;
    struct fdb_default_kv default_kv;
    struct fdb_blob blob;

    // 默认 KV 集合
    default_kv.kvs = default_kv_table;
    default_kv.num = sizeof(default_kv_table) / sizeof(default_kv_table[0]);

    // 设置加解锁函数
    pthread_mutex_init(&kv_locker, NULL);
    fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, (void *)lock);
    fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, (void *)unlock);

    // 设置扇区
    fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_SEC_SIZE, &sec_size);

    // 设置数据库最大大小
    fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_MAX_SIZE, &db_size);
    
    // 设置文件模式
    fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_FILE_MODE, &file_mode);
    
    // 设置数据库文件夹
    mkdir("fdb_kvdb1", 0777);

    // 初始化KV数据库
    result = fdb_kvdb_init(&kvdb, "env", "fdb_kvdb1", &default_kv, &kv_locker);
    if (result != FDB_NO_ERR) 
    {
        return -1;
    }

    // 写入UUID
    char uuid_str[64] = "3F2504E0-4F89-11D3-9A0C-0305E82C3301";
    fdb_kv_set(&kvdb, "uuid", uuid_str);
    FDB_INFO("create the 'uuid' blob KV, value is: %sn", uuid_str);

    // 读取UUID
    char *return_value = NULL;
    char dst_uuid_str[64] = {0};
    return_value = fdb_kv_get(&kvdb, "uuid");
    if (return_value != NULL) 
    {
        strncpy(dst_uuid_str, return_value, sizeof(dst_uuid_str));
        FDB_INFO("get the 'uuid' value is: %sn", dst_uuid_str);
    }

    return 0;
}

fdb_kvdb_init为初始化kv数据库的接口,需要传参:

db 数据库对象
name 数据库名称
path FAL 模式:分区表中的分区名,文件模式:数据库保存的路径
default_kv 默认 KV 集合,第一次初始化时,将会把默认 KV 写入数据库中
user_data 用户自定义数据,没有时传入 NULL
返回 错误码

在初始化kv数据库之前,可根据实际需要调用fdb_kvdb_control接口对数据库进行一些控制设置操作。支持的命令控制字如下:

#define FDB_KVDB_CTRL_SET_SEC_SIZE     0x00             /**< 设置扇区大小,需要在数据库初始化前配置 */
#define FDB_KVDB_CTRL_GET_SEC_SIZE     0x01             /**< 获取扇区大小 */
#define FDB_KVDB_CTRL_SET_LOCK         0x02             /**< 设置加锁函数 */
#define FDB_KVDB_CTRL_SET_UNLOCK       0x03             /**< 设置解锁函数 */
#define FDB_KVDB_CTRL_SET_FILE_MODE    0x09             /**< 设置文件模式,需要在数据库初始化前配置 */
#define FDB_KVDB_CTRL_SET_MAX_SIZE     0x0A             /**< 在文件模式下,设置数据库最大大小,需要在数据库初始化前配置 */
#define FDB_KVDB_CTRL_SET_NOT_FORMAT   0x0B             /**< 设置初始化时不进行格式化,需要在数据库初始化前配置 */

这个demo基于Linux系统运行,需要设置成文件模式,存储到文件中进行测试。

初始化 KVDB 前通常需要通过 control 函数设置 加锁回调解锁回调 。对于裸机平台,加锁与解锁回调通常设置为关中断与开中断函数。而 RTOS 平台一般使用 mutex 互斥锁或 二值信号量 的 take 及 release 动作作为加锁与解锁的方式。

更多例子及说明可以查阅源码及相关文档:https://github.com/armink/FlashDB

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
88E1512-A0-NNP2C000 1 Marvell Technology Group Ltd Ethernet Transceiver, QFN-56
暂无数据 查看
S25FL512SAGMFIR10 1 Spansion Flash, 512MX1, PDSO16, 0.300 INCH, LEAD FREE, PLASTIC, MO-013EAA, SOIC-16
$11.03 查看
HFBR-2526ETZ 1 Foxconn Receiver, Through Hole Mount, ROHS COMPLIANT, 6 PIN
$23.83 查看

相关推荐

电子产业图谱

本公众号专注于嵌入式技术,包括但不限于C/C++、嵌入式、物联网、Linux等编程学习笔记,同时,公众号内包含大量的学习资源。欢迎关注,一同交流学习,共同进步!