搜索
bottom↓
回复: 99
打印 上一主题 下一主题

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

  [复制链接]

出0入198汤圆

跳转到指定楼层
1
发表于 2020-6-7 18:21:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在五一劳动节时 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





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

2
发表于 2020-6-7 18:47:15 来自手机 | 只看该作者
优秀啊 大佬

出0入0汤圆

3
发表于 2020-6-7 19:14:55 | 只看该作者
FAL好用,还没注意是RT开源的,还以为第三方的。

出16170入6148汤圆

4
发表于 2020-6-7 19:26:43 来自手机 | 只看该作者
好,分论坛我也改名了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出50入0汤圆

5
发表于 2020-6-7 19:33:35 | 只看该作者
优秀大佬

出130入129汤圆

6
发表于 2020-6-7 20:07:24 来自手机 | 只看该作者
真优秀大神

出0入0汤圆

7
发表于 2020-6-7 20:26:36 来自手机 | 只看该作者
这个版本的功能,包含了之前宝贝的功能吧

出0入198汤圆

8
 楼主| 发表于 2020-6-7 21:54:05 | 只看该作者
armok. 发表于 2020-6-7 19:26
好,分论坛我也改名了。

多谢老大

出0入198汤圆

9
 楼主| 发表于 2020-6-7 21:54:46 | 只看该作者
lkl10800139 发表于 2020-6-7 20:26
这个版本的功能,包含了之前宝贝的功能吧

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

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

出30入42汤圆

10
发表于 2020-6-7 22:28:59 来自手机 | 只看该作者
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不管对用户还是厂商都一样。现在我都是自己写入和读出的时候对数据做加密,要是你们这个自带就更好了。

出0入0汤圆

11
发表于 2020-6-7 23:50:58 | 只看该作者
期待大作..

出0入0汤圆

12
发表于 2020-6-7 23:56:09 | 只看该作者
马上移植试用

出0入0汤圆

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

出0入198汤圆

14
 楼主| 发表于 2020-6-8 08:36:17 | 只看该作者
PPS 发表于 2020-6-7 22:28
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不 ...

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

出0入198汤圆

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

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

出0入42汤圆

16
发表于 2020-6-8 09:23:59 | 只看该作者
不断更新啊!牛牛牛! 期待 stm32f1 的标准库 例程 !

出100入18汤圆

17
发表于 2020-6-8 09:38:50 | 只看该作者
FlashDB真牛!已经在学习RTT了,写得真心好,国产嵌入式的未来!

出5入4汤圆

18
发表于 2020-6-8 12:49:26 来自手机 | 只看该作者
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大

出0入0汤圆

19
发表于 2020-6-8 13:03:11 | 只看该作者
支持,遗憾的是一直没有用上,easyflash

出0入0汤圆

20
发表于 2020-6-8 13:21:05 | 只看该作者
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本

出590入992汤圆

21
发表于 2020-6-8 14:31:16 | 只看该作者
我准备用在STM32F1上面,Flash用的全寄存器操作,可以兼容的吧。

出0入0汤圆

22
发表于 2020-6-8 15:22:50 | 只看该作者
大佬这个一直在用,感谢分享。

出0入0汤圆

23
发表于 2020-6-8 18:40:56 | 只看该作者
支持,研究下

出0入198汤圆

24
 楼主| 发表于 2020-6-8 20:47:28 | 只看该作者
tim4146 发表于 2020-6-8 12:49
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大


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

出0入198汤圆

25
 楼主| 发表于 2020-6-8 20:49:41 | 只看该作者
zhonghua_li 发表于 2020-6-8 13:21
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本

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

用 EasyFlash V3 版本会比较适合 EEPROM

出0入0汤圆

26
发表于 2020-6-9 08:04:54 | 只看该作者
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊

出0入0汤圆

27
发表于 2020-6-9 16:51:38 | 只看该作者
sunnydragon 发表于 2020-6-8 20:49
EEPROM 空间有些小,可能不太适合大量的数据存储

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

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

