跳转至

LittleFS文件系统在MCU Flash上的应用

难度:🟡 中级 | 领域:嵌入式文件系统 | 关键词:LittleFS, COW, 磨损均衡, NOR Flash | 阅读时间:约 16 分钟

日常类比

裸 Flash 像没贴标签的抽屉:你得自己记“配置在第几格”。文件系统像给抽屉贴标签、建目录。LittleFS(Little File System)专为微控制器(Microcontroller Unit, MCU)上的 NOR Flash 设计:断电像突然关灯,重启后仍能回到最近一次“一致状态”,而不是一堆半写坏的纸片[1][2]。

摘要

说明 LittleFS 的写时拷贝(Copy-On-Write, COW)元数据、磨损均衡与有界 RAM、移植所需四个回调,并对照 FatFs / SPIFFS。吞吐与挂载时间随块大小与 lookahead 变化,以实测与官方文档为准[1][4]。

1. 为何需要 LittleFS

目标 含义
掉电安全 任意时刻断电,重启可恢复到最近一致状态
磨损均衡 写入分散到各擦除块,避免热点块先耗尽
有界资源 RAM/ROM 不随 Flash 容量线性膨胀

典型用途:配置持久化、日志、OTA(Over-The-Air)镜像旁路元数据。PC 直读不是目标——需要工具导出[1][5]。

2. 核心机制

机制 要点
元数据 COW 改目录/inode 写新副本,原子提交后切换
Inline 小文件 极小文件可嵌在元数据中,减少擦写
CTZ skip-list 大文件用可跳转块链,随机读代价可控
block_cycles 周期性搬迁旧块,实现动态磨损均衡

配置关键:block_size(擦除块)、block_countcache_sizelookahead_sizeblock_cycles(可置 0 禁用均衡,一般不建议)[1]。

参数 典型量级(需按器件核对)
block_size 内部 Flash 常 2–4 KB;外部 SPI NOR 常 4 KB
cache_size 十余~数十字节量级,≥ prog/read 缓冲
lookahead_size 影响挂载扫描速度与少量 RAM

3. 移植面

应用 → LittleFS → 用户实现的 read / prog / erase / sync → 内部 Flash 或 SPI NOR。

对比 LittleFS FatFs SPIFFS
PC 直读 优(SD)
掉电安全 设计目标 依赖 sync 策略 部分
磨损均衡 内置 多靠介质 有(维护弱)
目录 无(扁平)
介质倾向 NOR SD/块设备 NOR

内部 Flash 注意:按页编程、按扇区擦除、中断与缓存一致性;外部 W25Q 类注意忙轮询与写保护[3][4]。

4. 局限、挑战与可改进方向

1. 写放大

局限:改 1 字节可能触发整块级 COW/对齐写。 改进:合并小写、善用 inline、prog_size 对齐页;日志用追加大文件。

2. 挂载与碎片

局限:大容量 + 小 lookahead 时挂载变慢;长期碎片影响吞吐。 改进:调大 lookahead;预留空闲块;必要时重格式化策略。

3. 非线程安全默认

局限:多任务并发调用同一 lfs_t 易损坏状态。 改进:外层互斥锁;或每任务独立挂载(少见)。

4. 与 PC 互操作差

局限:现场拷文件不如 FatFs/SD 方便。 改进:调试口导出工具;量产日志分区仍用 LittleFS,交换分区用 FatFs。

5. 实践要点

  1. 先验证四回调的擦写边界与忙等待,再 lfs_format / lfs_mount
  2. 量产锁定 block_size 与 Flash 型号;OTA 与数据分区分开更清晰。
  3. 需要 PC 直读 SD 日志时对照 embedded-fat-filesystem

参考文献

[1] ARM mbed / littlefs-project, LittleFS design and usage. [2] G. Nitz, LittleFS: A high-integrity embedded filesystem (mbed conf.). [3] Winbond, W25Q Serial Flash Memory Datasheet. [4] STMicroelectronics, STM32 Flash programming / HAL notes. [5] ChaN, FatFs documentation(对照用). [6] SPIFFS project status and design notes. [7] JEDEC NOR Flash interface / endurance guidance. [8] Embedded power-fail filesystem patterns(实践综述). [9] YAFFS design overview(NAND 对照). [10] MCU OTA dual-bank storage layout application notes. [11] littlefs GitHub issue tracker — wear leveling & write amplification discussions.