FlashDB 占用约 7KB Flash 时,固定配置可考虑 A/B 双页存储
FlashDB 是面向嵌入式设备的数据库组件。KVDB 用键值对保存配置,适合 key 会增加、更新较频繁、需要遍历或删除数据的场景;它同时提供 GC、磨损均衡和掉电恢复等能力。
A/B 双页存储使用两个独立 Flash 擦除页保存同一份固定结构体。写入中断或主副本校验失败时,程序可以读取另一页,适合数据少、结构稳定、更新频率低的设备配置。
FlashDB 的 7KB 代码占用
以下数据来自 Cortex-M0+ 在 -Os -flto 下的编译结果,仅开启 KVDB 与 FAL。这个数字用于说明当前工程的资源量级,不代表所有芯片和工具链都会得到相同结果。
| 模块 | 主要代价来源 | 约 Flash 占用 |
|---|---|---|
| fdb_kvdb.c | 扇区管理、追加写、GC 回收、迭代器 | ~3KB |
| fdb_utils.c | CRC32、状态字操作 | ~1.5KB |
| fdb.c | 数据库公共接口 | ~0.5KB |
| FAL 层 | 分区表、设备管理、Flash 操作封装 | ~2KB |
| 合计 | ~7KB |
这 7KB 购买的是完整 KV 存储能力。项目仅保存几十字节固定配置时,其中很多能力用不上;配置持续增长或需要频繁维护时,这些能力可以降低应用层复杂度。
A/B 双页与 FlashDB 的选型差异
| 选型维度 | A/B 双页存储 | FlashDB KVDB |
|---|---|---|
| 数据模型 | 固定结构体或固定二进制块 | key-value,条目可独立增删 |
| 写入方式 | 整块擦除、整块更新 | 追加写入,由 GC 回收空间 |
| 掉电恢复 | 两份副本校验与回退 | 数据库状态管理与恢复机制 |
| 磨损管理 | 应用自行控制写入频率 | 提供 GC 和磨损均衡能力 |
| 版本迁移 | 应用处理结构体版本 | 可按 key 补充或更新默认值 |
| 外部管理 | 需要自定义字段映射 | key 适合查询、修改和导出 |
| 资源代价 | 两个擦除页和少量代码 | 当前最小配置约 7KB 代码 |
数据字节数只能作为一个判断维度。固定结构体即使接近 1KB,也可能适合 A/B;几十字节配置如果每个字段都要独立管理、频繁更新,FlashDB 仍有价值。
选型边界
选择 A/B 双页存储,需要同时满足这些条件:
- 数据结构固定,保存时可以整体更新。
- 写入频率低,两个页的擦写寿命可以接受。
- Flash 代码空间紧张,愿意在应用层维护版本迁移。
- 不需要 KV 遍历、按 key 删除、TSDB 或通用管理接口。
选择 FlashDB,通常是因为配置已经形成动态 KV 集合,写入和升级需求持续增加。此时 7KB 左右的代码代价换来了统一的数据管理、空间回收和恢复机制,项目不必继续扩展自写存储层。
实际选择可以压缩成一句话:固定、低频、整块更新优先 A/B;动态、频繁、按 key 管理优先 FlashDB。
A/B 双页实现、Air001 接入方式和掉电边界见 用 A/B 双页冗余保存 MCU 固定配置。
本文由 AI 辅助生成,可能存在错误或遗漏,请以实际资料和官方文档为准。