STM32 利用FlashDB库实现在线扇区数据管理不丢失

记录运行日志:存储产品历史的运行日志,异常告警的记录等

KVDB 键值数据库介绍
  • 🌿KVDB 的基础功能的使用:

记录开机次数:

void kvdb\_basic\_sample(fdb\_kvdb\_t kvdb)
{
    struct fdb\_blob blob;
    int boot_count = 0;

    FDB\_INFO("==================== kvdb\_basic\_sample ====================\n");

    { /\* GET the KV value \*/
        /\* get the "boot\_count" KV value \*/
        fdb\_kv\_get\_blob(kvdb, "boot\_count", fdb\_blob\_make(&blob, &boot_count, sizeof(boot_count)));
        /\* the blob.saved.len is more than 0 when get the value successful \*/
        if (blob.saved.len > 0) {
            FDB\_INFO("get the 'boot\_count' value is %d\n", boot_count);
        } else {
            FDB\_INFO("get the 'boot\_count' failed\n");
        }
    }

    { /\* CHANGE the KV value \*/
        /\* increase the boot count \*/
        boot_count ++;
        /\* change the "boot\_count" KV's value \*/
        fdb\_kv\_set\_blob(kvdb, "boot\_count", fdb\_blob\_make(&blob, &boot_count, sizeof(boot_count)));
        FDB\_INFO("set the 'boot\_count' value to %d\n", boot_count);
    }

    FDB\_INFO("===========================================================\n");
}

  • 🌿字符串类型 KV

字符串 KV 的相关功能,字符串 KV 作为一个特殊的 KV 类型,其 Key 与 Value 均为字符串,常被用于参数存储、命令存储等可读性要求较高的场景。

void kvdb\_type\_string\_sample(fdb\_kvdb\_t kvdb)
{
    FDB\_INFO("==================== kvdb\_type\_string\_sample ====================\n");
    { /\* CREATE new Key-Value \*/
        char temp_data[10] = "36C";

        /\* It will create new KV node when "temp" KV not in database. \*/
        fdb\_kv\_set(kvdb, "temp", temp_data);
        FDB\_INFO("create the 'temp' string KV, value is: %s\n", temp_data);
    }

    { /\* GET the KV value \*/
        char \*return_value, temp_data[10] = { 0 };

        /\* Get the "temp" KV value.
 \* NOTE: The return value saved in fdb\_kv\_get's buffer. Please copy away as soon as possible.
 \*/
        return_value = fdb\_kv\_get(kvdb, "temp");
        /\* the return value is NULL when get the value failed \*/
        if (return_value != NULL) {
            strncpy(temp_data, return_value, sizeof(temp_data));
            FDB\_INFO("get the 'temp' value is: %s\n", temp_data);
        }
    }

    { /\* CHANGE the KV value \*/
        char temp_data[10] = "38C";

        /\* change the "temp" KV's value to "38C" \*/
        fdb\_kv\_set(kvdb, "temp", temp_data);
        FDB\_INFO("set 'temp' value to %s\n", temp_data);
    }

    { /\* DELETE the KV by name \*/
        fdb\_kv\_del(kvdb, "temp");
        FDB\_INFO("delete the 'temp' finish\n");
    }

    FDB\_INFO("===========================================================\n");
}

  • 遍历所有 KV

遍历 KVDB 中的所有 KV ,用户可以在遍历 KV 时增加自己的处理动作。

  • 首先初始化了 KVDB 的迭代器,然后使用迭代器 API ,将 KVDB 的所有 KV 逐一遍历出来。
    遍历出来的 KV 对象含有 KV 的一些属性,包括:key name, value saved addr, value length 等,用户通过 fdb_blob_read 配合 fdb_kv_to_blob 读取出来,做一些自己的业务处理。
void kvdb\_tarversal\_sample(fdb\_kvdb\_t kvdb)
{
    struct fdb\_kv\_iterator iterator;
    fdb\_kv\_t cur_kv;
    struct fdb\_blob blob;
    size\_t data_size;
    uint8\_t \*data_buf;

    fdb\_kv\_iterator\_init(kvdb, &iterator);

    while (fdb\_kv\_iterate(kvdb, &iterator)) {
        cur_kv = &(iterator.curr_kv);
        data_size = (size\_t) cur_kv->value_len;
        data_buf = (uint8\_t \*) malloc(data_size);
        if (data_buf == NULL) {
            FDB\_INFO("Error: malloc failed.\n");
            break;
        }
        fdb\_blob\_read((fdb\_db\_t) kvdb, fdb\_kv\_to\_blob(cur_kv, fdb\_blob\_make(&blob, data_buf, data_size)));
        /\*
 \* balabala do what ever you like with blob...
 \*/
        free(data_buf);
    }
}

在这里插入图片描述

  • 二进制大对象 (BLOB)
时序数据库
  • TSDB 基础示例,具体介绍:https://armink.gitee.io/flashdb/#/zh-cn/sample-tsdb-basic
  • 该示例主要演示了 TSDB 的基础功能,包括 TSL(时序记录)的追加、查询及状态修改功能。

samples/tsdb_sample.c ,包含追加、查询及状态修改这几个过程,大致代码如下:

void tsdb\_sample(fdb\_tsdb\_t tsdb)
{
    struct fdb\_blob blob;

    FDB\_INFO("==================== tsdb\_sample ====================\n");

    { /\* APPEND new TSL (time series log) \*/
        struct env\_status status;

        /\* append new log to TSDB \*/
        status.temp = 36;
        status.humi = 85;
        fdb\_tsl\_append(tsdb, fdb\_blob\_make(&blob, &status, sizeof(status)));
        FDB\_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);

        status.temp = 38;
        status.humi = 90;
        fdb\_tsl\_append(tsdb, fdb\_blob\_make(&blob, &status, sizeof(status)));
        FDB\_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
    }

    { /\* QUERY the TSDB \*/
        /\* query all TSL in TSDB by iterator \*/
        fdb\_tsl\_iter(tsdb, query_cb, tsdb);
## 最后

**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**

**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**

**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**

![img](https://img-blog.csdnimg.cn/img_convert/d1a825f095a6e5b3f0cbe08cad4602a5.png)

![img](https://img-blog.csdnimg.cn/img_convert/aad9d19656f48acad43f55777857467d.jpeg)

![img](https://img-blog.csdnimg.cn/img_convert/7ac26d3d563295d5aedf440f19ac85c8.png)

 ![img](https://img-blog.csdnimg.cn/img_convert/594f10e41ac4aaec35b433a867905cdb.png)

![img](https://img-blog.csdnimg.cn/img_convert/e044918fd6611265b26baf756ac3bb06.png)

![img](https://img-blog.csdnimg.cn/img_convert/b472afccd5b6c5e45687e51db749131d.png)

![](https://img-blog.csdnimg.cn/img_convert/3c4e8568550cd3a121da61407d4ec56e.png)

 

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**

[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618654289)

**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值