非易失性存储(NVM,Non-Volatile Memory)是即使在设备断电或重启后仍能保持数据的存储介质。在 Silicon Labs 的 Microcontroller 和 Radio SoC 上,NVM 由内部 Flash 实现。由于 Flash 的擦除次数有限,Silicon Labs 提供了三种不同的动态数据存储实现——NVM3、SimEEv1/v2 和 PS Store——分别适用于不同的协议和场景。理解这三种方案的技术原理和权衡取舍,是开发可靠嵌入式 IoT 应用的基础。Documentation Index
Fetch the complete documentation index at: https://mintlify.com/dsyx/docs.silabs.com_zh/llms.txt
Use this file to discover all available pages before exploring further.
非易失性存储的设计挑战
Flash 的核心特征是:可以以较小的块(通常 32 位字)写入,但只能以较大的块(通常数 KB 的页)擦除。这带来了以下挑战:虚拟页与 FIFO 循环缓冲区
为处理页填满时的数据迁移并防止断电丢失,各实现引入了虚拟页和FIFO 循环缓冲区机制:- SimEEv1:使用 2 个虚拟页(各由 2 个物理页组成,总计 8 kB),存储在两个虚拟页之间交替。
- SimEEv2:使用 3 个虚拟页(各由 6 个物理页组成,总计 36 kB),第三页始终保持擦除,通过分散复制降低最坏情况下的写入延迟。
- NVM3:在整个分配存储空间上实现循环缓冲区,无需切换虚拟页,仅复制待擦除页中无较新版本的对象,最大化 Flash 寿命和存储利用率。
NVM3 与 SimEEv1/v2 的核心区别在于:NVM3 在整个存储空间上实现为一个循环缓冲区,仅复制将被擦除的页中存储的唯一对象(其他页无较新版本的),避免了不必要的写入,进一步延长 Flash 寿命。
三种存储方案详解
SimEEv1 / SimEEv2
SimEEv1/v2 可与 EmberZNet PRO 和 Silicon Labs Connect(随 Flex SDK 安装)一起使用。 核心特性:- 对象定义时机:编译时使用大小和类型定义所有对象,无法在运行时创建或删除对象
- SimEEv1:2 个虚拟页,总大小 8 kB,最大基本存储 2 kB,最多 254 个对象
- SimEEv2:3 个虚拟页,总大小 36 kB,最大基本存储 8 kB,最多 254 个对象
- 支持计数器对象(Counter Object):只存储起始值和增量,减少每次递增时的写入量
- 支持索引对象(Indexed Object):允许数组中的多个索引共享同一个对象键,按索引参数独立读写
PS Store
PS Store 专用于 Bluetooth 设备(EFR32 Series 2 除外)。通过 PS key 管理 Bluetooth 设备 Flash 中的用户数据,数据在设备复位和重启期间保持持久性。 核心特性:- 总存储大小:2048 字节(使用 2 个 Flash 页)
- 支持运行时对象创建和删除
- 注意:Bluetooth Bonding 也存储在同一区域,每个 Bonding 约占 150 字节,用户数据可用空间随 Bonding 数量增加而减少
- 是 Silicon Labs 中代码体积最小的非易失性存储选项(编译后约 1.6 kB)
NVM3
NVM3(Third Generation Non-Volatile Memory)是 SimEEv1/v2 和 PS Store 的替代品,也是目前最推荐的存储方案。 核心优势:- 支持 EFM32 和 EFR32 系列全平台
- 兼容 EmberZNet、Connect、Z-Wave、OpenThread 和 Bluetooth 协议
- 动态多协议(DMP)应用可共享单一 NVM3 存储实例,避免多协议间的存储冲突
- 运行时创建和删除对象,最大对象大小可配置(208 ~ 4096 字节)
- 可配置的 Flash 存储大小(最少 3 个 Flash 页)
- 具有可配置缓存,支持快速对象访问
- 提供 Token API 和 PS Store API 的兼容层,方便从旧实现迁移
- 重新包装 API(Repack API):允许应用在 CPU 负载较低时段主动触发待清除页的擦除,避免在关键时序段阻塞
方案对比
NVM3
推荐用于新项目。支持全系平台和所有协议,动态对象管理,可配置大小,DMP 共享存储,Flash 寿命最优。代码体积约 9.1 kB。
SimEEv2
适用于 EFR32 Series 1 + EmberZNet/Connect 的既有项目。较大的 36 kB 存储空间,支持大量对象,写入延迟更均匀。代码体积约 5.4 kB。
SimEEv1
轻量级 EmberZNet/Connect 方案。8 kB 存储空间,代码体积最小(3.5 kB),适合资源极度受限的 EFR32 Series 1 设备。
PS Store
Bluetooth 专用(EFR32 Series 1)。最小代码体积(1.6 kB),简单的 2 页实现,适合存储需求极低的蓝牙设备。不支持计数器和索引对象。
完整特性对比表
| 特性 | NVM3 | SimEEv1 | SimEEv2 | PS Store |
|---|---|---|---|---|
| 兼容设备 | EFM32, EFR32 | EFR32 Series 1 | EFR32 Series 1 | EFR32 Series 1 |
| 兼容协议 | EmberZNet, Connect, Z-Wave, OpenThread, Bluetooth | EmberZNet, Connect | EmberZNet, Connect | Bluetooth |
| Flash 存储大小 | ≥ 3 个 Flash 页(可配置) | 8 kB | 36 kB | 4 kB |
| 最大基本存储 | 可变(见 AN1135) | 2 kB | 8 kB | 2 kB |
| 最大对象数 | 受基本存储限制 | 254 | 254 | 受基本存储限制 |
| 最大对象大小 | 208 ~ 4096 字节(可配置) | 254 字节 | 254 字节 | 56 字节 |
| 对象创建/删除 | 运行时 | 编译时 | 编译时 | 运行时 |
| 编译后代码大小 | 9.1 kB | 3.5 kB | 5.4 kB | 1.6 kB |
| 计数器对象 | ✅ | ✅ | ✅ | ❌ |
| 索引对象 | 部分支持¹ | ✅ | ✅ | ❌ |
| 每对象开销 | 4 字节(≤128 字节)/ 8 字节(>128 字节) | 2 字节 | 6 字节 | 10 字节 |
¹ NVM3 中索引对象通过为每个索引分配独立的 NVM3 对象实现,需使用唯一键逐个访问。
Flash 寿命与磨损均衡
所有 Silicon Labs 存储实现均采用磨损均衡以延长 Flash 寿命。影响 Flash 磨损的主要因素:影响 Flash 寿命的关键因素
影响 Flash 寿命的关键因素
- 分配的 Flash 空间大小:存储区域越大,单次页擦除前可写入的新版本越多,Flash 寿命越长。NVM3 支持配置 Flash 页数,其他实现使用固定大小。
- 每对象存储开销:开销越小,相同空间内可写入更多对象版本,Flash 寿命更长。SimEEv1 每对象仅 2 字节开销,PS Store 高达 10 字节。
- 最小对象大小对齐:若数据大小与最小对象大小不对齐,会添加填充字节。例如存储 16 位 Token 时,NVM3 和 PS Store 会额外填充 2 字节,而 SimEEv1/v2 可直接存储 16 位数据。
- 基本存储后的剩余空间:当切换到新虚拟页时,须先写入所有对象的最新版本(基本存储)。若基本存储占据大部分页空间,后续可写入的新版本数量有限,导致页擦除频繁。
选型建议
- 新项目(所有协议):优先选择 NVM3,特别是动态多协议(DMP)应用,可在各协议间共享单一存储实例。
- EmberZNet / Connect 既有项目(Series 1):可继续使用 SimEEv1/v2,Silicon Labs 提供 SimEEv1 到 SimEEv2 的升级插件。
- Bluetooth 专用轻量设备(Series 1):若存储需求极低,可选 PS Store,但需注意 Bonding 会占用部分存储空间。