FlashDB嵌入式資料庫
- 什么是FlashDB
- 移植
- 總結
什么是FlashDB
先截一段官網的資訊大家看一下哈
FlashDB 是一款超輕量級的嵌入式資料庫,專注于提供嵌入式產品的資料存盤方案,與傳統的基于檔案系統的資料庫不同,FlashDB 結合了 Flash 的特性,具有較強的性能及可靠性,并在保證極低的資源占用前提下,盡可能延長 Flash 使用壽命,
FlashDB 提供兩種資料庫模式:
鍵值資料庫 :是一種非關系資料庫,它將資料存盤為鍵值(Key-Value)對集合,其中鍵作為唯一識別符號,KVDB 操作簡潔,可擴展性強,
時序資料庫 :時間序列資料庫 (Time Series Database , 簡稱 TSDB),它將資料按照 時間順序存盤 ,TSDB 資料具有時間戳,資料存盤量大,插入及查詢性能高,
使用場景
如今,物聯網產品種類越來越多,運行時產生的資料種類及總量及也在不斷變大,FlashDB 提供了多樣化的資料存盤方案,不僅資源占用小,并且存盤容量大,非常適合用于物聯網產品,下面是主要應用場景:
鍵值資料庫 :
產品引數存盤
用戶配置資訊存盤
小檔案管理
時序資料庫 :
存盤動態產生的結構化資料:如 溫濕度傳感器采集的環境監測資訊,智能手環實時記錄的人體健康資訊等
記錄運行日志:存盤產品歷史的運行日志,例外告警的記錄等
主要特性
資源占用極低,記憶體占用幾乎為 0 ;
支持 多磁區,多實體 ,資料量大時,可細化磁區,降低檢索時間;
支持 磨損平衡 ,延長 Flash 壽命;
支持 掉電保護 功能,可靠性高;
支持 字串及 blob 兩種 KV 型別,方便用戶操作;
支持 KV 增量升級 ,產品韌體升級后, KVDB 內容也支持自動升級;
支持 修改每條 TSDB 記錄的狀態,方便用戶進行管理;
看到這里是不是已經有一個大概了解了,本人也查過一些其他的嵌入式使用的資料庫,但是基本上都是Linux上使用的,對資源還是有一定要求的,在單片機這個級別上使用還是不現實的,
上下源作者的開源鏈接: https://gitee.com/Armink/FlashDB.
膜拜一下armink大神,
個人理解:其實資料庫基本就是 增、刪、改、查,增是最簡單的,改刪查就需要花點心思了,
看了下資料庫,API介面還是很豐富的,比如遍歷整個資料庫和按時間戳檢索資料庫;以及修改資料庫,洗掉資料庫,還增加了扇區的平衡和磨平,基本上功能都包括了,個人以前做專案的時候也想過存取,最后還是沒有很好的解決快速檢索的功能,后期打算看下底層,專門寫一下這一塊的處理邏輯,
移植
- FlashDB的移植是建立的Fal,flash抽象層的基礎上使用的,官方給的demo也是如此,如果fal還沒移植好,看上一篇文章
- 一樣的先下原始碼

打開demos目錄下有多個工程 - 個人用的是spi-flash,所以選擇stm32f405rg_spi_flash這個工程
- 把原始碼加入工程之后

完成后就這個樣子
- 然后修改一下組態檔fdb_cfg.h檔案
#ifndef _FAL_CFG_H_
#define _FAL_CFG_H_
#define FAL_DEBUG 1 //啟動列印
#define FAL_PART_HAS_TABLE_CFG //啟動設備表
#define FAL_USING_SFUD_PORT //使用sfud通用串行flash
/* ===================== Flash device Configuration ========================= */
extern struct fal_flash_dev nor_flash0;
/* flash device table */
#define FAL_FLASH_DEV_TABLE \
{ \
&nor_flash0, \
}
/* ====================== Partition Configuration ========================== */
#ifdef FAL_PART_HAS_TABLE_CFG
/* partition table */
#define FAL_PART_TABLE \
{ \
{FAL_PART_MAGIC_WORD, "fdb_tsdb1", "norflash0", 0, 1024*1024, 0}, \
{FAL_PART_MAGIC_WORD, "fdb_kvdb1", "norflash0", 1024*1024, 1024*1024, 0}, \
}
#endif /* FAL_PART_HAS_TABLE_CFG */
#endif /* _FAL_CFG_H_ */
運行一下看下日志

中間太長了,省略把

可以發現第一次運行會初始化一次flash,應該是在扇區頭寫入了一些標記
還可以發現最后寫入了二條資料到資料庫中
接著在復位一次

這一次的日志簡單很多,沒有了初始化的程序,第一次真的好慢,差點都以為進死回圈了
[FlashDB][sample][kvdb][basic] ==================== kvdb_basic_sample ====================
[FlashDB][sample][kvdb][basic] get the 'boot_count' value is 1
[FlashDB][sample][kvdb][basic] set the 'boot_count' value to 2
這里記錄了啟動次數,一共啟動了二次
[FlashDB][sample][tsdb] ==================== tsdb_sample ====================
[FlashDB][sample][tsdb] append the new status.temp (36) and status.humi (85)
[FlashDB][sample][tsdb] append the new status.temp (38) and status.humi (90)
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 1, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 2, temp: 38, humi: 90
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 3, temp: 36, humi: 85
[FlashDB][sample][tsdb] [query_by_time_cb] queried a TSL: time: 4, temp: 38, humi: 90
[FlashDB][sample][tsdb] query count is: 2
[FlashDB][sample][tsdb] set the TSL (time 1) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 2) status from 3 to 3
[FlashDB][sample][tsdb] set the TSL (time 3) status from 2 to 3
[FlashDB][sample][tsdb] set the TSL (time 4) status from 2 to 3
[FlashDB][sample][tsdb] ===========================================================
一共寫入了4條資料,分二次寫入的,且遍歷之后列印出來,
總結
移植算是結束了,也跟著日志理了一遍,API函式還是比較齊全的,使用也還算方便,看了作者介紹這個庫也有幾年歷史了,更新了5個大版本了,打算看下底層,深入理解一下再和大家分享,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/300310.html
標籤:其他
