您的位置首页 >科技要闻 >

Nordic 博文解读 Zephyr 分区与存储系统,DTS 分区、NVS、ZMS 方案详解

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 场景)

  1. boot_partition:MCUboot 引导固件分区,芯片上电优先运行,负责校验、切换固件槽
  2. slot0_partition(image-0):主固件槽,当前正在运行的应用程序
  3. slot1_partition(image-1):副固件槽,存放 OTA 下载的新固件,升级时和 slot0 互换
  4. scratch_partition:交换临时分区,部分 MCUboot 交换算法需要
  5. storage_partition:数据存储分区,挂载 NVS/ZMS,存放 settings、蓝牙绑定、用户参数
  6. 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+)

  1. 在 board overlay 或者 dts 文件里找到 flash 节点,新增 partitions 子节点,加上 ranges 属性
  2. 依次定义 boot、slot0、slot1、storage 分区,填写 reg 偏移地址和大小
  3. 在 chosen 节点绑定 zephyr,code-partition 指向 slot0,zephyr,settings-partition 指向 storage 分区
  4. 确认 slot0 和 slot1 大小一致,MCUboot 交换算法要求两个固件槽容量相等
  5. 编译时使用 sysbuild,保证 MCUboot、app、分区布局视图完全一致
  6. 代码里通过分区 label 获取 flash_area,挂载 NVS/ZMS 存储后端

五、常见开发踩坑清单

  1. slot0 和 slot1 大小不一致:MCUboot 无法完成 swap 交换,OTA 直接报错
  2. 存储分区 sector 数量不足:NVS/ZMS 要求最少 2 个 sector,否则无法垃圾回收
  3. 内外 Flash 分区混用没写对 ranges:地址翻译错乱,分区偏移失效
  4. 分区被多个镜像定义不一致:MCUboot 和 App 看到的分区表不一样,升级崩溃
  5. 存储分区太小:蓝牙 Mesh、大量 settings 参数写入后很快占满,出现写失败
  6. 继续使用旧 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 容量差异大,分区布局需要根据硬件实际调整,本文不构成量产项目分区方案直接落地依据。

今日大家都在搜的词: