amobbs.com 阿莫电子技术论坛

标题: 【开源】EasyFlash V5.0 正式更名为 FlashDB [打印本页]

作者: sunnydragon    时间: 2020-6-7 18:21
标题: 【开源】EasyFlash V5.0 正式更名为 FlashDB
在五一劳动节时 EasyFlash 推出了 V5.0 版本,但在 API 、移植方面与之前的版本无法做到兼容。在坛友们的一致建议下,决定还是给 EasyFlash 的新版本起个新名字,重新搞个开源项目

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

EasyFlash

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


FlashDB

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


FlashDB 提供两种数据库模式:

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

主要特性

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

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

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

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

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

本坛下载:
[attach]515737[/attach]

GitHub:https://github.com/armink/FlashDB






作者: pxclihai    时间: 2020-6-7 18:47
优秀啊 大佬
作者: zhongsandaoren    时间: 2020-6-7 19:14
FAL好用,还没注意是RT开源的,还以为第三方的。
作者: armok.    时间: 2020-6-7 19:26
好,分论坛我也改名了。
作者: zhq0571    时间: 2020-6-7 19:33
优秀大佬
作者: 68336016    时间: 2020-6-7 20:07
真优秀大神
作者: lkl10800139    时间: 2020-6-7 20:26
这个版本的功能,包含了之前宝贝的功能吧
作者: sunnydragon    时间: 2020-6-7 21:54
armok. 发表于 2020-6-7 19:26
好,分论坛我也改名了。

多谢老大
作者: sunnydragon    时间: 2020-6-7 21:54
lkl10800139 发表于 2020-6-7 20:26
这个版本的功能,包含了之前宝贝的功能吧

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

LOG 功能也可以通过 TSDB 来实现
作者: PPS    时间: 2020-6-7 22:28
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不管对用户还是厂商都一样。现在我都是自己写入和读出的时候对数据做加密,要是你们这个自带就更好了。
作者: syj0925    时间: 2020-6-7 23:50
期待大作..
作者: zhangling520    时间: 2020-6-7 23:56
马上移植试用
作者: myrgb    时间: 2020-6-8 08:23
现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。
作者: sunnydragon    时间: 2020-6-8 08:36
PPS 发表于 2020-6-7 22:28
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不 ...

可以考虑的哈,安全性在物联网世界中的重要性非常高的
作者: sunnydragon    时间: 2020-6-8 08:37
myrgb 发表于 2020-6-8 08:23
现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。 ...

后面我再出一个 stm32f1 的标准库 例程吧
作者: tiger_wu    时间: 2020-6-8 09:23
不断更新啊!牛牛牛! 期待 stm32f1 的标准库 例程 !
作者: hcambridge    时间: 2020-6-8 09:38
FlashDB真牛!已经在学习RTT了,写得真心好,国产嵌入式的未来!
作者: tim4146    时间: 2020-6-8 12:49
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大
作者: jjj    时间: 2020-6-8 13:03
支持,遗憾的是一直没有用上,easyflash
作者: zhonghua_li    时间: 2020-6-8 13:21
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本
作者: SUPER_CRJ    时间: 2020-6-8 14:31
我准备用在STM32F1上面,Flash用的全寄存器操作,可以兼容的吧。
作者: hyghyg1234    时间: 2020-6-8 15:22
大佬这个一直在用,感谢分享。
作者: penny2799    时间: 2020-6-8 18:40
支持,研究下
作者: sunnydragon    时间: 2020-6-8 20:47
tim4146 发表于 2020-6-8 12:49
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大


好用就好,FlashDB 可以存储 CmBacktrace 诊断出来的问题原因
作者: sunnydragon    时间: 2020-6-8 20:49
zhonghua_li 发表于 2020-6-8 13:21
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本

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

用 EasyFlash V3 版本会比较适合 EEPROM
作者: fenglove    时间: 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊
作者: zhonghua_li    时间: 2020-6-9 16:51
sunnydragon 发表于 2020-6-8 20:49
EEPROM 空间有些小,可能不太适合大量的数据存储

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

大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变更,就回写flash。
全部以字符串存放,占用空间大,而且每次读写需要转换。 用在单片机上感觉比较吃力。
作者: sunnydragon    时间: 2020-6-9 19:49
fenglove 发表于 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊

对了,所以后来更名为 FlashDB 了,更加专注于数据存储
作者: iseecool    时间: 2020-6-10 09:46
期待大作
作者: zchong    时间: 2020-6-11 07:23
得空研究研究,又多了一个工具
作者: stm32f103f4    时间: 2020-6-11 10:12
期待f1系列的例子和说明
作者: newuseruser    时间: 2020-6-11 16:15
zhonghua_li 发表于 2020-6-9 16:51
大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变 ...

