0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SFDB - 专为记录型数据存储而生

RTThread物联网操作系统 来源:未知 2023-10-24 10:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Simple and Fast


SFDB 即 Simple File Database, 一个 简单 的文件型数据库,使用 简单,移植 简单,功能 简单,原理 简单,一切都很 简单,一切都很 快。适用于 固定长度 的 记录型 数据存储,类似于时序数据库,可用于存储历史记录、报警记录、日志等。

如果你的项目需要记录数据,且数据的长度或最大长度是固定的,已存入的数据不需要修改,同时需要快速清空和基于 记录条数 (从第几条开始,查多少条数据)的查询,而你的项目恰好有个文件系统,那么 SFDB 可能适合你。

特性

  • 使用文件进行存储

  • 简单的数据写入接口

  • 到达上限时自动从头覆盖

  • 支持顺序与倒序查询

  • 支持从任意条数开始查询

  • 支持清空(重置)数据库

使用篇


本篇基于 HMI-Board 来演示 SFDB 的使用。

创建工程

1. 使用 RT-Thread Studio 基于 HMI-Board 开发板创建一个项目。选项都保持默认即可。

wKgZomU3KwmAZAfuAACVAYoYwK8947.png

2. 创建完成后打开 RT-Thread Settings,选中 Enable SDCARD filesystem 打开文件系统。

wKgZomU3KwmADF1pAACd82sc6i8822.jpg

3. 在组件配置中打开 RTC 设备驱动,并使能 使用软件模拟RTC设备选项(提供给文件系统使用)。

wKgZomU3KwmAfWDxAACMpodZc7Q681.jpg

4.添加 SFDB 软件包。

wKgZomU3KwmARL9cAAB9lGBaaGI941.png

5. 勾选 SFDB 配置项的 Use sfdb example 打开示例代码。

wKgZomU3KwmAHahfAAB6GTVJ8SE079.jpg

6. 全部配置完进行保存,当前软件包会就被应用到项目中。

编译及下载

在编译之前,我们需要修改一下例程的配置,来适配我们的文件系统目录。打开 packages/sfdb-v0.0.2/examples/rtthread/example.c,找到宏定义 TEST_FILE_PATH,将其修改为 /test.sdb

wKgZomU3KwqAVrmHAAAmASskF9c103.png

此处需要注意,sfdb 在不存在当前文件时会自动创建,但如果路径中包含有多层目录,则这些文件夹必须存在,即 sfdb 不会自动创建文件夹。

wKgZomU3KwuADstCAABXvXZdzgQ836.jpg

修改完路径配置后即可编译代码。

控制台看到上图的信息即编译成功,此时进行程序烧录。

运行示例

程序下载完成后连接并打开终端,按下 TAB 键可以看到命令行中出现了两条 SFDB 的命令:

wKgZomU3KwuAcnN2AADSal2L3a0492.jpg

此时说明 SFDB 已经成功运行起来了。而这两条命令作用如下:

  • sfdb_test:启动 SFDB 写入测试,系统会持续写入到设定的上限值

  • sfdb_read:读取测试数据库内的数据。

写入测试

例程中设定的数据库存储上限为10000条,同时会写入10100条数据。接下来我们使用 sfdb_test 来启动写入测试:

wKgZomU3Kw2AR_gVAAAQWeBqqdo558.png

可以看到日志中完整写入了10100条数据,而且每条数据的写入时间也都维持在 5-10 ms,并没有随着写入数量的增多而增大。

读取测试

sfdb_read命令的形式有两种:

  • sfdb_read 读取数据库基本信息

  • sfdb_read [offset] [number] [order(0:asc 1:dsc)] 根据orderoffset中读取number条数据

1. 基本信息读取

基本信息不需要输入参数,直接 sfdb_read 即可:

wKgZomU3Kw2AJ1w4AAANfo1fACo654.png

可以看到,数据库的基本信息包括:

  1. 当前最新数据的索引(容量10000,写入10100,多出来的将会从最老的数据开始覆盖)

  2. 数据库中的总有效数据

  3. 每条数据的长度

这些数据与我们的配置和写入也是完全一致的,说明我们刚才数据库的创建及写入操作是成功的。

2. 数据读取

读取的 order 为读取顺序,其中0为从最老的数据开始读,1为从最新的数据开始读:

- 1. 正序读取(从旧到新)

wKgZomU3Kw2ASbZqAAAhYDSLqDM695.png

- 2.倒序读取(从新到旧)

wKgZomU3Kw2AFsUtAAAhrRabQ7Y473.png

- 3. 注意

