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 存储子系统的完整分层架构,以及各层之间的数据流向:
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 分区布局及其与子系统的映射关系:
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 使用寿命。