以下是对 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. 关键协作步骤
  1. SFUD 初始化
    • 挂载 SPI 设备 → 自动识别 Flash 型号 → 生成 sfud_flash 设备。
  2. FAL 绑定 SFUD
    • 通过 FAL SFUD Port(如 fal_flash_sfud_port_init())将 SFUD 设备注册为 FAL 设备。
  3. 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
      };
      
  4. 上层应用调用
    • 文件系统(如 LittleFS)、OTA 等通过 fal_partition_read/write() 操作分区,无需感知底层是 SFUD 还是片内 Flash

四、典型应用场景

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 是黄金组合,兼顾设备兼容性与存储管理能力。


附:学习资源

  1. RT-Thread FAL 文档
  2. SFUD GitHub 仓库
  3. 示例代码路径:rt-thread/components/fal & rt-thread/components/drivers/sfud
Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