sunnydragon 发表于 2020-6-7 18:21:48

【开源】EasyFlash V5.0 正式更名为 FlashDB

在五一劳动节时 EasyFlash 推出了 V5.0 版本,但在 API 、移植方面与之前的版本无法做到兼容。在坛友们的一致建议下,决定还是给 EasyFlash 的新版本起个新名字,重新搞个开源项目

在更名后,请大家放心,原有的 EsayFlash 也将会继续维护,两个项目的侧重点将会有所不同。

EasyFlash

是一款开源的轻量级嵌入式Flash存储器库,方便开发者更加轻松的实现基于Flash存储器的常见应用开发。提供了 ENV 参数存储,IAP 在线升级,LOG 日志存储这三大功能 :

FlashDB

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


FlashDB 提供两种数据库模式:
[*]键值数据库 :是一种非关系数据库,它将数据存储为键值(Key-Value)对集合,其中键作为唯一标识符。KVDB 操作简洁,可扩展性强。
[*]时序数据库 :时间序列数据库 (Time Series Database , 简称 TSDB),它将数据按照 时间顺序存储 。TSDB 数据具有时间戳,数据存储量大,插入及查询性能高


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


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

[*]时序数据库 :


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


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

更多介绍,详见: https://github.com/armink/FlashDB

最后稍微提一下 FlashDB 的移植过程,这点与 EasyFlash 有所不同。目前 FlashDB 底层依赖于 FAL (Flash 抽象层)这块 RT-Thread 开源的通用组件

FAL 对于软件平台没有限制,不仅仅支持 RT-Thread 平台,也可以支持其他 OS ,甚至是裸机平台

在项目的 demo 文件夹里有对应的示例代码,目前提供了基于 STM32F4 平台的例子,大家移植使用的时候可以参考

欢迎大家试用,期待收到大家更多的反馈与意见

本坛下载:
GitHub:https://github.com/armink/FlashDB





pxclihai 发表于 2020-6-7 18:47:15

优秀啊 大佬

zhongsandaoren 发表于 2020-6-7 19:14:55

FAL好用,还没注意是RT开源的,还以为第三方的。

armok. 发表于 2020-6-7 19:26:43

好,分论坛我也改名了。

zhq0571 发表于 2020-6-7 19:33:35

优秀大佬

68336016 发表于 2020-6-7 20:07:24

真优秀大神

lkl10800139 发表于 2020-6-7 20:26:36

这个版本的功能,包含了之前宝贝的功能吧

sunnydragon 发表于 2020-6-7 21:54:05

armok. 发表于 2020-6-7 19:26
好,分论坛我也改名了。

多谢老大

sunnydragon 发表于 2020-6-7 21:54:46

lkl10800139 发表于 2020-6-7 20:26
这个版本的功能,包含了之前宝贝的功能吧

IAP 功能好像有些鸡肋暂时取消了

LOG 功能也可以通过 TSDB 来实现

PPS 发表于 2020-6-7 22:28:59

我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不管对用户还是厂商都一样。现在我都是自己写入和读出的时候对数据做加密,要是你们这个自带就更好了。

syj0925 发表于 2020-6-7 23:50:58

期待大作..

zhangling520 发表于 2020-6-7 23:56:09

马上移植试用{:lol:}

myrgb 发表于 2020-6-8 08:23:18

现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。

sunnydragon 发表于 2020-6-8 08:36:17

PPS 发表于 2020-6-7 22:28
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不 ...

可以考虑的哈,安全性在物联网世界中的重要性非常高的

sunnydragon 发表于 2020-6-8 08:37:07

myrgb 发表于 2020-6-8 08:23
现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。 ...

后面我再出一个 stm32f1 的标准库 例程吧

tiger_wu 发表于 2020-6-8 09:23:59

不断更新啊!牛牛牛! 期待 stm32f1 的标准库 例程 !

hcambridge 发表于 2020-6-8 09:38:50

FlashDB真牛!已经在学习RTT了,写得真心好,国产嵌入式的未来!

tim4146 发表于 2020-6-8 12:49:26

支持一个,前几天刚刚移植了您的hardfault那个库,非常强大

