0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SFDB - 專為記錄型數(shù)據(jù)存儲(chǔ)而生

RTThread物聯(lián)網(wǎng)操作系統(tǒng) ? 來(lái)源:未知 ? 2023-10-24 10:20 ? 次閱讀

Simple and Fast


SFDB 即 Simple File Database, 一個(gè) 簡(jiǎn)單 的文件型數(shù)據(jù)庫(kù),使用 簡(jiǎn)單,移植 簡(jiǎn)單,功能 簡(jiǎn)單,原理 簡(jiǎn)單,一切都很 簡(jiǎn)單,一切都很 快。適用于 固定長(zhǎng)度 的 記錄型 數(shù)據(jù)存儲(chǔ),類似于時(shí)序數(shù)據(jù)庫(kù),可用于存儲(chǔ)歷史記錄、報(bào)警記錄、日志等。

如果你的項(xiàng)目需要記錄數(shù)據(jù),且數(shù)據(jù)的長(zhǎng)度或最大長(zhǎng)度是固定的,已存入的數(shù)據(jù)不需要修改,同時(shí)需要快速清空和基于 記錄條數(shù) (從第幾條開始,查多少條數(shù)據(jù))的查詢,而你的項(xiàng)目恰好有個(gè)文件系統(tǒng),那么 SFDB 可能適合你。

特性

  • 使用文件進(jìn)行存儲(chǔ)

  • 簡(jiǎn)單的數(shù)據(jù)寫入接口

  • 到達(dá)上限時(shí)自動(dòng)從頭覆蓋

  • 支持順序與倒序查詢

  • 支持從任意條數(shù)開始查詢

  • 支持清空(重置)數(shù)據(jù)庫(kù)

使用篇


本篇基于 HMI-Board 來(lái)演示 SFDB 的使用。

創(chuàng)建工程

1. 使用 RT-Thread Studio 基于 HMI-Board 開發(fā)板創(chuàng)建一個(gè)項(xiàng)目。選項(xiàng)都保持默認(rèn)即可。

wKgZomU3KwmAZAfuAACVAYoYwK8947.png

2. 創(chuàng)建完成后打開 RT-Thread Settings,選中 Enable SDCARD filesystem 打開文件系統(tǒng)。

wKgZomU3KwmADF1pAACd82sc6i8822.jpg

3. 在組件配置中打開 RTC 設(shè)備驅(qū)動(dòng),并使能 使用軟件模擬RTC設(shè)備選項(xiàng)(提供給文件系統(tǒng)使用)。

wKgZomU3KwmAfWDxAACMpodZc7Q681.jpg

4.添加 SFDB 軟件包。

wKgZomU3KwmARL9cAAB9lGBaaGI941.png

5. 勾選 SFDB 配置項(xiàng)的 Use sfdb example 打開示例代碼。

wKgZomU3KwmAHahfAAB6GTVJ8SE079.jpg

6. 全部配置完進(jìn)行保存,當(dāng)前軟件包會(huì)就被應(yīng)用到項(xiàng)目中。

編譯及下載

在編譯之前,我們需要修改一下例程的配置,來(lái)適配我們的文件系統(tǒng)目錄。打開 packages/sfdb-v0.0.2/examples/rtthread/example.c,找到宏定義 TEST_FILE_PATH,將其修改為 /test.sdb。

wKgZomU3KwqAVrmHAAAmASskF9c103.png

此處需要注意,sfdb 在不存在當(dāng)前文件時(shí)會(huì)自動(dòng)創(chuàng)建,但如果路徑中包含有多層目錄,則這些文件夾必須存在,即 sfdb 不會(huì)自動(dòng)創(chuàng)建文件夾。

wKgZomU3KwuADstCAABXvXZdzgQ836.jpg

修改完路徑配置后即可編譯代碼。

控制臺(tái)看到上圖的信息即編譯成功,此時(shí)進(jìn)行程序燒錄。

運(yùn)行示例

程序下載完成后連接并打開終端,按下 TAB 鍵可以看到命令行中出現(xiàn)了兩條 SFDB 的命令:

wKgZomU3KwuAcnN2AADSal2L3a0492.jpg

