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;i3if(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->fd0){ 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(ret0)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

    文章

    1435

    浏览量

    42312

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

    功率分析仪的“存储”与“数据保存”模式如何保存测量数据呢?

    数据保存”模式和“存储”模式将通过差异化功能设定满足用户多样化的数据存储需求:当您仅需保存一组数据时可选择“
    的头像 发表于 07-23 17:51 ?463次阅读
    功率分析仪的“<b class='flag-5'>存储</b>”与“<b class='flag-5'>数据</b>保存”模式如何保存测量<b class='flag-5'>数据</b>呢?

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

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

    车载 CAN-Bus 数据记录

    “黑盒子 ”,会记录所有的CAN 数据,以便于事后进行故障分析。 SG-CAN-200R 是一款便携的 2 通道 CAN 总线记录仪,可脱离 PC 单独工作,内置存储卡, 可以长时间
    的头像 发表于 07-15 14:13 ?182次阅读
    车载 CAN-Bus <b class='flag-5'>数据</b><b class='flag-5'>记录</b>仪

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

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

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

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

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

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

    工业SD卡:专为严苛环境设计的高端存储设备

    工业SD卡,作为专为工业环境设计的存储设备,在多个领域都发挥着至关重要的作用。其出色的性能、稳定性和耐用性,使其成为工业自动化、智能电网、安防监控以及医疗设备等领域的首选存储解决方案。
    的头像 发表于 11-17 17:05 ?750次阅读
    工业SD卡:<b class='flag-5'>专为</b>严苛环境设计的高端<b class='flag-5'>存储</b>设备

    一文详解计算存储协议框架

    侧,称为计算存储(Computational Storage),通过存储侧卸载数据预处理,如数据校验、解压、
    的头像 发表于 10-31 14:20 ?1211次阅读
    一文详解计算<b class='flag-5'>型</b><b class='flag-5'>存储</b>协议框架

    智能记录隐蔽工程管理系统

    ? ? ? 隐蔽工程管理是现代建筑工程中一个至关重要的环节。为了提高工程质量和管理效率,智能记录隐蔽工程管理系统应运而生。本文将从隐蔽工程APP、工程台账、管理系统和云端存储四个方面介绍该系统的功能
    的头像 发表于 10-18 10:18 ?577次阅读
    智能<b class='flag-5'>记录</b>隐蔽工程管理系统

    佰维存储发布工业级宽温TGC系列存储卡,赋能高清视频稳定录制

    监控及长时间影像稳定录制而生。这两款存储卡不仅代表了存储技术的最新突破,更是对安防监控、轨道交通、智慧医疗、车载记录仪以及工业自动化等多个关键领域需求的精准响应。
    的头像 发表于 08-21 10:45 ?1231次阅读