jjj 发表于 2020-6-8 13:03:11

支持,遗憾的是一直没有用上,easyflash

zhonghua_li 发表于 2020-6-8 13:21:05

eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本

SUPER_CRJ 发表于 2020-6-8 14:31:16

我准备用在STM32F1上面,Flash用的全寄存器操作,可以兼容的吧。

hyghyg1234 发表于 2020-6-8 15:22:50

大佬这个一直在用,感谢分享。

penny2799 发表于 2020-6-8 18:40:56

支持,研究下

sunnydragon 发表于 2020-6-8 20:47:28

tim4146 发表于 2020-6-8 12:49
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大

好用就好,FlashDB 可以存储 CmBacktrace 诊断出来的问题原因

sunnydragon 发表于 2020-6-8 20:49:41

zhonghua_li 发表于 2020-6-8 13:21
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本

EEPROM 空间有些小,可能不太适合大量的数据存储

用 EasyFlash V3 版本会比较适合 EEPROM

fenglove 发表于 2020-6-9 08:04:54

EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊

zhonghua_li 发表于 2020-6-9 16:51:38

sunnydragon 发表于 2020-6-8 20:49
EEPROM 空间有些小,可能不太适合大量的数据存储

用 EasyFlash V3 版本会比较适合 EEPROM...

大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变更,就回写flash。
全部以字符串存放,占用空间大,而且每次读写需要转换。 用在单片机上感觉比较吃力。

sunnydragon 发表于 2020-6-9 19:49:28

fenglove 发表于 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊

对了,所以后来更名为 FlashDB 了,更加专注于数据存储

iseecool 发表于 2020-6-10 09:46:35

期待大作

zchong 发表于 2020-6-11 07:23:00

得空研究研究,又多了一个工具

stm32f103f4 发表于 2020-6-11 10:12:57

期待f1系列的例子和说明

newuseruser 发表于 2020-6-11 16:15:45

zhonghua_li 发表于 2020-6-9 16:51
大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变 ...

一直也需要一个管理EEPROM参数的工具,有没有找到合适的?

AlertTao 发表于 2020-6-11 23:03:05

666666666665

albertwu 发表于 2020-6-12 21:19:19

基于flash的嵌入式数据库

zhousun 发表于 2020-6-13 20:29:33

楼主作品都是精品

oooios 发表于 2020-6-13 22:26:25

麻烦帮忙看看flashdb配置是否正确。
const struct fal_flash_dev bt832_onchip_flash =
{
    .name    = "bt832_onchip",
    .addr      = 0x70000,
    .len      = 0x4000,
    .blk_size   = 4*1024,
    .ops      = {NULL, read, write, erase},
    .write_gran = 32
};
#define FAL_PART_TABLE                                                                                 \
{                                                                                                                     \
    {FAL_PART_MAGIC_WORD,"fdb_kvdb1",    "bt832_onchip",   0, 8*1024, 0},      \
}
实际的flash地址是 0-0x7 ffff 其中(0-0x26000)系统占用;0x26000-0x66000用户代码占用;0x66000-0x78000用作参数存储(这一块映射作为flashdb存储);
现在使用上面配置,执行
char * return_value = fdb_kv_get(&kvdb, "username");
/* the return value is NULL when get the value failed */
if (return_value != NULL) {
          strncpy(temp_data, return_value, sizeof(temp_data));
            LOG("get the 'username' value is: %s\n", temp_data);
      }
        else
        {
            LOG("fdb_kv_set_str");
//      /* run string KV samples */
          fdb_kv_set_str(&kvdb,"username",temp_data,strlen(temp_data));
        }
uint32_t fdb_kv_set_str(fdb_kvdb_t kvdb,const char *key, const void *buf, size_t size)
{
        #if(FLASHDB)
            fdb_kv_set(kvdb, key, buf);
        #endif
        return 0;
}
直接j进hardfault.

easyflash4.0是正常的。

谢谢。

sunnydragon 发表于 2020-6-14 10:05:07