在倒序读取模式下,由于保留了读取性能, buf 的数据仍然是顺序的,使用者需要手动处理 buf 中的数据顺序。当数据 1-100 依次存入时,若以倒序从 offset 为 0 的位置读取 10 条数据,存入 buf 中,buf 中的数据顺序为 91 92 93 94 95 96 97 98 99 100 ,而非 100 99 98 97 96 95 94 93 92 91。使用者可以在应用层可以参考例程通过索引倒转的形式实现数据顺序的倒转,如下:


		

1ret=sfdb_read(&sfdb,data_buf,data_sz,offset,number,order); 2for(inti=0;i< ret; i++) { 3if(order==SFDB_READ_ASC){ 4print_index=i; 5}else{ 6print_index=ret-i-1; 7} 8SF_LOG("%-5d:%s",offset+i+1,(char*)&data_buf[print_index*sfdb.hdr.record_len]); 9}

移植篇


如果需要在别的平台使用SFDB,移植起来也是非常方便。仅需参考 sfdb_port.c 实现 sfdb_fs_t 里面的文件操作接口,以及在 sfdb_port.h 中包含当前平台所需要的头文件并实现 SF_MEMCPYSF_MEMSETSF_LOG 宏定义即可。

接口结构如下:


		

1typedefstruct_db_fs{ 2int(*op)(struct_sfdb*db,constchar*path,intflags);//Openfile 3int(*cl)(void*fd);//Closefile 4int(*sy)(void*fd);//Syncfile 5size_t(*rd)(void*fd,void*buf,size_tlen);//Readfile 6size_t(*wr)(void*fd,constvoid*buf,size_tlen);//Writefile 7size_t(*sk)(void*fd,size_toffset);//Setfileposition 8int(*rm)(constchar*path);//Deletefile 9}sfdb_fs_t;

RT-Thread 下的移植示例:


		

1//sfdb_port.c 2staticintfs_open(sfdb_t*db,constchar*path,intflags){ 3intoflags=O_RDWR; 4if(flags&SFDB_O_CREATE)oflags|=O_CREAT; 5db->fd=(void*)open(path,oflags); 6if((int)db->fd< 0){ 7return-1; 8}else{ 9return0; 10} 11} 12staticintfs_close(void*fd){ 13if(fd>=0){ 14close((int)fd); 15return0; 16}else{ 17SF_LOG("invalidfd%d,closefailed",(int)fd); 18return-1; 19} 20} 21staticintfs_sync(void*fd){returnfsync((int)fd);} 22staticsize_tfs_read(void*fd,void*buf,size_tlen){returnread((int)fd,buf,len);} 23staticsize_tfs_write(void*fd,constvoid*buf,size_tlen){returnwrite((int)fd,buf,len);} 24staticsize_tfs_seek(void*fd,size_toffset){ 25intret=0; 26ret=lseek((int)fd,offset,SEEK_SET); 27if(ret< 0)return0; 28returnret; 29} 30staticintfs_remove(constchar*path){returnunlink(path);} 31sfdb_fs_tsfdb_fs={ 32.op=fs_open, 33.cl=fs_close, 34.sy=fs_sync, 35.rd=fs_read, 36.wr=fs_write, 37.sk=fs_seek, 38.rm=fs_remove, 39};


		

1//sfdb_port.h 2#include 3#include 4#include 5#include 6#include 7#include 8#defineSF_MEMCPYrt_memcpy 9#defineSF_MEMSETrt_memset 10#defineSF_LOG(format,...)rt_kprintf("[SFDB]:"format" ",##__VA_ARGS__)

源码仓库


详细的API说明可以到源码的仓库查看:

Github:https://github.com/WKJay/sfdb

Gitee:https://gitee.com/wangjunjie997

———————End——————

wKgZomU3Kw-AYtuHAHiX-BnG6Ho047.gif点击阅读原文进入官网


原文标题:SFDB - 专为记录型数据存储而生

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1541

    浏览量

    44293

原文标题:SFDB - 专为记录型数据存储而生

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电能质量在线监测装置的监测数据如何存储和分析?

    19862-2016、IEC 61000-4-30 等标准要求,兼顾数据完整性与分析专业性。 一、监测数据存储机制 数据存储
    的头像 发表于 12-05 17:58 3081次阅读
    电能质量在线监测装置的监测<b class='flag-5'>数据</b>如何<b class='flag-5'>存储</b>和分析?

    MCU单片机串口数据记录仪方案

    在工业控制、环境监测、物流追踪等众多领域,如何可靠、便捷地记录设备串口数据成为不少工程师关注的焦点。基于MCU单片机的串口数据记录仪方案,正以其高效集成、灵活
    的头像 发表于 11-27 15:02 110次阅读

    Fluke 962A组网温湿度记录仪在焊条存储仓库的应用

    某重型装备制造企业,为保证焊接的质量,对于焊条存储有严格要求。焊条存储库内需严格遵循相对湿度不高于 60%、温度不低于 10℃ 的存储标准,因此需要多时段进行温湿度数据的查看和
    的头像 发表于 11-06 18:06 1651次阅读

    医院专用数据记录仪主要功能有哪些

    数据记录仪的主要功能在于采集、存储并分析各类数据,在众多领域有着广泛而深入的应用,为不同行业的发展带来了新的活力与变革。那么,医院专用数据
    发表于 09-28 14:53

    横河GP20温升记录仪外部存储使用方法 实现数据冗余

    横河GP10/GP20便携式无纸记录仪通过内部存储器与外部存储介质结合的方式实现数据冗余,确保测量数据的安全性和可访问性。外部
    的头像 发表于 09-07 14:54 618次阅读
    横河GP20温升<b class='flag-5'>记录</b>仪外部<b class='flag-5'>存储</b>使用方法 实现<b class='flag-5'>数据</b>冗余

    医院专用数据记录仪产品有哪些?有何推荐?

    testo CFR 数据记录专为过程验证设计,符合CFR法规要求,可用于医院冻干工艺等需要高精度验证的场景。此外,德图产品均符合医院对数据记录
    发表于 08-25 16:02

    一款专为「镜面/透明工件」而生的激光位移传感器

    传统激光位移传感器遇到[ 高透亮 ]工件,会无法检测,或者误差很大。光子精密有一款专为「镜面/透明工件」而生的激光位移传感器。
    的头像 发表于 08-14 10:13 680次阅读
    一款<b class='flag-5'>专为</b>「镜面/透明工件」<b class='flag-5'>而生</b>的激光位移传感器

    轨道交通数据存储难题如何破解?ICY DOCK工业级硬盘盒提供可靠答案!

    轨道交通高强度振动、温差巨大及严苛空间限制,时刻威胁着列车监控、乘客信息、安防录像等关键数据存储安全与稳定访问。设备易损、维护困难、停机风险高成为行业痛点。为此,ICYDOCK专为轨道交通
    的头像 发表于 07-17 17:58 810次阅读
    轨道交通<b class='flag-5'>数据</b><b class='flag-5'>存储</b>难题如何破解?ICY DOCK工业级硬盘盒提供可靠答案!

    存储示波器的存储深度对信号分析有什么影响?

    :≥1GS/s(每周期≥10点)。 存储深度:≥1Mpts(记录时间≥1μs)。 优化:启用分段存储(如100段×10μs)或升级至10Mpts。 2. 高速数据总线(如DDR4 32
    发表于 05-27 14:39

    云翎智能矿用本安防爆巡检记录仪,让隐患无所遁形的电子矿工

    云翎智能矿用本安防爆巡检记录仪是一款专为矿山环境设计的智能化巡检设备,它结合了现代电子技术与防爆安全标准,旨在为矿山安全生产提供强有力的技术支撑,让潜在的安全隐患无所遁形,堪称矿山作业中的“电子
    的头像 发表于 05-20 10:24 455次阅读
    云翎智能矿用本安<b class='flag-5'>型</b>防爆巡检<b class='flag-5'>记录</b>仪,让隐患无所遁形的电子矿工

    压力数据记录仪功能有哪些?点开看看就知道

    给操作人员,一旦压力出现异常波动,就能及时采取措施,避免安全事故的发生。 二、数据存储功能该记录仪具备强大的数据存储能力,能够长时间、大容量
    发表于 05-19 16:39

    湿度数据记录仪是什么?一文为你解答

    的性能和寿命。通过使用湿度数据记录仪,厂家可以精确掌握生产车间和储存环境的湿度状况,采取相应的措施来保证电子产品的质量。 湿度数据记录仪的工作原理并不复杂。它通常由湿度传感器、
    发表于 03-31 10:35

    KEPServerEX 数据存储插件

    好LogGroup之后,在Triggers里面记录条件中,设置 “登录静态间隔”--否; “在数据更改时记录”---是 这样数据就会在变化的时候才会
    的头像 发表于 02-28 14:47 515次阅读
    KEPServerEX <b class='flag-5'>数据</b><b class='flag-5'>存储</b>插件

    数据记录仪的计数原理和应用场景

    数据记录仪是一种用于测量、记录和分析各种数据的设备,其计数原理和应用场景可以归纳如下: 一、计数原理数据
    发表于 02-24 14:28