出0入198汤圆

28
 楼主| 发表于 2020-6-9 19:49:28 | 只看该作者
fenglove 发表于 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊

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

出0入0汤圆

29
发表于 2020-6-10 09:46:35 | 只看该作者
期待大作

出0入31汤圆

30
发表于 2020-6-11 07:23:00 来自手机 | 只看该作者
得空研究研究,又多了一个工具

出0入0汤圆

31
发表于 2020-6-11 10:12:57 来自手机 | 只看该作者
期待f1系列的例子和说明

出0入17汤圆

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

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

出0入0汤圆

33
发表于 2020-6-11 23:03:05 来自手机 | 只看该作者
666666666665

出0入0汤圆

34
发表于 2020-6-12 21:19:19 | 只看该作者
基于flash的嵌入式数据库

出0入0汤圆

35
发表于 2020-6-13 20:29:33 | 只看该作者
楼主作品都是精品

出0入0汤圆

36
发表于 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是正常的。

谢谢。

出0入198汤圆

37
 楼主| 发表于 2020-6-14 10:05:07 | 只看该作者
oooios 发表于 2020-6-13 22:26
麻烦帮忙看看flashdb配置是否正确。
const struct fal_flash_dev bt832_onchip_flash =
{

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

出0入0汤圆

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

好的谢谢。。。

出0入0汤圆

39
发表于 2020-6-14 22:21:39 | 只看该作者
很棒啊,有机会在项目中用一下

出0入0汤圆

40
发表于 2020-6-15 08:53:45 | 只看该作者
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用分支?

出0入8汤圆

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

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

出0入8汤圆

42
发表于 2020-6-15 11:47:08 | 只看该作者
有一段时间没上论坛了,恭喜开设专栏!

出0入0汤圆

43
发表于 2020-6-15 12:32:32 | 只看该作者
不错值得学习

出0入198汤圆

44
 楼主| 发表于 2020-6-15 19:39:38 | 只看该作者
security 发表于 2020-6-15 11:46
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。


老兄说的对~~

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

出0入0汤圆

45
发表于 2020-6-16 22:46:40 来自手机 | 只看该作者
sunnydragon 发表于 2020-6-15 19:39
老兄说的对~~

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

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

出0入198汤圆

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

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

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

出0入0汤圆

47
发表于 2020-6-23 18:03:55 | 只看该作者
有移植到linux的吗?  linux文件模拟flash

出0入198汤圆

48
 楼主| 发表于 2020-6-23 19:48:47 | 只看该作者
citroen988 发表于 2020-6-23 18:03
有移植到linux的吗?  linux文件模拟flash

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

出90入4汤圆

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

有例程?不懂FAL

出0入0汤圆

50
发表于 2020-6-23 23:58:00 来自手机 | 只看该作者
不错,支持

出0入198汤圆

51
 楼主| 发表于 2020-6-24 10:41:00 | 只看该作者
john78 发表于 2020-6-23 23:35
有例程?不懂FAL

有例程的,你找一下?

出0入0汤圆

52
发表于 2020-6-24 13:01:46 | 只看该作者
这么多年了这个tool还在,感谢版主

出0入0汤圆

53
发表于 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 <---> 文件

出0入0汤圆

54
发表于 2020-6-25 17:31:13 | 只看该作者
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string, int, char,short , 或者组合起来的类型,结构体里面4种类型都有。
FLASHDB有更新吗?
谢谢

出0入198汤圆

55
 楼主| 发表于 2020-6-26 10:22:35 | 只看该作者
citroen988 发表于 2020-6-25 12:24
对接上 FAL 就行了?

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

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

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

出0入198汤圆

56
 楼主| 发表于 2020-6-26 10:24:19 | 只看该作者
oooios 发表于 2020-6-25 17:31
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string,  ...

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

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

出0入0汤圆

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

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

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

出0入0汤圆

58
发表于 2020-6-28 16:19:55 | 只看该作者
感恩天龙哥!~~~

出0入0汤圆

59
发表于 2020-7-5 18:14:08 | 只看该作者
厉害厉害!

出0入0汤圆

60
发表于 2020-7-7 21:45:37 | 只看该作者
对FLASH有没要求

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

出0入0汤圆

61
发表于 2020-7-8 15:17:21 | 只看该作者
支持  现在用了FATFS  不知道这个怎么使用 希望楼主能整个工程例子

出0入10汤圆

62
发表于 2020-7-8 22:55:42 | 只看该作者
Easyflash用起来很巴适,点个赞

出0入12汤圆

63
发表于 2020-7-9 11:49:47 | 只看该作者
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?

出0入198汤圆

64
 楼主| 发表于 2020-7-9 21:48:00 | 只看该作者
qwerttt 发表于 2020-7-7 21:45
对FLASH有没要求

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

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

出0入198汤圆

65
 楼主| 发表于 2020-7-9 21:48:38 | 只看该作者
atonghua 发表于 2020-7-8 15:17
支持  现在用了FATFS  不知道这个怎么使用 希望楼主能整个工程例子

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

出0入198汤圆

66
 楼主| 发表于 2020-7-9 21:49:45 | 只看该作者
waterx3 发表于 2020-7-9 11:49
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:s ...

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

出0入0汤圆

67
发表于 2020-7-13 17:41:20 | 只看该作者
开始学习

出0入0汤圆

68
发表于 2020-7-21 00:26:37 | 只看该作者
支持一下,可以会用到

出0入0汤圆

69
发表于 2020-7-26 23:31:51 | 只看该作者
FlashDB不再支持IAP和LOG了嘛?

出0入0汤圆

70
发表于 2020-7-29 00:42:38 | 只看该作者
谢谢大佬,还不知道怎么用,先看看

出0入0汤圆

71
发表于 2020-7-29 15:18:49 | 只看该作者
支持大佬,以前用过一次,很不错

出0入0汤圆

72
发表于 2020-8-11 15:55:19 | 只看该作者
支持,下载研究研究

出0入0汤圆

73
发表于 2020-8-20 17:42:06 | 只看该作者
请问下flashdb  tsbd 里面
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有什么作用??

再次谢谢楼主。

出0入198汤圆

74
 楼主| 发表于 2020-8-21 20:52:49 | 只看该作者
oooios 发表于 2020-8-20 17:42
请问下flashdb  tsbd 里面
count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
fdb_t ...

有体验 demo 的效果了吗?

出0入0汤圆

75
发表于 2020-8-22 21:40:13 | 只看该作者
sunnydragon 发表于 2020-8-21 20:52
有体验 demo 的效果了吗?

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

出0入198汤圆

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

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

下次就查询不到了

出0入0汤圆

77
发表于 2020-8-23 20:51:40 | 只看该作者
牛气                     

出0入0汤圆

78
发表于 2020-8-24 10:54:18 | 只看该作者
学习         

出0入0汤圆

79
发表于 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 才能删除?
  1.          * NOTE: The actions to modify the state must be in order.
  2.          *       FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2
复制代码


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

望指点一下,谢谢。

出0入198汤圆

80
 楼主| 发表于 2020-9-15 21:04:13 | 只看该作者
W872529868 发表于 2020-9-13 02:46
有2个问题请教您一下

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

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

出0入0汤圆

81
发表于 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值,统计数据个数的功能。

出0入0汤圆

82
发表于 2020-9-17 02:05:25 | 只看该作者
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经删除的数据也读出来,当有几百条已经删除的数据的时候,会导致读取速度会非常慢,有没有方法只读取有效的数据?

出0入198汤圆

83
 楼主| 发表于 2020-9-21 16:51:19 | 只看该作者
armfans 发表于 2020-9-16 23:07
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
fdb_err_t         f ...

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

出0入198汤圆

84
 楼主| 发表于 2020-9-21 16:52:27 | 只看该作者
W872529868 发表于 2020-9-17 02:05
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经 ...

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

出0入0汤圆

85
发表于 2020-9-27 22:45:12 | 只看该作者
有2个问题请教下您:
1、确认一下,程序中使用了一个键值数据库,一个时序数据库,这两个数据库都是在同一个W25Q128上,我的理解是避免同时读写,这2个数据库使用同一个信号量来进行互斥,是否正确?
  1.     fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_LOCK, lock);
  2.     fdb_kvdb_control(&kvdb, FDB_KVDB_CTRL_SET_UNLOCK, unlock);
  3.     fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_LOCK, lock);
  4.     fdb_tsdb_control(&tsdb, FDB_TSDB_CTRL_SET_UNLOCK, unlock);
  5. static void lock(fdb_db_t db)
  6. {
  7.     osSemaphoreAcquire(flash_mutex_id, osWaitForever);  //互斥无限等待
  8. }

  9. static void unlock(fdb_db_t db)
  10. {
  11.     osSemaphoreRelease(flash_mutex_id);  //释放互斥资源
  12. }
