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

    文章

    1271

    浏览量

    39905

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

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

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

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

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

    示波器如何设置存储时间呢?

    示波器的存储时间,通常指的是示波器捕获和存储波形数据的能力,这在分析复杂的信号或长时间记录信号变化时非常有用。
    的头像 发表于 05-30 15:43 915次阅读

    态势数据存储方式有哪些

    智慧华盛恒辉态势数据存储方式主要取决于数据的特性、规模以及访问需求。以下是几种常见的态势数据存储方式: 关系
    的头像 发表于 04-22 19:28 282次阅读

    态势数据如何存储

    智慧华盛恒辉态势数据存储主要依赖于数据库技术和文件存储系统。以下是一些关于如何存储态势数据的建
    的头像 发表于 04-22 17:29 319次阅读

    数据时代的存储革命:理解分布式存储系统

    在如今的大数据时代,全球数据量正在以指数增长。据国际数据公司(IDC)预测,到2025年,全球数据量将增至175 ZB。这种海量的
    的头像 发表于 03-07 15:40 394次阅读

    分布式存储与计算:大数据时代的解决方案

    我们正生活在一个数据驱动的时代,数据量以前所未有的速度呈指数增长。IDC预测到2025年全球数据量将达到175ZB(Zettabytes)。面对如此庞大的
    的头像 发表于 03-07 14:42 689次阅读

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

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

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

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

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

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

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

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

    labview怎么记录时间和数据

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

    常见的存储Idea数据库的地方

    Idea的数据库被存储在许多不同的地方,取决于应用程序和使用的技术。下面将详细描述一些常见的存储Idea数据库的地方。 关系
    的头像 发表于 12-06 14:15 914次阅读