一直也需要一个管理EEPROM参数的工具,有没有找到合适的?
作者: AlertTao    时间: 2020-6-11 23:03
666666666665
作者: albertwu    时间: 2020-6-12 21:19
基于flash的嵌入式数据库
作者: zhousun    时间: 2020-6-13 20:29
楼主作品都是精品
作者: oooios    时间: 2020-6-13 22:26
麻烦帮忙看看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
oooios 发表于 2020-6-13 22:26
麻烦帮忙看看flashdb配置是否正确。
const struct fal_flash_dev bt832_onchip_flash =
{

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

好的谢谢。。。
作者: Nuist_Gwgj    时间: 2020-6-14 22:21
很棒啊,有机会在项目中用一下
作者: foxfire    时间: 2020-6-15 08:53
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用分支?
作者: security    时间: 2020-6-15 11:46
foxfire 发表于 2020-6-15 08:53
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用 ...

只能这么说吧,log 跟 flash、db,是两个不同领域的东东。
作者: security    时间: 2020-6-15 11:47
有一段时间没上论坛了,恭喜开设专栏!
作者: chengong    时间: 2020-6-15 12:32
不错值得学习
作者: sunnydragon    时间: 2020-6-15 19:39
security 发表于 2020-6-15 11:46
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。


老兄说的对~~

log 算是应用,最上层的东西,底层的存储介质,可以是 EasyFlash ,也可以是 FlashDB,还可以是文件系统
作者: oooios    时间: 2020-6-16 22:46
sunnydragon 发表于 2020-6-15 19:39
老兄说的对~~

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

谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打断点可以看到完整日志,但是不调试,日志就不全。log使用的是easylog通过rtt输出。另外问一下,kvdb插入和查找速度如何?
作者: sunnydragon    时间: 2020-6-17 09:03
oooios 发表于 2020-6-16 22:46
谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打 ...

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

FlashDB 的性能还不错,项目 readme 里有性能测试数据,可以看一下
作者: citroen988    时间: 2020-6-23 18:03
有移植到linux的吗?  linux文件模拟flash
作者: sunnydragon    时间: 2020-6-23 19:48
citroen988 发表于 2020-6-23 18:03
有移植到linux的吗?  linux文件模拟flash

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

有例程?不懂FAL
作者: ju2320601    时间: 2020-6-23 23:58
不错,支持
作者: sunnydragon    时间: 2020-6-24 10:41
john78 发表于 2020-6-23 23:35
有例程?不懂FAL

有例程的,你找一下?
作者: jackboy    时间: 2020-6-24 13:01
这么多年了这个tool还在,感谢版主
作者: citroen988    时间: 2020-6-25 12:24
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
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string, int, char,short , 或者组合起来的类型,结构体里面4种类型都有。
FLASHDB有更新吗?
谢谢

作者: sunnydragon    时间: 2020-6-26 10:22
citroen988 发表于 2020-6-25 12:24
对接上 FAL 就行了?

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

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

晚些时候,我把我这边边的基于文件系统的示例公布出来,你可以持续关注哈
作者: sunnydragon    时间: 2020-6-26 10:24
oooios 发表于 2020-6-25 17:31
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string,  ...

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

FlashDB 会正在持续更新中,你可以放心使用哈
作者: citroen988    时间: 2020-6-26 10:41
sunnydragon 发表于 2020-6-26 10:22
用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。

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

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


作者: songlafk    时间: 2020-6-28 16:19
感恩天龙哥!~~~
作者: zdc    时间: 2020-7-5 18:14
厉害厉害!
作者: qwerttt    时间: 2020-7-7 21:45
对FLASH有没要求

SPI FLASH是用page容量小的合适还是page容量大的合适
作者: atonghua    时间: 2020-7-8 15:17
支持  现在用了FATFS  不知道这个怎么使用 希望楼主能整个工程例子
作者: chuanyang    时间: 2020-7-8 22:55
Easyflash用起来很巴适,点个赞
作者: waterx3    时间: 2020-7-9 11:49
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?
作者: sunnydragon    时间: 2020-7-9 21:48
qwerttt 发表于 2020-7-7 21:45
对FLASH有没要求

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

没啥要求,片上  Flash 可以,Nor Flash 也可以
作者: sunnydragon    时间: 2020-7-9 21:48
atonghua 发表于 2020-7-8 15:17
支持  现在用了FATFS  不知道这个怎么使用 希望楼主能整个工程例子

用 FAL 对 Flash 做个分区,一部分用文件系统,一部分用 FlashDB
作者: sunnydragon    时间: 2020-7-9 21:49
waterx3 发表于 2020-7-9 11:49
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:s ...

试试通过 CmBacktrace 分析下具体的错误原因吧
作者: jxn98310    时间: 2020-7-13 17:41
开始学习
作者: CH_anyin    时间: 2020-7-21 00:26
支持一下,可以会用到
作者: dandelion4277    时间: 2020-7-26 23:31
FlashDB不再支持IAP和LOG了嘛?
作者: thyewfty    时间: 2020-7-29 00:42
谢谢大佬,还不知道怎么用,先看看
作者: amdzid    时间: 2020-7-29 15:18
支持大佬,以前用过一次,很不错
作者: Stephen_kl    时间: 2020-8-11 15:55
支持,下载研究研究
作者: oooios    时间: 2020-8-20 17:42
请问下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有什么作用??

再次谢谢楼主。
作者: sunnydragon    时间: 2020-8-21 20:52
oooios 发表于 2020-8-20 17:42
请问下flashdb  tsbd 里面
count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
fdb_t ...

有体验 demo 的效果了吗?
作者: oooios    时间: 2020-8-22 21:40
sunnydragon 发表于 2020-8-21 20:52
有体验 demo 的效果了吗?

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

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

下次就查询不到了
作者: leirui001    时间: 2020-8-23 20:51
牛气                     
作者: aosuntech    时间: 2020-8-24 10:54
学习         
作者: W872529868    时间: 2020-9-13 02:46
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”状态的数据读取出来?

望指点一下,谢谢。
作者: sunnydragon    时间: 2020-9-15 21:04
W872529868 发表于 2020-9-13 02:46
有2个问题请教您一下

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

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

作者: armfans    时间: 2020-9-16 23:07
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
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
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经删除的数据也读出来,当有几百条已经删除的数据的时候,会导致读取速度会非常慢,有没有方法只读取有效的数据?
作者: sunnydragon    时间: 2020-9-21 16:51
armfans 发表于 2020-9-16 23:07
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
fdb_err_t         f ...

可以使用 fdb_kv_iterate      迭代器 API 进行统计
作者: sunnydragon    时间: 2020-9-21 16:52
W872529868 发表于 2020-9-17 02:05
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经 ...

迭代器使用的时候先检查下每个 TSL 的状态
作者: W872529868    时间: 2020-9-27 22:45
有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会进行时间片切换,其他线程会读写已经初始化完成的键值数据库,但是,会导致时序数据库初始化异常。
     


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

问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除呢?一般设备出厂时候会做 flash 的格式化处理
作者: W872529868    时间: 2020-9-29 18:56
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” 初始化异常。

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

作者: ltgkl199011    时间: 2020-9-29 23:49
学习下                                                                        




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

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

问题已解决,万分感谢,flash底层没有用fal flash ,并且没有锁,导致了这个问题。
作者: yjf263    时间: 2020-10-3 18:54
优秀,学习
作者: oooios    时间: 2020-11-25 14:55
请教下楼主,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
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。
作者: W872529868    时间: 2021-4-2 17:45
在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生无限递归,导致互斥锁死锁,这种情况,您有什么建议?
作者: sunnydragon    时间: 2021-4-4 16:04
浮华一生 发表于 2021-3-28 21:24
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。

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

FlashDB 自己的日志可以输出到串口
作者: kyq_linux    时间: 2021-4-23 16:14
好用好用 顶顶顶!!! rtthread中用的很爽。
作者: gtembeded    时间: 2022-3-25 02:46
有个问题不是很明白,这个磨损平衡!
[attach]581854[/attach]
如上图,按顺序存储数据,当增加KV9的时候触发GC,这时存储区也满了,删除KV1(数据也可以丢了)把KV2、KV3移到扇4,擦除扇1,开始向扇区1填充数据。
当扇区1填充满了后,扇4的数据可以丢掉了,擦除扇区4,把扇区2的数据搬过来。
那这个样扇区4擦除的次数是其他扇区擦除次数的总和!
不知道我理解的对不?
作者: zzz123456    时间: 2022-3-26 11:42
这个好,学习。 感谢。
作者: l617131578    时间: 2023-5-10 10:20
朱哥,我想问下easyflash无论在查找和擦除的时候都在ENV中没有找到KEY,无法读和擦写,用的F407ZG不知道是什么原因




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4