此時(shí)說明 SFDB 已經(jīng)成功運(yùn)行起來(lái)了。而這兩條命令作用如下:

  • sfdb_test:?jiǎn)?dòng) SFDB 寫入測(cè)試,系統(tǒng)會(huì)持續(xù)寫入到設(shè)定的上限值

  • sfdb_read:讀取測(cè)試數(shù)據(jù)庫(kù)內(nèi)的數(shù)據(jù)。

寫入測(cè)試

例程中設(shè)定的數(shù)據(jù)庫(kù)存儲(chǔ)上限為10000條,同時(shí)會(huì)寫入10100條數(shù)據(jù)。接下來(lái)我們使用 sfdb_test 來(lái)啟動(dòng)寫入測(cè)試:

wKgZomU3Kw2AR_gVAAAQWeBqqdo558.png

可以看到日志中完整寫入了10100條數(shù)據(jù),而且每條數(shù)據(jù)的寫入時(shí)間也都維持在 5-10 ms,并沒有隨著寫入數(shù)量的增多而增大。

讀取測(cè)試

sfdb_read命令的形式有兩種:

  • sfdb_read 讀取數(shù)據(jù)庫(kù)基本信息

  • sfdb_read [offset] [number] [order(0:asc 1:dsc)] 根據(jù)orderoffset中讀取number條數(shù)據(jù)

1. 基本信息讀取

基本信息不需要輸入參數(shù),直接 sfdb_read 即可:

wKgZomU3Kw2AJ1w4AAANfo1fACo654.png

可以看到,數(shù)據(jù)庫(kù)的基本信息包括:

  1. 當(dāng)前最新數(shù)據(jù)的索引(容量10000,寫入10100,多出來(lái)的將會(huì)從最老的數(shù)據(jù)開始覆蓋)

  2. 數(shù)據(jù)庫(kù)中的總有效數(shù)據(jù)

  3. 每條數(shù)據(jù)的長(zhǎng)度

這些數(shù)據(jù)與我們的配置和寫入也是完全一致的,說明我們剛才數(shù)據(jù)庫(kù)的創(chuàng)建及寫入操作是成功的。

2. 數(shù)據(jù)讀取

讀取的 order 為讀取順序,其中0為從最老的數(shù)據(jù)開始讀,1為從最新的數(shù)據(jù)開始讀:

- 1. 正序讀?。◤呐f到新)

wKgZomU3Kw2ASbZqAAAhYDSLqDM695.png

- 2.倒序讀?。◤男碌脚f)

wKgZomU3Kw2AFsUtAAAhrRabQ7Y473.png

- 3. 注意

在倒序讀取模式下,由于保留了讀取性能, buf 的數(shù)據(jù)仍然是順序的,使用者需要手動(dòng)處理 buf 中的數(shù)據(jù)順序。當(dāng)數(shù)據(jù) 1-100 依次存入時(shí),若以倒序從 offset 為 0 的位置讀取 10 條數(shù)據(jù),存入 buf 中,buf 中的數(shù)據(jù)順序?yàn)?91 92 93 94 95 96 97 98 99 100 ,而非 100 99 98 97 96 95 94 93 92 91。使用者可以在應(yīng)用層可以參考例程通過索引倒轉(zhuǎn)的形式實(shí)現(xiàn)數(shù)據(jù)順序的倒轉(zhuǎn),如下:


		

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}

移植篇


如果需要在別的平臺(tái)使用SFDB,移植起來(lái)也是非常方便。僅需參考 sfdb_port.c 實(shí)現(xiàn) sfdb_fs_t 里面的文件操作接口,以及在 sfdb_port.h 中包含當(dāng)前平臺(tái)所需要的頭文件并實(shí)現(xiàn) SF_MEMCPYSF_MEMSET、SF_LOG 宏定義即可。

接口結(jié)構(gòu)如下:


		

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__)

源碼倉(cāng)庫(kù)


詳細(xì)的API說明可以到源碼的倉(cāng)庫(kù)查看:

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

Gitee:https://gitee.com/wangjunjie997

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

wKgZomU3Kw-AYtuHAHiX-BnG6Ho047.gif點(diǎn)擊閱讀原文進(jìn)入官網(wǎng)


原文標(biāo)題:SFDB - 專為記錄型數(shù)據(jù)存儲(chǔ)而生

文章出處:【微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1289

    瀏覽量

    40135

原文標(biāo)題:SFDB - 專為記錄型數(shù)據(jù)存儲(chǔ)而生

