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
    +关注

    关注

    31

    文章

    1149

    浏览量

    38892

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

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

收藏 人收藏

    评论

    相关推荐

    如何选择CAN总线数据记录仪 Kvaser Memorator Pro 5xHS

    什么是CAN总线数据记录仪? CAN总线数据记录仪是一种用于记录CAN总线数据的设备。它通过CA
    的头像 发表于 03-04 16:35 203次阅读
    如何选择CAN总线<b class='flag-5'>数据</b><b class='flag-5'>记录</b>仪  Kvaser Memorator Pro 5xHS

    请问CAN数据记录方式有哪些?

    使用CAN数据存储设备进行记录:这种方式通过专门的CAN记录仪来实现,它是一种专门用于存储CAN总线数据
    的头像 发表于 03-01 09:14 243次阅读

    什么是数据记录器,数据记录器与数据采集系统

    虽然有些数据记录器只有一个传感器和输入,但许多数据记录器有多个通道,在许多情况下,它们可以记录来自不同类型传感器的测量值。
    的头像 发表于 02-08 12:28 912次阅读

    车辆数据记录仪 | GL系列产品

    、休眠与唤醒、多种协议、无人值守和高鲁棒性等等。同时,完整的工具链、远程数据传输、云端存储数据分析,也逐渐成为常见的功能要求。GL数据记录
    的头像 发表于 12-28 08:25 304次阅读
    车辆<b class='flag-5'>数据</b><b class='flag-5'>记录</b>仪 | GL系列产品

    labview怎么记录时间和数据

    LabVIEW可以用于记录时间和数据,以下是一个详细的教程,介绍如何使用LabVIEW进行时间和数据记录。 时间和数据
    的头像 发表于 12-27 17:00 1137次阅读

    DS-S003M-专为蚊车而生的高精度微型伺服器

    德晟智能科技公司近期推出了一款专为蚊车设计的五克铜齿微型舵机,这款舵机旨在为蚊车提供更稳定高效的解决方案。小巧的体型为蚊车提供了更大的改造空间;金属齿设计,提供强大的负载能力和高传动效率。
    的头像 发表于 12-04 10:03 189次阅读
    DS-S003M-<b class='flag-5'>专为</b>蚊车<b class='flag-5'>而生</b>的高精度微型伺服器

    DIALOG 数据记录仪配置工具及数据分析软件

    强大的 Rebel 数据记录仪配置工具。支持 Rebel 系列所有记录仪所需的配置功能。同时可获取记录数据,并对
    的头像 发表于 11-22 11:48 327次阅读
    DIALOG <b class='flag-5'>数据</b><b class='flag-5'>记录</b>仪配置工具及<b class='flag-5'>数据</b>分析软件

    SFDB WEB UI -【SFDB开发利器】

    SFDB WEB UI 将会帮你解析SFDB数据库文件,并且按照你所指定的数据格式将数据以表的形式呈现出来,支持常用的
    的头像 发表于 10-09 16:55 325次阅读
    <b class='flag-5'>SFDB</b> WEB UI -【<b class='flag-5'>SFDB</b>开发利器】

    温室气体数据记录软件使用指南

    温室气体数据记录软件用于记录温室气体分析仪、冷阱系统、阀箱以及采样单元数据的获取及记录
    的头像 发表于 09-01 18:22 468次阅读
    温室气体<b class='flag-5'>数据</b><b class='flag-5'>记录</b>软件使用指南

    将声音从音频编码器记录到MP3格式存储到缩微SD卡中

    编码为 MP3 格式, 并同时存储在缩微SD 卡中 。 否则, 如果 REC_ IN_ RT 尚未定义, 则记录声音数据将先存储在超音盘中, 直到
    发表于 08-29 07:54

    英飞凌扩展数据记录存储器产品组合,推出业内首款1Mbit车规级串行EXCELON™ F-RAM存储器及新型4Mbit F-RAM存储

    【 2023 年 8 月 8 日 , 德国慕尼黑讯】 汽车事件数据记录系统(EDR)市场的不断发展正在推动专用数据记录存储设备的需求,这些设
    发表于 08-09 14:32 417次阅读
      英飞凌扩展<b class='flag-5'>数据</b><b class='flag-5'>记录</b><b class='flag-5'>存储</b>器产品组合,推出业内首款1Mbit车规级串行EXCELON™ F-RAM<b class='flag-5'>存储</b>器及新型4Mbit F-RAM<b class='flag-5'>存储</b>器

    使用RDREC读取诊断数据记录的编程示例

    在以下示例中,可通过 RDREC 读取 IO 设备的诊断数据记录“16#E00A”。触发断路时,系统将错误信息输出为一条诊断数据记录
    的头像 发表于 07-24 15:59 1890次阅读
    使用RDREC读取诊断<b class='flag-5'>数据</b><b class='flag-5'>记录</b>的编程示例

    can记录仪采用TF卡存储数据的好处有哪些?

    大容量存储:TF卡通常具有较大的存储容量,可以存储大量的数据。这对于需要长时间记录存储
    的头像 发表于 07-10 10:41 367次阅读

    虹科多功能蓝牙便携式数据记录仪——通过实时连接实现终极数据记录体验

    电流、电压、电阻和一系列参数,包括温度、湿度、压力、流量、风速和浓度。数字通道可以自动触发或停止记录,该款记录仪旨在提供快速准确的数据,并进行安全存储,以便在您需要时可以轻松检索,获得
    的头像 发表于 06-28 16:02 393次阅读
    虹科多功能蓝牙便携式<b class='flag-5'>数据</b><b class='flag-5'>记录</b>仪——通过实时连接实现终极<b class='flag-5'>数据</b><b class='flag-5'>记录</b>体验

    自计式雨量记录仪是什么?

    低功耗雨量记录仪是一款能够自动观测并存储“雨量”参数的仪器,由雨量传感器、数据采集记录仪、内置电池等组成,具有功耗低、灵敏度高、安装便利、操作简单、使用方便等特点,可长期在在野外观测并
    的头像 发表于 06-25 09:41 232次阅读