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存储,反复写同一个文件会加速坏块产生。
⚠️ 避坑指南: 我曾经在一个需要频繁写日志的医疗设备里用了FAT32,结果三个月后SD卡就坏了。后来一查,是日志文件反复覆盖写入,导致某些簇被写烂了。所以,如果你要用FAT32,一定要配合“日志轮转”策略,别让一个文件无限增长。

3.2 exFAT:大文件时代的产物

exFAT是微软为了解决FAT32的4GB限制而推出的。它把单个文件大小上限扩展到了16EB(理论值),实际应用中基本不受限。同时,它优化了簇大小管理,对于大容量存储介质(比如64GB以上的SD卡)效率更高。

适用场景:

  • 医疗影像设备。比如超声、内窥镜,需要存储大量高清视频或图像序列。
  • 需要与PC频繁交换数据的设备。exFAT在Windows和macOS上原生支持,Linux需要额外安装驱动。

但要注意:

  • exFAT依然没有日志功能。掉电保护还是得靠上层应用自己实现。
  • 专利问题。虽然微软现在开放了exFAT的授权,但商用设备还是得留意法律风险。
  • 嵌入式实现相对复杂。很多轻量级MCU的exFAT驱动库并不完善,我建议你选型时先确认好SDK支持情况。
💡 我的习惯: 如果设备需要存储单个超过4GB的文件,且必须与PC直接交换数据,我会优先考虑exFAT。否则,我宁愿用FAT32+分片存储的方案,更稳妥。

3.3 LittleFS:为嵌入式Flash而生

LittleFS是ARM公司专门为嵌入式系统设计的文件系统。它最初是为Mbed OS开发的,后来被移植到了各种RTOS和裸机环境中。它的核心设计理念是:掉电安全磨损均衡

原理上,它做了两件关键的事:

  1. Copy-on-Write(写时复制):每次修改文件,不是直接覆盖原数据,而是先写到新位置,然后更新元数据。这样即使写的过程中掉电,原数据依然完好。
  2. 磨损均衡:它会尽量均匀地使用Flash的每个块,避免某些块被频繁擦写而提前报废。

我为什么喜欢它?

  • 掉电安全。我在一个便携式血糖仪项目里用了LittleFS,设备经常被患者随意拔电池,但从来没丢过数据。
  • 内存占用极低。RAM消耗通常只有几百字节,非常适合资源受限的MCU。
  • 支持动态目录和文件创建。不像SPIFFS那样有文件数量上限。
📌 适用场景: 医疗可穿戴设备、便携式诊断仪、植入式设备。这些设备对数据完整性要求极高,且存储介质通常是NOR Flash或NAND Flash。

缺点:

  • 读写速度相对较慢。因为每次写操作都要做Copy-on-Write,会有额外的开销。
  • 与PC不兼容。你不能直接把LittleFS格式化的存储介质插到电脑上读取。

3.4 SPIFFS:轻量级SPI Flash文件系统

SPIFFS是专门为SPI Flash设计的文件系统。它比LittleFS更早出现,在很多IoT设备里用得很多。它的设计目标就是:极简

核心特点:

  • 静态磨损均衡。它会在文件写入时尽量选择擦写次数较少的块。
  • 不支持目录。所有文件都平铺在根目录下。你想想看,如果一个设备里存了几百个日志文件,管理起来会多痛苦。
  • 文件数量有限制。默认配置下,最多支持几十到几百个文件,具体取决于Flash大小和配置参数。
⚠️ 我曾经踩过的坑: 在一个体温贴项目里,我用SPIFFS存储每天的体温记录。结果设备运行了半年后,突然无法创建新文件了。一查,是文件数量达到了上限。后来我改成了LittleFS,才彻底解决这个问题。

适用场景:

  • 简单的数据记录设备。比如温湿度传感器、环境监测节点。
  • 资源极度受限的MCU。比如只有几KB RAM的Cortex-M0芯片。
  • 不需要频繁创建/删除文件的场景。

3.5 如何选择?一张表说清楚

特性 FAT32 exFAT LittleFS SPIFFS
最大文件大小 4GB 16EB 受Flash大小限制 受Flash大小限制
掉电安全 ❌ 无日志 ❌ 无日志 ✅ 写时复制 ⚠️ 部分支持
磨损均衡 ❌ 无 ❌ 无 ✅ 动态均衡 ✅ 静态均衡
目录支持 ✅ 支持 ✅ 支持 ✅ 支持 ❌ 不支持
PC兼容性 ✅ 极好 ✅ 好 ❌ 不兼容 ❌ 不兼容
RAM占用 中等(几KB) 较高(几十KB) 极低(几百字节) 低(1-2KB)
典型应用 SD卡数据记录 大容量影像存储 医疗可穿戴设备 简单传感器节点

3.6 我的选型建议

嗯,说了这么多,最后给你一个实用的决策流程:

  1. 先看存储介质:如果是SD卡或eMMC,优先考虑FAT32或exFAT。如果是NOR Flash或NAND Flash,LittleFS或SPIFFS更合适。
  2. 再看数据重要性:如果掉电丢数据会出医疗事故,别犹豫,直接上LittleFS。它的掉电安全机制是经过验证的。
  3. 最后看文件大小:单个文件超过4GB?exFAT是唯一选择。但要做好掉电保护的上层设计。

我个人习惯是:能用LittleFS的地方,绝不用FAT32。虽然LittleFS与PC不兼容,但医疗设备的数据通常需要加密传输,本来就不会直接插到电脑上读。何必为了一个用不到的特性,牺牲掉电安全和磨损均衡呢?

好了,这一章就讲到这里。下一章我们会深入讨论日志系统的设计模式,包括环形日志、分级日志、以及如何与文件系统配合实现可靠的医疗数据记录。到时候我会分享一个我在呼吸机项目里实际用过的日志架构,保证干货满满。