复制代码


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

出0入198汤圆

86
 楼主| 发表于 2020-9-29 15:44:55 | 只看该作者
W872529868 发表于 2020-9-27 22:45
有2个问题请教下您:
1、确认一下,程序中使用了一个键值数据库,一个时序数据库,这两个数据库都是在同一 ...

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

出0入0汤圆

87
发表于 2020-9-29 18:56:19 | 只看该作者
sunnydragon 发表于 2020-9-29 15:44
问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除 ...
  1.     //执行时间50ms
  2.     result_kvdb = fdb_kvdb_init(&kvdb_param, "parameter", "fdb_kvdb1", &default_kv, NULL);
  3.     if (result_kvdb != FDB_NO_ERR)
  4.     {
  5.         Debug_printf("%s 初始化 参数 键值数据库 失败\r\n", DEBUG_NAME);
  6.     }

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


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

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

出0入0汤圆

88
发表于 2020-9-29 23:49:29 | 只看该作者
学习下                                                                        



出0入198汤圆

89
 楼主| 发表于 2020-10-1 16:38:00 | 只看该作者
W872529868 发表于 2020-9-29 18:56
举例:上面的初始化程序在线程A里面执行,OS的时间片是5ms,在初始化完成 “kvdb_param” 数据库的时候 ...

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

