Nordic 这篇博文讲解 Zephyr 的闪存分区和持久化存储方案,NCS v3.4.0 LTS 版本开始主推 Devicetree(DTS)方式定义分区,旧版 Partition Manager 工具逐步淘汰,开发者要先划分好 Boot、固件主槽、升级副槽、数据存储分区,再根据产品需求选择 NVS、ZMS、LittleFS 等存储后端,才能稳定支持 MCUboot OTA 升级、蓝牙参数、用户配置持久保存。很多新手做 Nordic Zephyr 项目时,分区表写错、存储分区大小不够、分区在内部 / 外部 Flash 混用,直接导致 OTA 升级失败、蓝牙配对信息丢失、存储垃圾回收卡死;分区本质就是把 Flash 物理地址切分成逻辑区块,每个区块绑定固定用途,存储系统则负责在分区之上做键值管理、磨损均衡、垃圾回收,下面从分区类型、新旧配置方式、主流存储方案对比、配置步骤、踩坑点完整拆解。
一、Zephyr 必备基础分区清单(MCUboot+OTA 场景)
- boot_partition:MCUboot 引导固件分区,芯片上电优先运行,负责校验、切换固件槽
- slot0_partition(image-0):主固件槽,当前正在运行的应用程序
- slot1_partition(image-1):副固件槽,存放 OTA 下载的新固件,升级时和 slot0 互换
- scratch_partition:交换临时分区,部分 MCUboot 交换算法需要
- storage_partition:数据存储分区,挂载 NVS/ZMS,存放 settings、蓝牙绑定、用户参数
- factory_partition:出厂只读分区(可选),存放校准参数、序列号,一般配置写保护
二、新旧两种分区配置方式对比表
| 配置方式 | 适用 SDK 版本 | 特点 | 推荐度 |
|---|---|---|---|
| DTS Devicetree 分区 | NCS 3.4.0 LTS 及更新 | 原生 Zephyr 方案,支持内部 + 外部 Flash 混合分区,扁平结构,ranges 属性简化地址翻译,逐步成为标准 | ⭐⭐⭐⭐⭐ |
| Partition Manager(pm.yml) | NCS 3.3 及更早版本 | 独立 yml 描述分区,支持复杂嵌套,官方计划停止维护,新项目不建议使用 | ⭐⭐ |
三、Zephyr 主流持久化存储系统对比
| 存储方案 | 类型 | 适合场景 | 最小分区要求 | 核心特点 |
|---|---|---|---|---|
| NVS | 键值存储 | 蓝牙配置、少量参数、低资源 nRF 芯片 | 至少 2 个 sector | 成熟稳定,生态完善,settings 默认后端,垃圾回收简单 |
| ZMS | 新一代键值存储 | 大容量参数、频繁读写场景 | 至少 2 个 sector | 空间利用率更高,读写性能更好,Zephyr 主推替代 NVS |
| LittleFS | 文件系统 | 日志、大文件、批量数据 | 按文件需求 | 支持目录,适合存传感器日志,开销高于 NVS/ZMS |
| FATFS | 通用文件系统 | 对接 U 盘、SD 卡 | 大存储介质 | 不适合小容量片内 Flash,磨损均衡弱 |
四、DTS 分区配置实操步骤(NCS 3.4+)
- 在 board overlay 或者 dts 文件里找到 flash 节点,新增 partitions 子节点,加上 ranges 属性
- 依次定义 boot、slot0、slot1、storage 分区,填写 reg 偏移地址和大小
- 在 chosen 节点绑定 zephyr,code-partition 指向 slot0,zephyr,settings-partition 指向 storage 分区
- 确认 slot0 和 slot1 大小一致,MCUboot 交换算法要求两个固件槽容量相等
- 编译时使用 sysbuild,保证 MCUboot、app、分区布局视图完全一致
- 代码里通过分区 label 获取 flash_area,挂载 NVS/ZMS 存储后端
五、常见开发踩坑清单
- slot0 和 slot1 大小不一致:MCUboot 无法完成 swap 交换,OTA 直接报错
- 存储分区 sector 数量不足:NVS/ZMS 要求最少 2 个 sector,否则无法垃圾回收
- 内外 Flash 分区混用没写对 ranges:地址翻译错乱,分区偏移失效
- 分区被多个镜像定义不一致:MCUboot 和 App 看到的分区表不一样,升级崩溃
- 存储分区太小:蓝牙 Mesh、大量 settings 参数写入后很快占满,出现写失败
- 继续使用旧 pm.yml 新项目:新版 NCS 编译警告、部分新特性不兼容
【常见问题】
问题 1:Nordic 博文介绍 Zephyr 分区和存储系统,NCS 3.4 之后推荐用哪种分区写法?
回答 1:Nordic 博文介绍 Zephyr 分区和存储系统,NCS v3.4.0 LTS 及之后官方推荐 Devicetree DTS 方式定义分区,原来的 Partition Manager 会逐步淘汰。
问题 2:Zephyr 分区和存储系统里,storage 分区一般用来放什么数据?
回答 2:Zephyr 分区和存储系统里的 storage 分区用来挂载 NVS 或者 ZMS,存放 Zephyr settings、蓝牙配对信息、Mesh 配置、用户自定义参数等掉电需要保存的数据。
问题 3:Zephyr 里 NVS 和 ZMS 都属于存储系统,二者怎么选?
回答 3:Zephyr 分区和存储系统中,NVS 成熟稳定适合简单少量参数;ZMS 是新一代方案,空间利用率和读写性能更好,新项目优先评估 ZMS。
问题 4:配置 Zephyr 分区和存储系统做 MCUboot OTA,slot0 和 slot1 有什么硬性要求?
回答 4:Zephyr 分区和存储系统搭配 MCUboot 升级时,slot0 主槽、slot1 副槽必须大小相同,否则固件交换算法无法正常执行,OTA 升级失败。
问题 5:Zephyr DTS 分区配置时 ranges 属性作用是什么?
回答 5:Zephyr 分区和存储系统的 DTS 配置中,ranges 是 NCS3.4 新增属性,用来替代旧 fixed-partitions,支持地址翻译,方便同时配置内部 Flash 和外部 Flash 分区。
【参考资料】
[2026-11-12](
【Nordic 博文分享系列】Zephyr 中的分区和存储系统)电子工程专辑
[2026-11-12](Zephyr Memory Storage (ZMS) 官方文档)Zephyr Project
[2026-11-09](Configuring sysbuild and partitions)Nordic 官方文档
[2026-11-05](Non-Volatile Storage (NVS) 文档)Zephyr Project
[2026-07-13](NCS v3.4.0 DTS 分区外部 Flash 配置问答)Nordic DevZone
【免责声明】
本文内容基于 Nordic 公开博文和 Zephyr 官方文档整理,Zephyr 分区与存储系统的编译、OTA 稳定性、垃圾回收表现,取决于 NCS 版本、DTS 配置、sector 大小、读写频率;不同 nRF 芯片 Flash 容量差异大,分区布局需要根据硬件实际调整,本文不构成量产项目分区方案直接落地依据。