oooios 发表于 2020-6-13 22:26
麻烦帮忙看看flashdb配置是否正确。
const struct fal_flash_dev bt832_onchip_flash =
{


感觉驱动的问题概率大一些,做驱动时 .addr      = 0x70000, 有没有用到?建议查看下 读写擦 函数的具体执行结果

oooios 发表于 2020-6-14 14:45:35

sunnydragon 发表于 2020-6-14 10:05
感觉驱动的问题概率大一些,做驱动时 .addr      = 0x70000, 有没有用到?建议查看下 读写擦 函数的具体 ...

好的谢谢。。。

Nuist_Gwgj 发表于 2020-6-14 22:21:39

很棒啊,有机会在项目中用一下

foxfire 发表于 2020-6-15 08:53:45

这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用分支?

security 发表于 2020-6-15 11:46:03

foxfire 发表于 2020-6-15 08:53
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用 ...

只能这么说吧,log 跟 flash、db,是两个不同领域的东东。

security 发表于 2020-6-15 11:47:08

有一段时间没上论坛了,恭喜开设专栏!

chengong 发表于 2020-6-15 12:32:32

不错值得学习

sunnydragon 发表于 2020-6-15 19:39:38

security 发表于 2020-6-15 11:46
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。

老兄说的对~~

log 算是应用,最上层的东西,底层的存储介质,可以是 EasyFlash ,也可以是 FlashDB,还可以是文件系统

oooios 发表于 2020-6-16 22:46:40

sunnydragon 发表于 2020-6-15 19:39
老兄说的对~~

log 算是应用,最上层的东西,底层的存储介质,可以是 EasyFlash ,也可以是 FlashDB,还 ...

谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打断点可以看到完整日志,但是不调试,日志就不全。log使用的是easylog通过rtt输出。另外问一下,kvdb插入和查找速度如何?

sunnydragon 发表于 2020-6-17 09:03:53

oooios 发表于 2020-6-16 22:46
谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打 ...

日志丢失的问题,我不太清楚原因,要自己深入查一下

FlashDB 的性能还不错,项目 readme 里有性能测试数据,可以看一下

citroen988 发表于 2020-6-23 18:03:55

有移植到linux的吗?linux文件模拟flash

sunnydragon 发表于 2020-6-23 19:48:47

citroen988 发表于 2020-6-23 18:03
有移植到linux的吗?linux文件模拟flash

linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的

john78 发表于 2020-6-23 23:35:22

sunnydragon 发表于 2020-6-23 19:48
linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的 ...

有例程?不懂FAL

ju2320601 发表于 2020-6-23 23:58:00

不错,支持

sunnydragon 发表于 2020-6-24 10:41:00

john78 发表于 2020-6-23 23:35
有例程?不懂FAL

有例程的,你找一下?

jackboy 发表于 2020-6-24 13:01:46

这么多年了这个tool还在,感谢版主

citroen988 发表于 2020-6-25 12:24:13

sunnydragon 发表于 2020-6-23 19:48
linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的 ...



对接上 FAL 就行了?

   我理解FAL 是用于文件系统(fatfs)对接 flash的,   fatfs <---> FAL<---> flash

   我想在应用层运行FlashDB,将数据存储在文件中,linux应用层直接操作文件就行了。         FlashDB <---> 文件

oooios 发表于 2020-6-25 17:31:13

版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string, int, char,short , 或者组合起来的类型,结构体里面4种类型都有。
FLASHDB有更新吗?
谢谢

sunnydragon 发表于 2020-6-26 10:22:35

citroen988 发表于 2020-6-25 12:24
对接上 FAL 就行了?

   我理解FAL 是用于文件系统(fatfs)对接 flash的,   fatfsFAL   flash


用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。

晚些时候,我把我这边边的基于文件系统的示例公布出来,你可以持续关注哈

sunnydragon 发表于 2020-6-26 10:24:19

oooios 发表于 2020-6-25 17:31
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string,...

FlashDB 对类型没有任何限制,什么基本类型、结构体、数组等等都支持

FlashDB 会正在持续更新中,你可以放心使用哈

citroen988 发表于 2020-6-26 10:41:08

sunnydragon 发表于 2020-6-26 10:22
用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。

晚些时候,我把我这边边的 ...

最好整一个linux系统的demo,可以直接make & run

songlafk 发表于 2020-6-28 16:19:55

感恩天龙哥!~~~

zdc 发表于 2020-7-5 18:14:08

厉害厉害!

qwerttt 发表于 2020-7-7 21:45:37

对FLASH有没要求

SPI FLASH是用page容量小的合适还是page容量大的合适

atonghua 发表于 2020-7-8 15:17:21

支持现在用了FATFS不知道这个怎么使用 希望楼主能整个工程例子

chuanyang 发表于 2020-7-8 22:55:42

Easyflash用起来很巴适,点个赞{:victory:}

waterx3 发表于 2020-7-9 11:49:47

铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:sweat:}

