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_count、cache_size、lookahead_size、block_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. 实践要点¶
- 先验证四回调的擦写边界与忙等待,再
lfs_format/lfs_mount。 - 量产锁定
block_size与 Flash 型号;OTA 与数据分区分开更清晰。 - 需要 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.