1. Zephyr 存储子系统概述

Zephyr RTOS 的存储子系统采用分层、模块化的架构设计,旨在为资源受限的嵌入式设备提供灵活、可裁剪的存储解决方案。整个子系统从上到下依次为:应用接口层、存储抽象层、文件系统层以及底层存储介质驱动层。本章将系统性地介绍这一架构的核心组件及其相互关系。

学习提示:理解 Zephyr 存储子系统的分层结构是后续进行 Flash 分区配置与驱动开发的基础。建议重点关注各层之间的数据流与依赖关系。

1.1 存储介质层

Zephyr 支持多种物理存储介质,通过统一的设备驱动模型(Device Driver Model)进行管理。下表列出了常见的存储介质及其典型应用场景:

存储介质 接口类型 典型容量 主要用途 擦写寿命
NOR Flash SPI / Quad SPI / Parallel 512KB ~ 256MB 代码执行(XIP)、配置参数、固件存储 高(10万次)
NAND Flash Raw NAND / SPI NAND 128MB ~ 8GB 大容量数据存储、文件系统 中(1万次)
RAM (SRAM/PSRAM) 内部总线 / SPI 32KB ~ 16MB 运行时数据、临时缓存、日志缓冲区 无限
SD/MMC 卡 SDIO / SPI 128MB ~ 32GB 日志记录、数据采集、固件升级包 中(取决于质量)
EEPROM I2C / SPI 1KB ~ 512KB 小量关键参数、校准数据 高(100万次)
架构要点:在 Zephyr 中,所有存储介质都通过 struct device 结构体抽象,并实现标准 API(如 flash_read、flash_write、flash_erase)。这种统一接口设计使得上层子系统无需关心底层硬件差异。

1.2 存储子系统分层架构

下图展示了 Zephyr 存储子系统的完整分层架构,以及各层之间的数据流向:

Zephyr 存储子系统分层架构 应用层 (Application Layer) 用户任务 / 协议栈 / 业务逻辑 存储抽象层 (Storage Abstraction Layer) Settings API | NVS API | File System API 提供统一的键值对、非易失存储、文件操作接口 文件系统层 (File System Layer) LittleFS | FAT FS | SPIFFS | NVS (原生) 提供目录、文件、权限管理等高级语义 存储设备抽象层 (Device Abstraction Layer) Flash Page Layout | Disk Access | Block Device 驱动层 (Driver Layer) SPI Flash Driver | SDHC Driver | RAM Disk Driver 直接操作硬件寄存器,实现底层读写擦除 数据流方向:应用 → 抽象 → 文件系统 → 设备抽象 → 驱动 → 硬件

1.3 核心存储子系统详解

Zephyr 提供了三个核心的存储抽象子系统,它们直接面向应用开发者,屏蔽了底层存储介质的复杂性:

1.3.1 非易失性存储 (NVS)

  • 定位:轻量级键值对存储,专为 Flash 介质优化。
  • 特点:支持磨损均衡、掉电安全、增量写入。
  • 典型用途:设备配置参数、网络凭据、校准数据。
  • API 示例:nvs_write()、nvs_read()、nvs_delete()。

1.3.2 设置子系统 (Settings)

  • 定位:高层级配置管理框架,构建于 NVS 或文件系统之上。
  • 特点:支持分层键名(如 bt/name)、运行时动态注册、序列化/反序列化。
  • 典型用途:蓝牙名称、Wi-Fi SSID/密码、系统参数。
  • API 示例:settings_save_one()、settings_load_subtree()。

1.3.3 文件系统 (File System)

  • 定位:提供 POSIX 风格的文件和目录操作。
  • 支持后端:LittleFS(Flash 优化)、FAT FS(兼容性)、SPIFFS(小容量 Flash)。
  • 典型用途:日志文件、固件升级包、用户数据文件。
  • API 示例:fs_open()、fs_write()、fs_read()、fs_mkdir()。
选型注意事项:在选择存储子系统时,需综合考虑 Flash 容量、擦写寿命、数据安全性要求以及运行时内存开销。例如,对于频繁小量写入的场景,NVS 比文件系统更高效且更省 Flash。

1.4 子系统对比与选型指南

下表从多个维度对比了三个核心存储子系统,帮助开发者根据实际需求做出选择:

对比维度 NVS Settings File System
数据模型 键值对 (Key-Value) 分层键值对 (Tree Key-Value) 文件 + 目录 (File + Dir)
RAM 占用 低 (~1KB) 中 (~2-4KB) 高 (~4-16KB)
Flash 占用 低 (~2KB) 中 (~4KB) 高 (~8-32KB)
磨损均衡 内置 依赖后端 依赖文件系统
掉电安全 是 是 部分支持
最大单条数据 受限于 Flash 扇区 受限于后端 受限于可用空间
适用场景 配置参数、状态保存 系统级配置管理 日志、固件、多媒体

1.5 存储子系统与 Flash 分区的关系

在实际嵌入式系统中,Flash 通常被划分为多个逻辑分区,每个分区服务于不同的存储子系统。下图展示了一个典型的 Flash 分区布局及其与子系统的映射关系:

典型 Flash 分区布局与子系统映射 Flash 芯片 (例如: 16MB NOR Flash) Bootloader MCUboot 固件 Slot 0 主应用镜像 固件 Slot 1 升级备用镜像 NVS 分区 Settings / NVS 子系统 文件系统分区 LittleFS / FAT FS 日志分区 循环日志 / 调试数据 分区配置要点 1. 每个分区对应一个 fixed-partition 设备节点 2. 分区大小必须对齐 Flash 擦除块 (Sector) 大小 3. 分区起始地址和大小在设备树 (DTS) 中静态定义

1.6 关键概念总结

  • 设备树 (Device Tree):Zephyr 使用设备树描述硬件布局,包括 Flash 分区、外设地址、驱动配置等。分区信息在 .dts 文件中通过 partitions 节点定义。
  • Flash 驱动 API:所有 Flash 操作最终通过 flash_write()、flash_read()、flash_erase() 等标准 API 完成,这些 API 由底层驱动实现。
  • 分区表 (Partition Table):定义了每个分区的名称、偏移地址、大小和访问权限,是连接硬件与上层存储子系统的桥梁。
  • 磨损均衡 (Wear Leveling):NVS 和部分文件系统(如 LittleFS)内置磨损均衡算法,延长 Flash 使用寿命。