sunnydragon 发表于 2020-7-9 21:48:00

qwerttt 发表于 2020-7-7 21:45
对FLASH有没要求

SPI FLASH是用page容量小的合适还是page容量大的合适

没啥要求,片上Flash 可以,Nor Flash 也可以

sunnydragon 发表于 2020-7-9 21:48:38

atonghua 发表于 2020-7-8 15:17
支持现在用了FATFS不知道这个怎么使用 希望楼主能整个工程例子

用 FAL 对 Flash 做个分区,一部分用文件系统,一部分用 FlashDB

sunnydragon 发表于 2020-7-9 21:49:45

waterx3 发表于 2020-7-9 11:49
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:s ...

试试通过 CmBacktrace 分析下具体的错误原因吧

jxn98310 发表于 2020-7-13 17:41:20

开始学习

CH_anyin 发表于 2020-7-21 00:26:37

支持一下,可以会用到

dandelion4277 发表于 2020-7-26 23:31:51

FlashDB不再支持IAP和LOG了嘛?

thyewfty 发表于 2020-7-29 00:42:38

谢谢大佬,还不知道怎么用,先看看

amdzid 发表于 2020-7-29 15:18:49

支持大佬,以前用过一次,很不错

Stephen_kl 发表于 2020-8-11 15:55:19

支持,下载研究研究{:lol:}

oooios 发表于 2020-8-20 17:42:06

请问下flashdbtsbd 里面
count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
fdb_tsl_iter(tsdb, set_status_cb, tsdb);
这两个函数是什么功能呢?
查询的时候为什么用FDB_TSL_WRITE?
删除用FDB_TSL_DELETED吗?
FDB_TSL_USER_STATUS1和FDB_TSL_USER_STATUS2有什么作用??

再次谢谢楼主。

sunnydragon 发表于 2020-8-21 20:52:49

oooios 发表于 2020-8-20 17:42
请问下flashdbtsbd 里面
count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
fdb_t ...

有体验 demo 的效果了吗?

oooios 发表于 2020-8-22 21:40:13

sunnydragon 发表于 2020-8-21 20:52
有体验 demo 的效果了吗?

嗯,体验了,好用。跟上一版有些接口变了。
就是数据库的 增( 删 改)查,删除不知道如何测。
楼主厉害。{:biggrin:}

sunnydragon 发表于 2020-8-23 16:45:08

oooios 发表于 2020-8-22 21:40
嗯,体验了,好用。跟上一版有些接口变了。
就是数据库的 增( 删 改)查,删除不知道如何测。
楼主厉害 ...

fdb_tsl_set_status 设置下删除状态,就相当于执行了删除的动作

下次就查询不到了

leirui001 发表于 2020-8-23 20:51:40

牛气                     

aosuntech 发表于 2020-8-24 10:54:18

学习         

W872529868 发表于 2020-9-13 02:46:55

sunnydragon 发表于 2020-8-23 16:45
fdb_tsl_set_status 设置下删除状态,就相当于执行了删除的动作

下次就查询不到了 ...

有2个问题请教您一下

1、程序中有以下注释,删除一条,是不是要先用“fdb_tsl_set_status()”方法设置为FDB_TSL_USER_STATUS1,再设置成 FDB_TSL_DELETED 才能删除?
         * NOTE: The actions to modify the state must be in order.
         *       FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2

