【开源】FlashDB V1.0.0 正式版发布,还有在线的文档中心
本帖最后由 sunnydragon 于 2020-10-8 21:42 编辑FlashDB 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。与传统的基于文件系统的数据库不同,FlashDB 结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
更多关于 FlashDB 的介绍,请查看: https://github.com/armink/FlashDB
FlashDB beta 测试版目前已发布数月,在这段时间里, 陆陆续续收到大家的很多意见反馈,有些甚至也已经用在项目上了 。结合大家的反馈,相关的问题均已修正,并对文档、测试等方面做了挺多完善。今天正式版终于可以与大家见面了,一起来看下正式版的大致更新内容:
新增在线文档中心内容丰富,分为:入门、示例及开发三大章节,上手方便,详见: http://armink.gitee.io/flashdb/#/zh-cn/
http://static.zybuluo.com/armink/68j1hwmrm3xu2brcyhnqva15/image.png
新增自动化测试新增基于 Travis CI 的自动化构建检查及自动化测试,保证每次代码提交不仅编译通过,功能也都经过 qemu 模拟器环境下的测试验证。qemu 模拟器下的自动化测试部分日志大致如下,完整日志请查看:https://travis-ci.com/github/armink/FlashDB
http://static.zybuluo.com/armink/c7h6in2qf74hoe2e7og9i66b/image.png
新增 KV 迭代器的 API方便实现对 KVDB 中的全部 KV 进行遍历,感谢网友 eggcar 的贡献。迭代器示例文档: http://armink.gitee.io/flashdb/#/zh-cn/sample-kvdb-traversal
新增 contorl 控制函数通过 fdb_kvdb_control 及 fdb_tsdb_control 的控制函数,用户可以实现一些对于数据库的控制管理功能。比如:设置 加锁和解锁 函数、设置 扇区大小 等对于 TSDB 的 control 函数,用户还可以
[*]设置让数据库不启动处理滚动写入模式,这样如果数据库满,最旧的数据也不会删除,但无法插入新的数据
[*]获取上次的使用的时间戳,这样即便系统中没有 RTC ,也可以使用软件模拟时间戳功能,适用于一些对于 实时时间不敏感的场景。点击查看更多介绍 。
其他
[*]完善打印日志
[*]修正一些潜在 bug
下载本坛下载:
Github (最新版本): https://github.com/armink/FlashDB
沙发推荐 good一直想尝试没时间去弄这次好好研究下 赞
一直关注楼主的开源作品,已经应用了好几个实际项目 感谢楼主分享 持续关注中 请问在线文档怎么做的? 感谢楼主无私分享 感谢楼主分享 感谢楼主无私分享 学习一下,很好的资料 感谢分享 真的变成数据库了 新项目可以放弃之前的sfud+自建的数据格式了 fengyunyu 发表于 2020-10-9 08:19
请问在线文档怎么做的?
戳这里看看:https://docsify.js.org/#/ 祝贺一下! security 发表于 2020-10-9 14:00
祝贺一下!
多谢兄弟捧场 Flyback 发表于 2020-10-9 13:23
新项目可以放弃之前的sfud+自建的数据格式了
快来试试吧,FlasDB 对于掉电安全和磨损均衡支持的很好,对于用户使用就省事了 有个疑问,flash满了会怎么处理,满了已经是TSDB中删除状态的记录会自动擦除吗? sunnydragon 发表于 2020-10-10 09:30
快来试试吧,FlasDB 对于掉电安全和磨损均衡支持的很好,对于用户使用就省事了 ...
掉电安全的原理是什么呢?电都没有了,怎么写入数据,怎么保证安全?
难道是不停的写入,不开很大的缓存?或者是靠系统剩余的点来保存数据,但是这个你又怎么知道系统没电了? xtaens 发表于 2020-10-10 10:27
掉电安全的原理是什么呢?电都没有了,怎么写入数据,怎么保证安全?
难道是不停的写入,不开很大的缓存 ...
基本原理:两种状态:完全写入新的数据,和完全不写入(或者说回滚到上一次的数据)。 支持,后续可以替换掉easyflash了 支持一下,楼主发的开源都还不错 支持,很厉害的样子 security 发表于 2020-10-10 10:36
基本原理:两种状态:完全写入新的数据,和完全不写入(或者说回滚到上一次的数据)。 ...
完全不写入倒是好理解。
完全写入那就得有新数据就马上写入,这样会造成flash寿命缩短【其实也不是很重要了,保存数据为重】,如果在写入时没电了这样也会造成数据丢失的,这种情况怎么处理呢? xtaens 发表于 2020-10-12 11:32
完全不写入倒是好理解。
完全写入那就得有新数据就马上写入,这样会造成flash寿命缩短【其实也不是很重 ...
写入时没电了,那就是没写成功,等同于完全不写入。
掉电安全的意思就是:保证不会损坏数据,数据都会是有效的,只不过数据可能不是最新的。 能不能用在51芯片上?速度和代码占用怎么样? 大佬又发布作品了,支持支持。 在esp8266上移植flash DB,在FAL层的fal_partition.c出现了编译问题,麻烦帮忙看下:
提示错误信息:
.flash.rodata len 0x0f1d0 load 0x4026d8c4
A fatal error occurred: Segment loaded at 0x4026d8c4 lands in same 64KB flash mapping as segment loaded at 0x4026d844. Can't generate binary. Suggest changing linker script or ELF to merge sections.
屏蔽了SECTION(x) 就可以编译成功,但是运行会异常,代码如下所示:
感谢分享,支持楼主 syj0925 发表于 2020-10-12 14:02
在esp8266上移植flash DB,在FAL层的fal_partition.c出现了编译问题,麻烦帮忙看下:
提示错误信息:
.flas ...
按照你的方式注释掉就好了哈,异常报错可能是别的原因把?有没有日志啥的 注释掉section,编译过了,但是一启动就死机。感觉像是这些加载分区导致的 syj0925 发表于 2020-10-13 11:25
注释掉section,编译过了,但是一启动就死机。感觉像是这些加载分区导致的
默认是都是直接引用在 fal_cfg.h 中FAL_PART_TABLE 宏定义的分区表,不会去执行加载分区表动作,除非你定义了 FAL_PART_HAS_TABLE_CFG 宏 sunnydragon 发表于 2020-10-10 09:30
快来试试吧,FlasDB 对于掉电安全和磨损均衡支持的很好,对于用户使用就省事了 ...
能不能用在51芯片上?速度和代码占用怎么样? sunnydragon 发表于 2020-10-13 12:38
默认是都是直接引用在 fal_cfg.h 中FAL_PART_TABLE 宏定义的分区表,不会去执行加载分区表动作,除非你 ...
谢谢解答。问题解决了,原因是:fal层reed write erase中的offset没有加上addr偏移导致,把bootloader给破坏了。
有个疑惑请教一下:
1.就是用SECTION这个宏定义flash表,的作用是什么?
2.我把SECTION注释掉了,对我应用有啥影响吗? newuseruser 发表于 2020-10-13 13:02
能不能用在51芯片上?速度和代码占用怎么样?
51 的架构,应该不太能适应,玩不了太高级的东西。 newuseruser 发表于 2020-10-13 13:02
能不能用在51芯片上?速度和代码占用怎么样?
多年不玩了,不太确定,感觉对芯片平台没啥限制 syj0925 发表于 2020-10-13 21:56
谢谢解答。问题解决了,原因是:fal层reed write erase中的offset没有加上addr偏移导致,把bootloader给 ...
是已经在 8266 上用起来了吗?方便做一个 8266 的 demo ,提交到 FlashDB 上吗?这样其他试用 8266 用户上手也会更加方便 https://github.com/armink/FlashDB/tree/master/demos
1.就是用SECTION这个宏定义flash表,的作用是什么
这个是当 不配置 FAL_PART_HAS_TABLE_CFG 时才有用处,此时可以在指定的 flash 地址上查找分区表,比如: 把分区表存放在 Bootloader 固件固件的指定位置里,而不是定义在 app 上
2.我把SECTION注释掉了,对我应用有啥影响吗?
没有影响,后面我也考虑把这个删除 security 发表于 2020-10-12 12:01
写入时没电了,那就是没写成功,等同于完全不写入。
掉电安全的意思就是:保证不会损坏数据,数据都会是 ...
谢谢
那新的数据什么时间写呢?怎么保证写了就一定能写成功呢?写了一半突然掉电数据就会被破坏,这些问题我觉得单从软件方面无法可靠的实现啊。【改天我研究下这部分代码看看怎么实现的,总觉得支持掉电保护功能不靠谱{:titter:} 】 xtaens 发表于 2020-10-14 11:07
谢谢
那新的数据什么时间写呢?怎么保证写了就一定能写成功呢?写了一半突然掉电数据就会被破坏,这些问 ...
你去看一下源码,看完了,可以再在这边分享。
不用担心,掉电安全的本质就是那样,这是成熟的理论。 security 发表于 2020-10-14 11:17
你去看一下源码,看完了,可以再在这边分享。
不用担心,掉电安全的本质就是那样,这是成熟的理论。 ...
好的,谢谢 sunnydragon 发表于 2020-10-14 09:25
是已经在 8266 上用起来了吗?方便做一个 8266 的 demo ,提交到 FlashDB 上吗?这样其他试用 8266 用户 ...
可以的,我这周末有空我提交一个 在此请教一个问题:关于key/value 如何存储复杂结构体参数?
描述:
在智能家居网关中,网关需要存放cloud设置下发的联动应用,比如网关要能存储最大50个联动,网关用结构体来存放联动,结构如下:
目前的存储方式:
一个联动用一个key/value来存储,上电初始化,直接把key/vlaue读取到结构体数组中;
遇到的问题:
联动要加入新场景,就必须改动结构体,这样OTA升级已经出厂的设备,就会导致原有设备中的联动参数失效;
目前能想到的办法:
结构体中的数据先转换为json,然后在写入key/value,读取时,从json转换为结构体;但是这种方式,感觉效率很低,又繁琐,不知道大伙有什么更好的机制来解决这个问题? syj0925 发表于 2020-10-20 22:30
在此请教一个问题:关于key/value 如何存储复杂结构体参数?
描述:
在智能家居网关中,网关需要存放cloud ...
你的问题我在github上提交估issue了,目前不支持value内容变更升级,朱总给了目前的解决方案。
解决方案
syj0925 发表于 2020-10-20 22:30
在此请教一个问题:关于key/value 如何存储复杂结构体参数?
描述:
在智能家居网关中,网关需要存放cloud ...
建议在结构体的第一个元素用于存储当前结构体 数据结构的版本号
从 flash 中读取回来的 kv 先判断版本号是否与当前使用的结构体版本一致,如果不一致,执行你的对应业务,比如旧版本迁移到新版本再存储,或者重新写入新的,等等 看着很厉害的样子 待会开始移植试试 哇 感谢!!咨询下 那个文档 可以下载离线的吗??? 公司没有外网了 想下载学习 jaywen 发表于 2020-10-22 20:36
哇 感谢!!咨询下 那个文档 可以下载离线的吗??? 公司没有外网了 想下载学习 ...
文档在 doc 目录下,是 Markdown 的,可以直接使用 Markdown 软件看 我这个彩笔从3点几,就开始保存版主的这个大宝贝代码,总想着一定要用起来。。后来用新的版本替换旧的。。。直到现在,本彩笔还是没有勇气打开看一下。。。我怕太菜看不懂{:cry:} QVQ 发表于 2020-10-23 19:22
我这个彩笔从3点几,就开始保存版主的这个大宝贝代码,总想着一定要用起来。。后来用新的版本替换旧的。。 ...
学习都会有个过程,可以先简单看下示例程序,还有丰富的说明文档,直观上有个概念了,后面再学习会更加顺利一些哈 在线文档,很好。谢谢分享! 请教下楼主,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); oooios 发表于 2020-11-25 14:54
请教下楼主,tsdb在初始化后调用 tsdb_sample(&tsdb);运行是正常的,从日志看,数据读写是ok的。
但是如 ...
有在 demo 平台上,直接跑 demo 测试吗 sunnydragon 发表于 2020-11-25 21:08
有在 demo 平台上,直接跑 demo 测试吗
谢谢回复。马上试一下。 sunnydragon 发表于 2020-11-25 21:08
有在 demo 平台上,直接跑 demo 测试吗
是自己调用的有问题,打算按键后产生一条日志的,fdb_tsl_append放在中断里面了,放到主循环中是OK的。谢谢 请问有没有条数数量上限,例如达到5000条以后,性能有没有下降?能否给出几个代表性单片机上的性能数据? 您好我直接下载的103的demo 不过串口打印后显示有错误,第一次用,麻烦帮忙看下是什么问题,谢谢
很厉害的样子,希望有Esp8266的demo。 diyeyuye 发表于 2020-12-17 18:30
您好我直接下载的103的demo 不过串口打印后显示有错误,第一次用,麻烦帮忙看下是什么问题,谢谢
...
第一次使用是需要自动格式化的过程,所以有这个提示 Serial 发表于 2020-12-30 17:46
很厉害的样子,希望有Esp8266的demo。
https://github.com/armink/FlashDB/tree/master/demos/esp8266_spi_flash
已经有了哈 这个能用在EEPROM里面吗?比如24C256。 不错,很好用,正在学习! 这个H743上面可以用吗 本帖最后由 andy_huang 于 2021-3-10 20:06 编辑
花了两天时间,移植并调试成功应用在STM32F407+SPIFLASH,非常6,感谢楼主armink的开源
这个支持QSPI吗 收到,谢谢分享 不知道能不能动态建立库?分不同的时间段建立不同库,不需要的的时候直接删除库,查找库的的速度更快。 andy_huang 发表于 2021-3-10 20:03
花了两天时间,移植并调试成功应用在STM32F407+SPIFLASH,非常6,感谢楼主armink的开源
...
能不能发个源码?手边刚好有块407的板子,带了spiflash。 fcmer2016 发表于 2021-3-27 16:29
不知道能不能动态建立库?分不同的时间段建立不同库,不需要的的时候直接删除库,查找库的的速度更快。 ...
可以的,新版本是支持文件模式,这样就可以动态创建了 本帖最后由 fcmer2016 于 2021-4-5 20:56 编辑
sunnydragon 发表于 2021-4-4 18:41
可以的,新版本是支持文件模式,这样就可以动态创建了
我不太熟悉hal库,我手边刚好有个stm32f40ve的板子,能不能给发个demo。spi1接W25Q16。
另外手头在用的个芯片,厂家没有提供hal库,只能用标准库,怎么移植? Module ro codero datarw data
------ ---------------------
fdb.o 276 232 1
fdb_kvdb.o 4 584 356 1
fdb_tsdb.o 1 160 236
fdb_utils.o 418 1 024
还能更小吗? 如果是一共就几十K的MCU。舍不得花6K来做flash存储处理 STM32G4系列移植有什么注意的地方吗?G4系列的flash操作只有双字读写和快速块写,现在采用的双字模式,FDB_WRITE_GRAN已改为64,flash读写函数单独测试是OK的,现在测试执行的log如图 请教一下,使用tsl的时候,query by time 查询出一条记录,我在query by time cb中直接调用fdb tsl iter()想把当前查到的这条记录从write改到usr1改如何操作?从日志看它并不是修改的当前一条,而是从头开始修改,如果头上已经有修改成其他状态,就会失败。还麻烦指导下。谢谢 楼主,请教一个问题,在初始化的时候偶尔会出现“ Error: this TSL (0x000A03F8) size (1400) is out of bound.”和扇区损坏导致重新格式化的情况,这是在断电之后再上电,偶尔会出现,这种情况有没有方法避免? 做成arduino下的库就好了 使用flashDB时如何获取剩余的可用存储空间大小? 请教版主
tsdb记录 如何按时间降序排序读取显示呢,谢谢 不知道tri公司的 FMM谁用过?两个原理上有啥差异大不大。
页:
[1]