文章出處:【微信號(hào):RTThread,微信公眾號(hào):RTThread物聯(lián)網(wǎng)操作系統(tǒng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    工業(yè)SD卡:專為嚴(yán)苛環(huán)境設(shè)計(jì)的高端存儲(chǔ)設(shè)備

    工業(yè)SD卡,作為專為工業(yè)環(huán)境設(shè)計(jì)的存儲(chǔ)設(shè)備,在多個(gè)領(lǐng)域都發(fā)揮著至關(guān)重要的作用。其出色的性能、穩(wěn)定性和耐用性,使其成為工業(yè)自動(dòng)化、智能電網(wǎng)、安防監(jiān)控以及醫(yī)療設(shè)備等領(lǐng)域的首選存儲(chǔ)解決方案。
    的頭像 發(fā)表于 11-17 17:05 ?218次閱讀
    工業(yè)SD卡:<b class='flag-5'>專為</b>嚴(yán)苛環(huán)境設(shè)計(jì)的高端<b class='flag-5'>存儲(chǔ)</b>設(shè)備

    一文詳解計(jì)算存儲(chǔ)協(xié)議框架

    側(cè),稱為計(jì)算存儲(chǔ)(Computational Storage),通過存儲(chǔ)側(cè)卸載數(shù)據(jù)預(yù)處理,如數(shù)據(jù)校驗(yàn)、解壓、
    的頭像 發(fā)表于 10-31 14:20 ?385次閱讀
    一文詳解計(jì)算<b class='flag-5'>型</b><b class='flag-5'>存儲(chǔ)</b>協(xié)議框架

    智能記錄隱蔽工程管理系統(tǒng)

    ? ? ? 隱蔽工程管理是現(xiàn)代建筑工程中一個(gè)至關(guān)重要的環(huán)節(jié)。為了提高工程質(zhì)量和管理效率,智能記錄隱蔽工程管理系統(tǒng)應(yīng)運(yùn)而生。本文將從隱蔽工程APP、工程臺(tái)賬、管理系統(tǒng)和云端存儲(chǔ)四個(gè)方面介紹該系統(tǒng)的功能
    的頭像 發(fā)表于 10-18 10:18 ?151次閱讀
    智能<b class='flag-5'>記錄</b>隱蔽工程管理系統(tǒng)

    佰維存儲(chǔ)發(fā)布工業(yè)級(jí)寬溫TGC系列存儲(chǔ)卡,賦能高清視頻穩(wěn)定錄制

    監(jiān)控及長(zhǎng)時(shí)間影像穩(wěn)定錄制而生。這兩款存儲(chǔ)卡不僅代表了存儲(chǔ)技術(shù)的最新突破,更是對(duì)安防監(jiān)控、軌道交通、智慧醫(yī)療、車載記錄儀以及工業(yè)自動(dòng)化等多個(gè)關(guān)鍵領(lǐng)域需求的精準(zhǔn)響應(yīng)。
    的頭像 發(fā)表于 08-21 10:45 ?546次閱讀

    虹科技術(shù) 優(yōu)化始于數(shù)據(jù):Baby-LIN設(shè)備如何高效存儲(chǔ)總線數(shù)據(jù)

    質(zhì)量和性能至關(guān)重要。本文將講解虹科BabyLIN系列產(chǎn)品如何實(shí)現(xiàn)高效的總線數(shù)據(jù)記錄存儲(chǔ)。 虹科Baby-LIN系列產(chǎn)品作為專業(yè)LIN總線產(chǎn)品,以其高性能和可靠性受到市場(chǎng)的青睞,其支持多種LIN網(wǎng)絡(luò)配置,能夠
    的頭像 發(fā)表于 08-16 10:07 ?422次閱讀
    虹科技術(shù) 優(yōu)化始于<b class='flag-5'>數(shù)據(jù)</b>:Baby-LIN設(shè)備如何高效<b class='flag-5'>存儲(chǔ)</b>總線<b class='flag-5'>數(shù)據(jù)</b>?

    態(tài)勢(shì)數(shù)據(jù)如何存儲(chǔ)

    智慧華盛恒輝態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)方式主要取決于數(shù)據(jù)的特性、規(guī)模以及訪問需求。以下是幾種常見的態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)方式,并進(jìn)行了分點(diǎn)表示和歸納: 關(guān)系
    的頭像 發(fā)表于 06-24 17:46 ?346次閱讀

    示波器如何設(shè)置存儲(chǔ)時(shí)間呢?

    示波器的存儲(chǔ)時(shí)間,通常指的是示波器捕獲和存儲(chǔ)波形數(shù)據(jù)的能力,這在分析復(fù)雜的信號(hào)或長(zhǎng)時(shí)間記錄信號(hào)變化時(shí)非常有用。
    的頭像 發(fā)表于 05-30 15:43 ?1056次閱讀

    飛行汽車專用的CAN(FD)數(shù)據(jù)記錄終端

    飛行汽車的飛行安全永遠(yuǎn)是第一要素,搭載致遠(yuǎn)電子專用的多通道CAN(FD)數(shù)據(jù)記錄終端CANFDDTU-300ER,時(shí)刻記錄存儲(chǔ)并且分析各類飛行數(shù)據(jù)
    的頭像 發(fā)表于 05-01 08:24 ?448次閱讀
    飛行汽車專用的CAN(FD)<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄</b>終端

    態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)方式有哪些

    智慧華盛恒輝態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)方式主要取決于數(shù)據(jù)的特性、規(guī)模以及訪問需求。以下是幾種常見的態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)方式: 關(guān)系
    的頭像 發(fā)表于 04-22 19:28 ?335次閱讀

    態(tài)勢(shì)數(shù)據(jù)如何存儲(chǔ)

    智慧華盛恒輝態(tài)勢(shì)數(shù)據(jù)存儲(chǔ)主要依賴于數(shù)據(jù)庫(kù)技術(shù)和文件存儲(chǔ)系統(tǒng)。以下是一些關(guān)于如何存儲(chǔ)態(tài)勢(shì)數(shù)據(jù)的建
    的頭像 發(fā)表于 04-22 17:29 ?365次閱讀

    數(shù)據(jù)時(shí)代的存儲(chǔ)革命:理解分布式存儲(chǔ)系統(tǒng)

    在如今的大數(shù)據(jù)時(shí)代,全球數(shù)據(jù)量正在以指數(shù)增長(zhǎng)。據(jù)國(guó)際數(shù)據(jù)公司(IDC)預(yù)測(cè),到2025年,全球數(shù)據(jù)量將增至175 ZB。這種海量的
    的頭像 發(fā)表于 03-07 15:40 ?430次閱讀

    分布式存儲(chǔ)與計(jì)算:大數(shù)據(jù)時(shí)代的解決方案

    我們正生活在一個(gè)數(shù)據(jù)驅(qū)動(dòng)的時(shí)代,數(shù)據(jù)量以前所未有的速度呈指數(shù)增長(zhǎng)。IDC預(yù)測(cè)到2025年全球數(shù)據(jù)量將達(dá)到175ZB(Zettabytes)。面對(duì)如此龐大的
    的頭像 發(fā)表于 03-07 14:42 ?775次閱讀

    如何選擇CAN總線數(shù)據(jù)記錄儀 Kvaser Memorator Pro 5xHS

    什么是CAN總線數(shù)據(jù)記錄儀? CAN總線數(shù)據(jù)記錄儀是一種用于記錄CAN總線數(shù)據(jù)的設(shè)備。它通過CA
    的頭像 發(fā)表于 03-04 16:35 ?566次閱讀
    如何選擇CAN總線<b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>記錄</b>儀  Kvaser Memorator Pro 5xHS

    請(qǐng)問CAN數(shù)據(jù)記錄方式有哪些?

    使用CAN數(shù)據(jù)存儲(chǔ)設(shè)備進(jìn)行記錄:這種方式通過專門的CAN記錄儀來(lái)實(shí)現(xiàn),它是一種專門用于存儲(chǔ)CAN總線數(shù)據(jù)
    的頭像 發(fā)表于 03-01 09:14 ?581次閱讀

    什么是數(shù)據(jù)記錄器,數(shù)據(jù)記錄器與數(shù)據(jù)采集系統(tǒng)

    雖然有些數(shù)據(jù)記錄器只有一個(gè)傳感器和輸入,但許多數(shù)據(jù)記錄器有多個(gè)通道,在許多情況下,它們可以記錄來(lái)自不同類型傳感器的測(cè)量值。
    的頭像 發(fā)表于 02-08 12:28 ?1572次閱讀