2、假设,一部分数据是“FDB_TSL_WRITE”状态,一部分数据是“FDB_TSL_DELETED”状态,如何把“FDB_TSL_WRITE”状态的数据读取出来?

望指点一下,谢谢。

sunnydragon 发表于 2020-9-15 21:04:13

W872529868 发表于 2020-9-13 02:46
有2个问题请教您一下

1、程序中有以下注释,删除一条,是不是要先用“fdb_tsl_set_status()”方法设置为 ...

是得按照顺序,也可以跳着操作哦

armfans 发表于 2020-9-16 23:07:40

有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
fdb_err_t         fdb_kv_set_blob   (fdb_kvdb_t db, const char *key, fdb_blob_t blob);
size_t            fdb_kv_get_blob   (fdb_kvdb_t db, const char *key, fdb_blob_t blob);
fdb_err_t         fdb_kv_del          (fdb_kvdb_t db, const char *key);
这些函数都需要key参数,请问有没有查询或列出所有key值,统计数据个数的功能。

W872529868 发表于 2020-9-17 02:05:25

有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经删除的数据也读出来,当有几百条已经删除的数据的时候,会导致读取速度会非常慢,有没有方法只读取有效的数据?

sunnydragon 发表于 2020-9-21 16:51:19

armfans 发表于 2020-9-16 23:07
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
fdb_err_t         f ...

可以使用 fdb_kv_iterate      迭代器 API 进行统计

sunnydragon 发表于 2020-9-21 16:52:27

W872529868 发表于 2020-9-17 02:05
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经 ...

迭代器使用的时候先检查下每个 TSL 的状态

W872529868 发表于 2020-9-27 22:45:12

有2个问题请教下您:
1、确认一下,程序中使用了一个键值数据库,一个时序数据库,这两个数据库都是在同一个W25Q128上,我的理解是避免同时读写,这2个数据库使用同一个信号量来进行互斥,是否正确?
    fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_LOCK, lock);
    fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_UNLOCK, unlock);
    fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, lock);
    fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, unlock);
static void lock(fdb_db_t db)
{
    osSemaphoreAcquire(flash_mutex_id, osWaitForever);//互斥无限等待
}

static void unlock(fdb_db_t db)
{
    osSemaphoreRelease(flash_mutex_id);//释放互斥资源
}


2、只要键值数据库,时序数据库其中一个正在初始化,就不能读写,不管读写的数据库是否初始化完成?
   程序中,键值数据库用来存放参数,时序数据库用来存放历史数据,因为历史数据长度较大,并且会经常读写,所以分配了4094个扇区给时序数据库,2个扇区给键值数据库(Flash=W25Q128)
   因为时序数据库很大,所以初始化时间很长,正常的初始化时2秒左右,而全部擦除的初始化约260秒,这时间太长了,为此我专门使用一个线程来进行初始化“线程A”。
   在“线程A”先初始化键值数据库,然后初始化时序数据库,因为时序数据库的初始化时间很长OS会进行时间片切换,其他线程会读写已经初始化完成的键值数据库,但是,会导致时序数据库初始化异常。
   

sunnydragon 发表于 2020-9-29 15:44:55

W872529868 发表于 2020-9-27 22:45
有2个问题请教下您:
1、确认一下,程序中使用了一个键值数据库,一个时序数据库,这两个数据库都是在同一 ...

问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除呢?一般设备出厂时候会做 flash 的格式化处理

W872529868 发表于 2020-9-29 18:56:19

sunnydragon 发表于 2020-9-29 15:44
问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除 ...

    //执行时间50ms
    result_kvdb = fdb_kvdb_init(&kvdb_param, "parameter", "fdb_kvdb1", &default_kv, NULL);
    if (result_kvdb != FDB_NO_ERR)
    {
      Debug_printf("%s 初始化 参数 键值数据库 失败\r\n", DEBUG_NAME);
    }

    //执行时间约2秒
    result_tsddb = fdb_tsdb_init(&tsdb, "historical_data", "fdb_tsdb1", get_time, 650, NULL);
    if (result_tsddb != FDB_NO_ERR)
    {
      Debug_printf("%s 初始化时序数据库 失败\r\n", DEBUG_NAME);
    }

