【开源】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
优秀啊 大佬 FAL好用,还没注意是RT开源的,还以为第三方的。 好,分论坛我也改名了。 优秀大佬 真优秀大神 这个版本的功能,包含了之前宝贝的功能吧 armok. 发表于 2020-6-7 19:26
好,分论坛我也改名了。
多谢老大 lkl10800139 发表于 2020-6-7 20:26
这个版本的功能,包含了之前宝贝的功能吧
IAP 功能好像有些鸡肋暂时取消了
LOG 功能也可以通过 TSDB 来实现 我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不管对用户还是厂商都一样。现在我都是自己写入和读出的时候对数据做加密,要是你们这个自带就更好了。 期待大作.. 马上移植试用{:lol:} 现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。 PPS 发表于 2020-6-7 22:28
我来加一把火,下一步能不能加上类似bitlocker的功能?也就是对整个数据加密。物联网更要讲究数据安全,不 ...
可以考虑的哈,安全性在物联网世界中的重要性非常高的 myrgb 发表于 2020-6-8 08:23
现在都有HAL库,看来是趋势了。我还停留在标准库上。大师的开源项目还不怎么会用。 ...
后面我再出一个 stm32f1 的标准库 例程吧 不断更新啊!牛牛牛! 期待 stm32f1 的标准库 例程 ! FlashDB真牛!已经在学习RTT了,写得真心好,国产嵌入式的未来! 支持一个,前几天刚刚移植了您的hardfault那个库,非常强大 支持,遗憾的是一直没有用上,easyflash eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本 我准备用在STM32F1上面,Flash用的全寄存器操作,可以兼容的吧。 大佬这个一直在用,感谢分享。 支持,研究下 tim4146 发表于 2020-6-8 12:49
支持一个,前几天刚刚移植了您的hardfault那个库,非常强大
好用就好,FlashDB 可以存储 CmBacktrace 诊断出来的问题原因 zhonghua_li 发表于 2020-6-8 13:21
eeprom用起来比较耗费空间。 可以考虑开发一个eeprom的版本
EEPROM 空间有些小,可能不太适合大量的数据存储
用 EasyFlash V3 版本会比较适合 EEPROM EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊 sunnydragon 发表于 2020-6-8 20:49
EEPROM 空间有些小,可能不太适合大量的数据存储
用 EasyFlash V3 版本会比较适合 EEPROM...
大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变更,就回写flash。
全部以字符串存放,占用空间大,而且每次读写需要转换。 用在单片机上感觉比较吃力。 fenglove 发表于 2020-6-9 08:04
EasyFlash请教一下,是不是可以把单片机变成一个小数据库啊
对了,所以后来更名为 FlashDB 了,更加专注于数据存储 期待大作 得空研究研究,又多了一个工具 期待f1系列的例子和说明 zhonghua_li 发表于 2020-6-9 16:51
大概看了一下V3的代码。
大概的思路好像是,建立一个RAM缓存 所有变量,以字符串方式存放在RAM中。一旦变 ...
一直也需要一个管理EEPROM参数的工具,有没有找到合适的? 666666666665 基于flash的嵌入式数据库 楼主作品都是精品 麻烦帮忙看看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是正常的。
谢谢。 oooios 发表于 2020-6-13 22:26
麻烦帮忙看看flashdb配置是否正确。
const struct fal_flash_dev bt832_onchip_flash =
{
感觉驱动的问题概率大一些,做驱动时 .addr = 0x70000, 有没有用到?建议查看下 读写擦 函数的具体执行结果 sunnydragon 发表于 2020-6-14 10:05
感觉驱动的问题概率大一些,做驱动时 .addr = 0x70000, 有没有用到?建议查看下 读写擦 函数的具体 ...
好的谢谢。。。 很棒啊,有机会在项目中用一下 这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用分支? foxfire 发表于 2020-6-15 08:53
这样看下来,可以理解是easyflash是最底层的,easylog是easyflash的应用,而easylog则是flashDB的一个应用 ...
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。 有一段时间没上论坛了,恭喜开设专栏! 不错值得学习 security 发表于 2020-6-15 11:46
只能这么说吧,log 跟 flash、db,是两个不同领域的东东。
老兄说的对~~
log 算是应用,最上层的东西,底层的存储介质,可以是 EasyFlash ,也可以是 FlashDB,还可以是文件系统 sunnydragon 发表于 2020-6-15 19:39
老兄说的对~~
log 算是应用,最上层的东西,底层的存储介质,可以是 EasyFlash ,也可以是 FlashDB,还 ...
谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打断点可以看到完整日志,但是不调试,日志就不全。log使用的是easylog通过rtt输出。另外问一下,kvdb插入和查找速度如何? oooios 发表于 2020-6-16 22:46
谢谢版主!问题找到了。是lock和unlock两个函数,它里面禁止中断和使能中断导致。请问一下,带着仿真器打 ...
日志丢失的问题,我不太清楚原因,要自己深入查一下
FlashDB 的性能还不错,项目 readme 里有性能测试数据,可以看一下 有移植到linux的吗?linux文件模拟flash citroen988 发表于 2020-6-23 18:03
有移植到linux的吗?linux文件模拟flash
linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的 sunnydragon 发表于 2020-6-23 19:48
linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的 ...
有例程?不懂FAL 不错,支持 john78 发表于 2020-6-23 23:35
有例程?不懂FAL
有例程的,你找一下? 这么多年了这个tool还在,感谢版主 sunnydragon 发表于 2020-6-23 19:48
linux 下可以呀,直接对接上 FAL 就行了,我的自动化测试,就是用的 qemu + 文件系统跑起来的 ...
对接上 FAL 就行了?
我理解FAL 是用于文件系统(fatfs)对接 flash的, fatfs <---> FAL<---> flash
我想在应用层运行FlashDB,将数据存储在文件中,linux应用层直接操作文件就行了。 FlashDB <---> 文件
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string, int, char,short , 或者组合起来的类型,结构体里面4种类型都有。
FLASHDB有更新吗?
谢谢
citroen988 发表于 2020-6-25 12:24
对接上 FAL 就行了?
我理解FAL 是用于文件系统(fatfs)对接 flash的, fatfsFAL flash
用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。
晚些时候,我把我这边边的基于文件系统的示例公布出来,你可以持续关注哈 oooios 发表于 2020-6-25 17:31
版主你好
请教下是否直接可以调用fdb_kv_set_blob、fdb_kv_get_blob两个函数,是否支持各种类型,如string,...
FlashDB 对类型没有任何限制,什么基本类型、结构体、数组等等都支持
FlashDB 会正在持续更新中,你可以放心使用哈 sunnydragon 发表于 2020-6-26 10:22
用读写文档来模拟 Flash 的读写擦函数,然后将这些函数对接上 FAL 就可以了。
晚些时候,我把我这边边的 ...
最好整一个linux系统的demo,可以直接make & run
感恩天龙哥!~~~ 厉害厉害! 对FLASH有没要求
SPI FLASH是用page容量小的合适还是page容量大的合适 支持现在用了FATFS不知道这个怎么使用 希望楼主能整个工程例子 Easyflash用起来很巴适,点个赞{:victory:} 铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:sweat:} qwerttt 发表于 2020-7-7 21:45
对FLASH有没要求
SPI FLASH是用page容量小的合适还是page容量大的合适
没啥要求,片上Flash 可以,Nor Flash 也可以 atonghua 发表于 2020-7-8 15:17
支持现在用了FATFS不知道这个怎么使用 希望楼主能整个工程例子
用 FAL 对 Flash 做个分区,一部分用文件系统,一部分用 FlashDB waterx3 发表于 2020-7-9 11:49
铁电,read_sector_info时,(sector->magic != SECTOR_MAGIC_WORD),然后就hardfault了,能指点一下吗?{:s ...
试试通过 CmBacktrace 分析下具体的错误原因吧 开始学习 支持一下,可以会用到 FlashDB不再支持IAP和LOG了嘛? 谢谢大佬,还不知道怎么用,先看看 支持大佬,以前用过一次,很不错 支持,下载研究研究{:lol:} 请问下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有什么作用??
再次谢谢楼主。 oooios 发表于 2020-8-20 17:42
请问下flashdbtsbd 里面
count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
fdb_t ...
有体验 demo 的效果了吗? sunnydragon 发表于 2020-8-21 20:52
有体验 demo 的效果了吗?
嗯,体验了,好用。跟上一版有些接口变了。
就是数据库的 增( 删 改)查,删除不知道如何测。
楼主厉害。{:biggrin:} oooios 发表于 2020-8-22 21:40
嗯,体验了,好用。跟上一版有些接口变了。
就是数据库的 增( 删 改)查,删除不知道如何测。
楼主厉害 ...
fdb_tsl_set_status 设置下删除状态,就相当于执行了删除的动作
下次就查询不到了 牛气 学习 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”状态的数据读取出来?
望指点一下,谢谢。 W872529868 发表于 2020-9-13 02:46
有2个问题请教您一下
1、程序中有以下注释,删除一条,是不是要先用“fdb_tsl_set_status()”方法设置为 ...
是得按照顺序,也可以跳着操作哦
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
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值,统计数据个数的功能。 有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经删除的数据也读出来,当有几百条已经删除的数据的时候,会导致读取速度会非常慢,有没有方法只读取有效的数据? armfans 发表于 2020-9-16 23:07
有个问题请教下,在用键值数据库时,下面几个函数实现了读取,保存,删除数据的功能,
fdb_err_t f ...
可以使用 fdb_kv_iterate 迭代器 API 进行统计 W872529868 发表于 2020-9-17 02:05
有个问题请教您一下,在使用时序数据库的时候,使用“fdb_tsl_iter()”方法读取数据,但是这个方法会把已经 ...
迭代器使用的时候先检查下每个 TSL 的状态 有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会进行时间片切换,其他线程会读写已经初始化完成的键值数据库,但是,会导致时序数据库初始化异常。
W872529868 发表于 2020-9-27 22:45
有2个问题请教下您:
1、确认一下,程序中使用了一个键值数据库,一个时序数据库,这两个数据库都是在同一 ...
问题1:看着没问题
问题2:你说的:“而全部擦除的初始化约260秒,这时间太长了”,什么时候需要全部擦除呢?一般设备出厂时候会做 flash 的格式化处理 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” 初始化异常。
上述,是我的实测结果,想请您确认下。
学习下
W872529868 发表于 2020-9-29 18:56
举例:上面的初始化程序在线程A里面执行,OS的时间片是5ms,在初始化完成 “kvdb_param” 数据库的时候 ...
底层 fal flash 设备读写时有没有加锁?感觉像是多个分区同时操作一个 flash 导致的错误 sunnydragon 发表于 2020-10-1 16:38
底层 fal flash 设备读写时有没有加锁?感觉像是多个分区同时操作一个 flash 导致的错误 ...
问题已解决,万分感谢,flash底层没有用fal flash ,并且没有锁,导致了这个问题。 优秀,学习 请教下楼主,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); 国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。 在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生无限递归,导致互斥锁死锁,这种情况,您有什么建议? 浮华一生 发表于 2021-3-28 21:24
国内挂gitee链接吧, github 巨慢,还经常上不去. 唉。。。
有 gitee 的 W872529868 发表于 2021-4-2 17:45
在使用您的“TSDB”来记录设备日志,非常好用,但是,在打印Flash_BD的日志,并且保存的时候,有时候会产生 ...
FlashDB 自己的日志可以输出到串口 好用好用 顶顶顶!!! rtthread中用的很爽。 有个问题不是很明白,这个磨损平衡!
如上图,按顺序存储数据,当增加KV9的时候触发GC,这时存储区也满了,删除KV1(数据也可以丢了)把KV2、KV3移到扇4,擦除扇1,开始向扇区1填充数据。
当扇区1填充满了后,扇4的数据可以丢掉了,擦除扇区4,把扇区2的数据搬过来。
那这个样扇区4擦除的次数是其他扇区擦除次数的总和!
不知道我理解的对不? 这个好,学习。 感谢。 朱哥,我想问下easyflash无论在查找和擦除的时候都在ENV中没有找到KEY,无法读和擦写,用的F407ZG不知道是什么原因
页:
[1]