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 使用寿命
- 键值数据库 :是一种非关系数据库,它将数据存储为键值(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 平台的例子,大家移植使用的时候可以参考
欢迎大家试用,期待收到大家更多的反馈与意见
本坛下载:[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
多谢老大
作者: sunnydragon 时间: 2020-6-7 21:54
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
可以考虑的哈,安全性在物联网世界中的重要性非常高的
作者: sunnydragon 时间: 2020-6-8 08:37
后面我再出一个 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
好用就好,FlashDB 可以存储 CmBacktrace 诊断出来的问题原因
作者: sunnydragon 时间: 2020-6-8 20:49
EEPROM 空间有些小,可能不太适合大量的数据存储
用 EasyFlash V3 版本会比较适合 EEPROM
作者: fenglove 时间: 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊
作者: zhonghua_li 时间: 2020-6-9 16:51
大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变更,就回写flash。
全部以字符串存放,占用空间大,而且每次读写需要转换。 用在单片机上感觉比较吃力。
作者: sunnydragon 时间: 2020-6-9 19:49
对了,所以后来更名为 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
一直也需要一个管理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
感觉驱动的问题概率大一些,做驱动时 .addr = 0x70000, 有没有用到?建议查看下 读写擦 函数的具体执行结果
作者: oooios 时间: 2020-6-14 14:45
好的谢谢。。。
作者: Nuist_Gwgj 时间: 2020-6-14 22:21
很棒啊,有机会在项目中用一下
作者: foxfire 时间: 2020-6-15 08:53
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用分支?
作者: security 时间: 2020-6-15 11:46
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。
作者: security 时间: 2020-6-15 11:47
有一段时间没上论坛了,恭喜开设专栏!
作者: chengong 时间: 2020-6-15 12:32
不错值得学习
作者: sunnydragon 时间: 2020-6-15 19:39
老兄说的对~~
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
日志丢失的问题,我不太清楚原因,要自己深入查一下
FlashDB 的性能还不错,项目 readme 里有性能测试数据,可以看一下
作者: citroen988 时间: 2020-6-23 18:03
有移植到linux的吗? linux文件模拟flash
作者: sunnydragon 时间: 2020-6-23 19:48
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
有例程的,你找一下?
作者: jackboy 时间: 2020-6-24 13:01
这么多年了这个tool还在,感谢版主
作者: citroen988 时间: 2020-6-25 12:24
对接上 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
用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。
晚些时候,我把我这边边的基于文件系统的示例公布出来,你可以持续关注哈
作者: sunnydragon 时间: 2020-6-26 10:24
FlashDB 对类型没有任何限制,什么基本类型、结构体、数组等等都支持
FlashDB 会正在持续更新中,你可以放心使用哈
作者: citroen988 时间: 2020-6-26 10:41
最好整一个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
没啥要求,片上 Flash 可以,Nor Flash 也可以
作者: sunnydragon 时间: 2020-7-9 21:48
用 FAL 对 Flash 做个分区,一部分用文件系统,一部分用 FlashDB
作者: sunnydragon 时间: 2020-7-9 21:49
试试通过 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
有体验 demo 的效果了吗?
作者: oooios 时间: 2020-8-22 21:40
嗯,体验了,好用。跟上一版有些接口变了。
就是数据库的 增( 删 改)查,删除不知道如何测。
楼主厉害。
作者: sunnydragon 时间: 2020-8-23 16:45
fdb_tsl_set_status 设置下删除状态,就相当于执行了删除的动作
下次就查询不到了
作者: leirui001 时间: 2020-8-23 20:51
牛气
作者: aosuntech 时间: 2020-8-24 10:54
学习
作者: W872529868 时间: 2020-9-13 02:46
有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
是得按照顺序,也可以跳着操作哦
作者: 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
可以使用 fdb_kv_iterate 迭代器 API 进行统计
作者: sunnydragon 时间: 2020-9-21 16:52
迭代器使用的时候先检查下每个 TSL 的状态
作者: W872529868 时间: 2020-9-27 22:45
有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
问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除呢?一般设备出厂时候会做 flash 的格式化处理
作者: W872529868 时间: 2020-9-29 18:56
- //执行时间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
学习下
作者: sunnydragon 时间: 2020-10-1 16:38
底层 fal flash 设备读写时有没有加锁?感觉像是多个分区同时操作一个 flash 导致的错误
作者: W872529868 时间: 2020-10-2 01:08
问题已解决,万分感谢,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
有 gitee 的
作者: sunnydragon 时间: 2021-4-4 16:05
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 |