嵌入式学习-Flash操作
·
以下是对 RT-Thread 中 FAL 与 SFUD 的区别及依赖关系的系统性学习笔记,涵盖核心概念、功能对比、依赖链和使用场景:
一、核心概念
| 组件 | 定位 | 核心目标 |
|---|---|---|
| FAL | Flash 抽象管理层 | 统一接口管理多类 Flash 设备,提供分区划分能力 |
| SFUD | 串行 Flash 通用驱动库 | 自动识别并驱动各类 SPI/QSPI NOR Flash 芯片 |
二、功能对比
| 特性 | FAL | SFUD |
|---|---|---|
| 核心功能 | ✅ 分区管理 ✅ 统一读写/擦除 API ✅ 跨设备访问 |
✅ 自动识别芯片 (JEDEC ID) ✅ 提供标准 SPI 设备接口 |
| 操作对象 | 逻辑分区(如 bootloader, filesystem) |
物理 Flash 芯片(如 W25Q64, GD25Q128) |
| 层级位置 | 应用层与驱动层之间 | 硬件驱动层 |
| 依赖关系 | 依赖底层驱动(如 SFUD/片内 Flash 驱动) | 依赖 SPI 设备框架(rt_spi_device) |
| 是否必需 | 非必需,但强烈推荐用于复杂存储管理 | 使用 SPI Flash 时必需 |
三、依赖关系与协作流程
1. 依赖链
graph TD
A[应用程序] -->|调用| B[FAL API]
B -->|操作分区| C[FAL 设备]
C -->|依赖| D[FAL Port层(如 SFUD Port)]
D -->|调用| E[SFUD 接口]
E -->|操作硬件| F[SPI 设备驱动]
F -->|控制| G[物理 Flash 芯片]
2. 关键协作步骤
- SFUD 初始化
- 挂载 SPI 设备 → 自动识别 Flash 型号 → 生成
sfud_flash设备。
- 挂载 SPI 设备 → 自动识别 Flash 型号 → 生成
- FAL 绑定 SFUD
- 通过 FAL SFUD Port(如
fal_flash_sfud_port_init())将 SFUD 设备注册为 FAL 设备。
- 通过 FAL SFUD Port(如
- FAL 分区管理
- 在
fal_cfg.h中定义分区表,例如:const struct fal_partition partitions[] = { { "filesystem", FAL_USING_NOR_FLASH_DEV_NAME, 0, 1024*1024, 0 }, // 使用 SFUD 驱动的设备 { "factory", "stm32_onchip", 0, 128*1024, 0 }, // 使用片内 Flash };
- 在
- 上层应用调用
- 文件系统(如 LittleFS)、OTA 等通过
fal_partition_read/write()操作分区,无需感知底层是 SFUD 还是片内 Flash。
- 文件系统(如 LittleFS)、OTA 等通过
四、典型应用场景
1. 独立使用 SFUD
- 适用场景:仅需直接操作 SPI Flash
- 代码示例:
sfud_flash *flash = sfud_get_device(0); sfud_read(flash, 0, buffer, size); // 直接读写物理地址
2. FAL + SFUD 联合使用
- 适用场景:需要分区管理、多设备统一访问
- 代码示例:
const struct fal_partition *fs_part = fal_partition_find("filesystem"); fal_partition_read(fs_part, 0, buffer, size); // 抽象分区读写
五、常见问题解答
Q1:FAL 必须依赖 SFUD 吗?
否。FAL 可挂载多种设备:
- 片内 Flash(如
drv_flash_stm32.c) - 用户自定义 Flash 驱动
- SFUD 是最常用的 SPI Flash 驱动选项
Q2:SFUD 能否绕过 FAL 直接对接文件系统?
是,但不推荐:
- 可直接通过
rt_sfud_flash_probe()创建块设备供文件系统使用; - 缺点:失去跨设备分区管理能力,灵活性下降。
Q3:如何选择使用方案?
| 需求 | 推荐方案 |
|---|---|
| 仅操作单块 SPI Flash | 单独使用 SFUD |
| 多分区/跨设备/OTA/文件系统 | FAL + SFUD Port |
六、总结
| 维度 | FAL | SFUD |
|---|---|---|
| 核心价值 | 存储管理抽象层 | 硬件设备通用驱动 |
| 关键能力 | 分区划分、统一接口、跨设备透明访问 | 芯片自动识别、通用 SPI 操作接口 |
| 协作关系 | 调用 SFUD Port 操作底层硬件 | 为 FAL 提供 SPI Flash 的驱动支持 |
| 不可替代性 | 管理复杂存储结构的必要组件 | 驱动未知型号 SPI Flash 的唯一解 |
✅ 最佳实践:
在涉及 外部 SPI Flash 的复杂系统(如带文件系统、OTA 升级)中,FAL + SFUD Port 是黄金组合,兼顾设备兼容性与存储管理能力。
附:学习资源
- RT-Thread FAL 文档
- SFUD GitHub 仓库
- 示例代码路径:
rt-thread/components/fal&rt-thread/components/drivers/sfud
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)