1. 课程导入与工程目标
在嵌入式项目里,“存文件”这件事看起来简单,真正落地却常常卡在几个具体问题上:NAND 有坏块、掉电会写坏页、SPI Flash 需要擦除后才能写、SD 卡可能被热插拔、日志文件要能追加、配置参数要能原子更新。裸写扇区能解决一部分问题,但一旦需要目录、文件名、长文件名、多文件并发、断电恢复,就必须引入文件系统。SEGGER emFile 正是面向这类场景的嵌入式文件系统:它不依赖操作系统,可运行在裸机或 RTOS 之上,向上提供接近标准 C 库的文件 API,向下通过驱动层对接 NAND、NOR、SPI Flash、SD/eMMC、RAM 盘等介质。
本课程的目标不是“读一遍手册”,而是完成一次可复现的工程集成:把 emFile 源码、驱动、RTOS 适配、配置文件和测试用例组合成一个能在目标板上跑起来的工程,并让文件读写、目录遍历、掉电恢复、性能指标都可观察、可判断。下面这张图给出了本课程的整体技术定位与集成路径,后续各章会沿着这条链路逐段展开。
从图中可以看到,emFile 的价值集中在“核心层”这一带:它把 FAT 卷管理、扇区缓存、磨损均衡和掉电恢复封装起来,让应用层只面对文件 API,而驱动层只面对“读页、写页、擦块”这类介质原语。集成工作的难点也正好落在两条边界上:上边界是应用如何正确调用 API 并处理返回值,下边界是驱动如何把物理介质的时序、坏块和擦除特性如实上报给核心层。
学习路径与阶段目标
本课程按“先跑通、再跑稳、后跑快”的顺序组织。第一阶段先让文件系统在 RAM 盘或已格式化的 SPI Flash 上挂载成功,能创建文件、写入字符串、读回并比对;第二阶段接入真实 NAND 或 SD 卡,处理坏块、擦除、掉电恢复;第三阶段做性能与可靠性验证,包括写入吞吐、挂载时间、异常掉电后的文件完整性。每一阶段都有明确的观察点,而不是笼统的“调通”。
以第一阶段为例,一个可执行的最小验证流程是:在 FS_Config.c 中把 FS_SUPPORT_MMC 或对应介质宏打开,配置 FS_NAND_PAGE_SIZE、FS_NAND_BLOCK_SIZE 等参数与硬件一致;调用 FS_Init() 完成驱动注册;调用 FS_Mount() 挂载卷;随后用 FS_FOpen("test.txt", "w") 创建文件,写入 "emFile OK\n",关闭后重新以 "r" 打开并读回。判断依据很直接:FS_Mount 返回 0,文件长度等于写入字节数,读回内容逐字节一致。若挂载失败,优先检查驱动返回的介质 ID 和容量是否与预期一致,而不是先怀疑文件系统本身。
所需软硬件环境
硬件方面,需要一块带外部存储介质的开发板,例如带 SPI NOR Flash 的 STM32 板、带 NAND 的 i.MX RT 板或带 SD 卡的通用板;调试器推荐 J-Link,便于使用 RTT 输出日志而不占用串口;若验证掉电恢复,还需要可编程电源或至少一个能手动切断存储供电的跳线,配合逻辑分析仪观察写保护与掉电时序。软件方面,需要 emFile 源码包(含 FS、FS_Config、驱动模板)、目标芯片的底层驱动(SPI/SDIO/FMC)、一个可编译的工程模板,以及串口或 RTT 终端用于打印挂载与读写结果。
| 类别 | 项目 | 作用 |
|---|---|---|
| 硬件 | 目标板 + 存储介质 | 承载 emFile 与真实介质 |
| 硬件 | J-Link + RTT | 调试与日志输出 |
| 硬件 | 可编程电源 / 掉电跳线 | 验证掉电恢复 |
| 软件 | emFile 源码包 | 核心层与驱动模板 |
| 软件 | 芯片底层驱动 | SPI/SDIO/FMC 时序 |
| 软件 | IDE 工程 | 编译、下载、调试 |