举例:上面的初始化程序在线程A里面执行,OS的时间片是5ms,在初始化完成 “kvdb_param” 数据库的时候,线程B会读写“kvdb_param”数据库,但是这时 “tsdb” 正在进行初始化,这样会导致 “tsdb” 初始化异常。

上述,是我的实测结果,想请您确认下。

ltgkl199011 发表于 2020-9-29 23:49:29

学习下                                                                        



sunnydragon 发表于 2020-10-1 16:38:00

W872529868 发表于 2020-9-29 18:56
举例:上面的初始化程序在线程A里面执行,OS的时间片是5ms,在初始化完成 “kvdb_param” 数据库的时候 ...

底层 fal flash 设备读写时有没有加锁?感觉像是多个分区同时操作一个 flash 导致的错误

W872529868 发表于 2020-10-2 01:08:19

sunnydragon 发表于 2020-10-1 16:38
底层 fal flash 设备读写时有没有加锁?感觉像是多个分区同时操作一个 flash 导致的错误 ...

问题已解决,万分感谢,flash底层没有用fal flash ,并且没有锁,导致了这个问题。

yjf263 发表于 2020-10-3 18:54:10

优秀,学习

oooios 发表于 2020-11-25 14:55:17

请教下楼主,tsdb在初始化后调用 tsdb_sample(&tsdb);运行是正常的,从日志看,数据读写是ok的。   
但是如果初始化后,注释掉tsdb_sample;在其他地方调用 tsdb_sample(&tsdb);    读写flash会出错。
试过kvdb这么操作没问题。
谢谢帮忙解答一下。
      fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, lock);
      fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, unlock);
      /* Time series database initialization
         *
         *       &tsdb: database object
         *       "log": database name
         * "fdb_tsdb1": The flash partition name base on FAL. Please make sure it's in FAL partition table.
         *            Please change to YOUR partition name.
         *    get_time: The get current timestamp function.
         *         128: maximum length of each log
         *      NULL: The user data if you need, now is empty.
         */
      result = fdb_tsdb_init(&tsdb, "record", "fdb_tsdb1", get_time, 32, NULL);
      /* read last saved time for simulated timestamp */
      fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_GET_LAST_TIME, &_TimeCount_250ms);

      if (result != FDB_NO_ERR) {
            return -1;
      }

      /* run TSDB sample */
//      tsdb_sample(&tsdb);

浮华一生 发表于 2021-3-28 21:24:59

国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。

W872529868 发表于 2021-4-2 17:45:38

在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生无限递归,导致互斥锁死锁,这种情况,您有什么建议?

sunnydragon 发表于 2021-4-4 16:04:12

浮华一生 发表于 2021-3-28 21:24
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。

有 gitee 的

sunnydragon 发表于 2021-4-4 16:05:12

W872529868 发表于 2021-4-2 17:45
在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生 ...

FlashDB 自己的日志可以输出到串口

kyq_linux 发表于 2021-4-23 16:14:09

好用好用 顶顶顶!!! rtthread中用的很爽。

gtembeded 发表于 2022-3-25 02:46:55

有个问题不是很明白,这个磨损平衡!

如上图,按顺序存储数据,当增加KV9的时候触发GC,这时存储区也满了,删除KV1(数据也可以丢了)把KV2、KV3移到扇4,擦除扇1,开始向扇区1填充数据。
当扇区1填充满了后,扇4的数据可以丢掉了,擦除扇区4,把扇区2的数据搬过来。
那这个样扇区4擦除的次数是其他扇区擦除次数的总和!
不知道我理解的对不?

zzz123456 发表于 2022-3-26 11:42:18

这个好,学习。 感谢。

l617131578 发表于 2023-5-10 10:20:39

朱哥,我想问下easyflash无论在查找和擦除的时候都在ENV中没有找到KEY,无法读和擦写,用的F407ZG不知道是什么原因
页: [1]
查看完整版本: 【开源】EasyFlash V5.0 正式更名为 FlashDB