| | | .---._____ .-----. | |--|o |--| littlefs |--| |--| | 39-----' '----------' | | |
功率损失恢复能力——littlefs设计用于处理随机电源故障。所有文件操作都有很强的写时拷贝保证,如果断电,文件系统将恢复到上一次已知的良好状态。
动态磨损均衡-littlefs的设计考虑了flash,并在动态块上提供磨损均衡。此外,小家伙可以发现坏的积木,并在它们周围工作。
有界RAM/ROM——littlefs设计用于处理少量内存。RAM使用受到严格限制,这意味着RAM消耗不会随着文件系统的增长而改变。文件系统不包含无限缓存,动态内存仅限于可静态提供的可配置缓冲区。
这里';这是一个简单的例子,每次Main运行时都会更新一个名为boot_count的文件。程序可以随时中断,而不会丢失其启动次数的跟踪,也不会损坏文件系统:
#包括";lfs。h";//文件系统lfs_t lfs使用的变量;lfs_file_t file;//文件系统的配置由这个struct const struct lfs_config cfg={//block device operations.read=user_-provided_-block_-device_-read、.prog=user_-provided_-block_-device_-erase、.sync=user_-provided_-device_-sync、//block device configuration.read_-size=16、.prog_-size=16、.block-count=128、.cache_-size=16、.lookahead_-size=16。块_循环=500,};//入口点int main(void){//mount the filesystem int err=lfs_mount(&;lfs,&;cfg);//如果我们能够';t mount the filesystem,请重新格式化//读取当前计数uint32\u t boot\u count=0;lfs_file_open(&;lfs,&;file,&34;boot_count";,lfs_O_RDWR | lfs_O_CREAT);lfs_file_read(&;lfs,&;file,&;boot_count,sizeof(boot_count));//更新引导计数引导计数+=1;lfs_文件_倒带(&;lfs,&;文件);lfs_file_write(&;lfs,&;file,&;boot_count,sizeof(boot_count));//请记住,只有成功关闭文件(lfs_file_close(&;lfs,&;file);//释放我们使用lfs_unmount(&;lfs)的所有资源;//打印启动计数printf(";启动计数:%d\n";启动计数);)
详细的文档(或至少是目前可用的尽可能多的细节)可以在lfs的评论中找到。H
littlefs采用了一种配置结构,定义了文件系统的操作方式。configuration struct为文件系统提供了块设备操作和维度、可调整的参数,这些参数可以在内存使用和性能之间进行权衡,如果用户希望避免动态内存,还可以提供可选的静态缓冲区。
littlefs的状态存储在lfs_t类型中,由用户分配,允许多个文件系统同时使用。使用lfs_t和配置结构,用户可以格式化块设备或挂载文件系统。
一旦安装,littlefs就提供了一整套类似POSIX的文件和目录功能,不同之处在于文件系统结构的分配必须由用户提供。
所有POSIX操作,例如删除和重命名,都是原子操作,即使在断电的情况下也是如此。此外,在文件上调用sync或close之前,文件更新实际上不会提交到文件系统。
Littlefs是用C编写的,特别是应该使用任何符合C99标准的编译器进行编译。
所有littlefs调用都可能返回一个否定的错误代码。错误可以是在lfs中的enum lfs_错误中找到的其中一个。h、 或者用户返回的错误';阻止设备操作。
在配置结构中,如果实现已检测到损坏块,则用户提供的prog和erase函数可能会返回LFS_ERR_CORRUPT error。然而,磨损水平不取决于这些函数的返回代码,而是将所有数据读回并检查完整性。
如果存储缓存写操作,请确保提供的同步功能将所有数据刷新到内存中,并确保下一次读取从内存中获取数据,否则无法保证数据完整性。如果writefunction不执行缓存,因此每次读或写调用都会命中内存,那么同步函数可以简单地返回0。
从高层来看,littlefs是一个基于块的文件系统,它使用小日志存储元数据,使用较大的写时拷贝(COW)结构存储文件数据。
在littlefs中,这些成分形成了一种两层蛋糕,小日志(称为元数据对)提供了对存储中任何地方的元数据的快速更新,而COW结构紧凑地存储文件数据,没有任何开销。
这两种数据结构都是由块构建的,这些块由一个公共块分配器提供。通过限制blockper分配上允许的擦除次数,分配器提供了整个系统的动态磨损均衡。
根。-------------.|A';|B';| | | ||->;| | | |'--------'--------' .----' '--------------. A v B v。-------------------------|C';|D';| | |E'|新的| | | | |->;| | |E'|->;| | | | | | |'--------'--------' '--------'--------' .-' '--. | '------------------. v v-' v、 ---------。v.--------|C | | D |.----------。写|新E | | | | | | E |=>;| | | | ||'--------' '--------' | | '--------' '--------' .-' | .-' '-. .-------------|------' v v v。-------------------------F | | G | | | | | | | | | | | | | | |和#39--------' '--------' '--------'
设计md——详细了解littlefs的工作原理。我建议读一下,因为工作中的权衡是很有趣的。
SPEC.md——littlefs的磁盘规格,包括所有不完整的细节。可能对工具开发有用。
littlefs附带了一个测试套件,可以使用bd目录中的模拟块设备在PC上运行。测试假设为Linux环境,可以使用make启动:
littlefs是根据BSD-3条款许可证提供的。见许可证。md了解更多信息。对本项目的贡献在同一许可下被接受。
这使机器能够根据此处提供的SPDXLicense标识符处理许可证信息:http://spdx.org/licenses/
littlefs fuse-用于littlefs的保险丝包装。该项目允许您直接在Linux机器上安装littlefs。如果你手边有SD卡,这对调试小文件很有用。
littlefs js——littlefs的javascript包装。我';我不知道你为什么想要这个,但它对演示很方便。你可以在这里看到它的作用。
littlefs python——littlefs的python包装。该项目允许您在PC上创建文件系统的映像。检查littlefs是否符合您的需要,创建映像以便稍后下载到目标内存,或者检查目标内存的二进制映像的内容。
mklfs——一个由Lua RTOS人员构建的命令行工具,用于从主机PC生成Littlefs图像。支持Windows、Mac OS和Linux。
Mbed操作系统——开始使用littlefs最简单的方法是跳转到Mbed,它已经为大多数形式的嵌入式存储提供了块设备驱动程序。littlefs在Mbed操作系统中作为LittleFileSystem类提供。
SPIFFS是NOR flash的另一个优秀的嵌入式文件系统。作为一个更传统的日志文件系统,SPIFFS具有完全的静态磨损均衡功能,在小型内存(如Microcontrollers上的内部闪存)方面,它的性能可能会优于littlefs。
Dhara-一个有趣的NAND闪存转换层,专为SmallMCU设计。它只在每个块和RAM中存储一个固定的O(|地址|)指针结构,提供静态磨损均衡和电源恢复能力。