出0入0汤圆

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

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

出0入0汤圆

91
发表于 2020-10-3 18:54:10 | 只看该作者
优秀,学习

出0入0汤圆

92
发表于 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);

出0入0汤圆

93
发表于 2021-3-28 21:24:59 | 只看该作者
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。

出0入0汤圆

94
发表于 2021-4-2 17:45:38 | 只看该作者
在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生无限递归,导致互斥锁死锁,这种情况,您有什么建议?

出0入198汤圆

95
 楼主| 发表于 2021-4-4 16:04:12 | 只看该作者
浮华一生 发表于 2021-3-28 21:24
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。

有 gitee 的

出0入198汤圆

96
 楼主| 发表于 2021-4-4 16:05:12 | 只看该作者
W872529868 发表于 2021-4-2 17:45
在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生 ...

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

出0入4汤圆

97
发表于 2021-4-23 16:14:09 | 只看该作者
好用好用 顶顶顶!!! rtthread中用的很爽。

出0入0汤圆

98
发表于 2022-3-25 02:46:55 | 只看该作者
有个问题不是很明白,这个磨损平衡!

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

99
发表于 2022-3-26 11:42:18 | 只看该作者
这个好,学习。 感谢。

出0入0汤圆

100
发表于 2023-5-10 10:20:39 | 只看该作者
朱哥,我想问下easyflash无论在查找和擦除的时候都在ENV中没有找到KEY,无法读和擦写,用的F407ZG不知道是什么原因
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 19:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表