电子产业一站式赋能平台

PCB联盟网

搜索
查看: 326|回复: 0
收起左侧

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

[复制链接]

483

主题

483

帖子

3042

积分

四级会员

Rank: 4

积分
3042
发表于 2024-2-29 11:50:00 | 显示全部楼层 |阅读模式
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
    #include
    #include
    #include
    #include
    #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: %s
    ", 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: %s
    ", dst_uuid_str);
        }
        return 0;
    }

    vzbpwbw45u2640350416.png

    vzbpwbw45u2640350416.png

    fdb_kvdb_init为初始化kv数据库的接口,需要传参:
    db数据库对象name数据库名称pathFAL 模式:分区表中的分区名,文件模式:数据库保存的路径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
    精彩内容:嵌入式中,日志调试法的一些规则!
    嵌入式中,升级时涉及的协议兼容性问题?
    嵌入式,可测试性软件设计!几个备受推崇的C语言项目,你了解几个?
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条


    联系客服 关注微信 下载APP 返回顶部 返回列表