FlashDB 是专门给单片机、物联网设备做的超轻量嵌入式数据库,直接跑在 Flash 上,不用依赖文件系统,非常适合资源紧张的 MCU 项目,也是很多嵌入式开发者替代 EasyFlash 的首选库。它用 C 语言开发,开源协议是 Apache2.0,自带 KV 键值库和 TSDB 时序库两种存储模式,RAM 占用几乎接近 0,内置磨损平衡、掉电保护,能直接在片内 Flash 或者 SPI Nor Flash 上存配置、传感器日志,不用上 FatFS 这类文件系统,节省很多 ROM 和内存资源。上手的时候第一步先把 FAL 闪存抽象层移植好,FlashDB 是依托 FAL 来管理 Flash 分区;第二步根据业务选库类型,存参数、配置就用 KVDB,存周期性传感器数据、运行日志就用 TSDB;第三步在头文件里配置 FDB_WRITE_GRAN 写粒度、扇区大小,这一步很容易踩坑,写粒度必须和 Flash 手册里最小写入单位保持一致;第四步调用初始化接口,读写、查询数据,最后做掉电场景的稳定性测试。整体上手门槛不算高,官方文档、示例工程都很齐全,在 STM32、RT-Thread 平台适配成熟,在小容量 MCU 里做断电数据存储,FlashDB 综合表现要比传统文件系统方案更省心、更耐用。
FlashDB 两种数据库模式
- KVDB 键值数据库:以 key-value 形式保存,适合产品参数、用户配置、小批量静态数据,支持字符串、二进制 blob,固件升级还支持 KV 增量升级,不用清空旧配置。
- TSDB 时序数据库:带时间戳,按时间顺序存数据,适合传感器采集、设备运行日志,插入和查询速度快,还可以单独修改单条记录状态。
FlashDB 核心优势清单
- 资源占用低,RAM 几乎零开销,小容量 MCU 也能跑
- 原生适配 Flash 特性,自带磨损平衡,延缓 Flash 擦写老化
- 内置掉电保护,意外断电重启不容易损坏数据库
- 支持多分区、多数据库实例,不同业务数据分开存放,查询更快
- 不强制依赖文件系统,也可以搭配文件系统后端使用
- 配套 shell 调试命令,开发阶段可以直接查看、清空数据库
- 跨平台,RT-Thread、裸机、其他 RTOS 都可以移植
FlashDB 适用和不适合场景
✅ 适合
- 单片机设备保存参数、校准值、网络配置
- 物联网传感器定时采集、日志存储
- 片内 Flash、小容量 SPI Flash,不想跑文件系统
- 大容量复杂关系型数据、大量高频随机修改数据
- 桌面、服务器平台,FlashDB 定位就是嵌入式 MCU 场景
❌ 不适合
FlashDB 移植关键步骤
- 移植 FAL 闪存抽象层,划分好 Flash 分区,标记给 FlashDB 使用
- 引入 FlashDB 源码,打开或者关闭 KVDB、TSDB 宏开关
- 配置 FDB_WRITE_GRAN 写入粒度、扇区大小,扇区大小要对齐 Flash 最小擦除单位
- 调用 fdb_kvdb_init 或者 fdb_tsdb_init 初始化数据库实例
- 业务层调用读写 API,调试阶段开启 shell 命令验证读写
- 反复断电、重启测试,验证掉电保护可靠性
FlashDB 常见踩坑点
- FDB_WRITE_GRAN 配置错误:SPI Nor Flash 一般是 1,STM32 片内 Flash 常见 8,带 ECC 的 Flash 要按手册设置,配错会出现偶发读写出错、CRC 报错
- 分区没有对齐擦除块:扇区尺寸必须是 Flash 最小擦除单位的整数倍
- 多任务并发读写:FlashDB 本身没有内置锁,多线程访问时需要自己加互斥锁保护
- 分区空间太小:时序数据持续写入,没有做旧数据清理,会写满分区
【相关 FAQ】
问题 1:FlashDB 和 EasyFlash 是什么关系,FlashDB 能不能直接替换 EasyFlash?
回答 1:FlashDB 是 EasyFlash 原作者基于 EasyFlash 全新开发升级的项目,FlashDB 新增了 TSDB 时序库、多实例等能力,FlashDB 可以用来替换 EasyFlash,不过接口和底层依赖 FAL 有改动,不能直接无缝替换,需要少量修改移植代码。
问题 2:使用 FlashDB 必须搭配 RT-Thread 系统吗,裸机单片机能不能跑 FlashDB?
回答 2:FlashDB 不是 RT-Thread 专属,裸机单片机、FreeRTOS 等其他 RTOS 都可以移植 FlashDB,RT-Thread 只是官方适配最好的平台,FlashDB 本身只依赖 FAL 闪存抽象层。
问题 3:FlashDB 自带加密功能吗,存敏感数据怎么处理?
回答 3:FlashDB 本身没有内置加密模块,如果要在 FlashDB 里保存密码、隐私这类敏感数据,需要在应用层把数据加密之后,再存入 FlashDB 的 KV 或者 TSDB 里面。
问题 4:FlashDB 是线程安全的吗,多任务同时读写 FlashDB 要注意什么?
回答 4:FlashDB 本身不自带线程锁,FlashDB 不是线程安全的,如果多个任务同时操作同一个 FlashDB 实例,应用层必须自己增加互斥锁,防止并发访问导致数据库损坏。
问题 5:FlashDB 可以直接用在 NAND Flash 上吗?
回答 5:FlashDB 原生主要针对 Nor Flash 设计,NAND Flash 有坏块管理需求,FlashDB 没有自带坏块管理,不建议直接在 NAND Flash 上跑 FlashDB。
【参考资料】
[2026-11-07](推荐一个好的嵌入式开源项目之二 ——FlashDB)电子工程专辑
[2026-10-27](FlashDB - Open Source Embedded Library)OSRTOS
[2026-09-23](armink/FlashDB 项目介绍)ross.abutalabs.com
[2026-07-16](FlashDB: Ultra-lightweight Embedded Key-Value and Time Series Database)TechLogHub
[2026-03-23](FlashDB GitHub 仓库介绍)GitHub
[2024-07-25](FlashDB 配置 FDB_WRITE_GRAN 问题讨论)哇酷开发者社区
【免责声明】
本文内容仅为 FlashDB 开源项目技术科普,不构成商用落地保证;FlashDB 遵循 Apache2.0 开源协议,项目稳定性、适配性请自行结合硬件、固件版本测试验证;文中提到的踩坑方案、移植步骤仅作参考,因直接使用本文内容造成的设备故障、数据丢失等问题,本文作者不承担相关责任。
