3. 文件系统基础:FAT32、exFAT、LittleFS、SPIFFS的原理与适用场景
做嵌入式存储,尤其是医疗设备这块,文件系统是个绕不开的话题。我见过不少工程师,上来就选FAT32,觉得通用、简单。结果呢?掉电丢数据、磨损均衡出问题、日志文件越写越大最后把Flash撑爆了……这些坑我都踩过。
今天咱们就把这几个主流文件系统掰开揉碎了讲。FAT32、exFAT、LittleFS、SPIFFS,它们各自适合什么场景?原理上有什么本质区别?我会结合我实际项目中的经验,给你讲清楚。
3.1 FAT32:老牌通用文件系统
FAT32,全称File Allocation Table 32。说白了,它就是个“目录+链表”的结构。每个文件在存储介质上占用的簇,通过文件分配表(FAT表)串成一个链表。你读文件时,系统就顺着这个链表往下找。
优点很明显:
- 兼容性极好。Windows、Linux、macOS都能直接读写。
- 实现简单。很多MCU的SD卡驱动库都自带FAT32支持。
- 成熟稳定。用了二十多年了,该踩的坑都被人踩过了。
缺点也致命:
- 单个文件最大不能超过4GB。这在医疗影像设备里是个硬伤。你想想看,一个CT扫描的DICOM文件,动不动就几个GB,4GB根本不够用。
- 没有日志(Journaling)功能。突然掉电,文件系统可能损坏。我在一个心电监护仪项目里就吃过这个亏——设备正在写日志,护士拔了电源,结果整个分区都挂了,历史数据全丢了。
- 不支持磨损均衡。对于Flash存储,反复写同一个文件会加速坏块产生。
3.2 exFAT:大文件时代的产物
exFAT是微软为了解决FAT32的4GB限制而推出的。它把单个文件大小上限扩展到了16EB(理论值),实际应用中基本不受限。同时,它优化了簇大小管理,对于大容量存储介质(比如64GB以上的SD卡)效率更高。
适用场景:
- 医疗影像设备。比如超声、内窥镜,需要存储大量高清视频或图像序列。
- 需要与PC频繁交换数据的设备。exFAT在Windows和macOS上原生支持,Linux需要额外安装驱动。
但要注意:
- exFAT依然没有日志功能。掉电保护还是得靠上层应用自己实现。
- 专利问题。虽然微软现在开放了exFAT的授权,但商用设备还是得留意法律风险。
- 嵌入式实现相对复杂。很多轻量级MCU的exFAT驱动库并不完善,我建议你选型时先确认好SDK支持情况。
3.3 LittleFS:为嵌入式Flash而生
LittleFS是ARM公司专门为嵌入式系统设计的文件系统。它最初是为Mbed OS开发的,后来被移植到了各种RTOS和裸机环境中。它的核心设计理念是:掉电安全和磨损均衡。
原理上,它做了两件关键的事:
- Copy-on-Write(写时复制):每次修改文件,不是直接覆盖原数据,而是先写到新位置,然后更新元数据。这样即使写的过程中掉电,原数据依然完好。
- 磨损均衡:它会尽量均匀地使用Flash的每个块,避免某些块被频繁擦写而提前报废。
我为什么喜欢它?
- 掉电安全。我在一个便携式血糖仪项目里用了LittleFS,设备经常被患者随意拔电池,但从来没丢过数据。
- 内存占用极低。RAM消耗通常只有几百字节,非常适合资源受限的MCU。
- 支持动态目录和文件创建。不像SPIFFS那样有文件数量上限。
缺点:
- 读写速度相对较慢。因为每次写操作都要做Copy-on-Write,会有额外的开销。
- 与PC不兼容。你不能直接把LittleFS格式化的存储介质插到电脑上读取。
3.4 SPIFFS:轻量级SPI Flash文件系统
SPIFFS是专门为SPI Flash设计的文件系统。它比LittleFS更早出现,在很多IoT设备里用得很多。它的设计目标就是:极简。
核心特点:
- 静态磨损均衡。它会在文件写入时尽量选择擦写次数较少的块。
- 不支持目录。所有文件都平铺在根目录下。你想想看,如果一个设备里存了几百个日志文件,管理起来会多痛苦。
- 文件数量有限制。默认配置下,最多支持几十到几百个文件,具体取决于Flash大小和配置参数。
适用场景:
- 简单的数据记录设备。比如温湿度传感器、环境监测节点。
- 资源极度受限的MCU。比如只有几KB RAM的Cortex-M0芯片。
- 不需要频繁创建/删除文件的场景。
3.5 如何选择?一张表说清楚
| 特性 | FAT32 | exFAT | LittleFS | SPIFFS |
|---|---|---|---|---|
| 最大文件大小 | 4GB | 16EB | 受Flash大小限制 | 受Flash大小限制 |
| 掉电安全 | ❌ 无日志 | ❌ 无日志 | ✅ 写时复制 | ⚠️ 部分支持 |
| 磨损均衡 | ❌ 无 | ❌ 无 | ✅ 动态均衡 | ✅ 静态均衡 |
| 目录支持 | ✅ 支持 | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| PC兼容性 | ✅ 极好 | ✅ 好 | ❌ 不兼容 | ❌ 不兼容 |
| RAM占用 | 中等(几KB) | 较高(几十KB) | 极低(几百字节) | 低(1-2KB) |
| 典型应用 | SD卡数据记录 | 大容量影像存储 | 医疗可穿戴设备 | 简单传感器节点 |
3.6 我的选型建议
嗯,说了这么多,最后给你一个实用的决策流程:
- 先看存储介质:如果是SD卡或eMMC,优先考虑FAT32或exFAT。如果是NOR Flash或NAND Flash,LittleFS或SPIFFS更合适。
- 再看数据重要性:如果掉电丢数据会出医疗事故,别犹豫,直接上LittleFS。它的掉电安全机制是经过验证的。
- 最后看文件大小:单个文件超过4GB?exFAT是唯一选择。但要做好掉电保护的上层设计。
我个人习惯是:能用LittleFS的地方,绝不用FAT32。虽然LittleFS与PC不兼容,但医疗设备的数据通常需要加密传输,本来就不会直接插到电脑上读。何必为了一个用不到的特性,牺牲掉电安全和磨损均衡呢?
好了,这一章就讲到这里。下一章我们会深入讨论日志系统的设计模式,包括环形日志、分级日志、以及如何与文件系统配合实现可靠的医疗数据记录。到时候我会分享一个我在呼吸机项目里实际用过的日志架构,保证干货满满。