LittleFS:嵌入式文件系统代码示例及详解

发布时间:2026/6/9 5:15:38

LittleFS:嵌入式文件系统代码示例及详解 1、介绍当前移植使用基于BW20的SDK的2.5.0版本为例。LittleFS 由ARM官方发布ARM mbedOS的官方推荐文件系统具有轻量级掉电安全读写均衡的特性。主要用在微控制器和flash上优点如下掉电恢复在写入时即使复位或者掉电也可以恢复到上一个正确的状态。擦写均衡有效延长flash的使用寿命。例如W25QXX系列的spi接口的flash擦写次数大概在10万次如果是操作flash比较频繁那么这10万次很快就会到达上限从而导致芯片废掉。有限的RAM/ROM相对于FATFS节省ROM和RAM空间缺点如下不兼容windows2.littleFS结构代码flash.c2. 变量定义2.1 lfs_t lfs;lfs_t是 LittleFS 的主结构体用于管理文件系统的实例。变量lfs保存文件系统的上下文信息例如挂载状态和文件操作的元数据。2.2 lfs_file_t file;lfs_file_t是 LittleFS 中的文件对象表示打开的文件。变量file用于操作具体的文件例如读写文件内容。2.3 struct lfs_config lfs_cfg;lfs_config是 LittleFS 的配置结构体包含所有初始化文件系统所需的参数。变量lfs_cfg保存配置信息例如读写函数、块大小、缓存大小等3. 配置参数解析3.1 函数指针这些函数指针定义了文件系统与底层存储设备交互的方法.read函数指针lfs_nor_read描述读取存储设备上的数据。用法LittleFS 在读取文件或目录时调用此函数。.prog函数指针lfs_nor_prog描述向存储设备写入数据。用法LittleFS 在保存文件或目录时调用此函数。.erase函数指针lfs_nor_erase描述擦除存储设备的一个块。用法在文件系统需要回收空间时调用。.sync函数指针lfs_diskio_sync描述同步数据确保缓存中的数据写入存储设备。用法在断电之前或写操作完成后调用。3.2 线程安全配置#ifdef LFS_THREADSAFE如果启用了线程安全选项通过定义LFS_THREADSAFE以下函数将被启用.lock函数指针lfs_diskio_lock描述在多线程环境中加锁以保护文件系统操作。.unlock函数指针lfs_diskio_unlock描述在多线程环境中解锁以恢复文件系统操作。3.3 存储设备参数.read_size 1描述每次读取操作的最小字节数单位字节。通常设置为存储设备的最小可读单元。.prog_size 1描述每次写入操作的最小字节数单位字节。通常设置为存储设备的最小可写单元。.block_size 4096描述每个存储块的大小单位字节。通常设置为存储设备的擦除单元大小。.block_count 32描述存储设备中的块数量。这个参数决定了文件系统的总容量 容量block_size×block_count4096×32128 KB\text{容量} \text{block\_size} \times \text{block\_count} 4096 \times 32 128\,\text{KB}容量block_size×block_count4096×32128KB.cache_size 256描述用于缓存读写操作的内存大小单位字节。较大的缓存可以提高性能但会占用更多 RAM。.lookahead_size 16描述用于文件系统分配空闲块的提前查找缓冲区大小单位字节。提高性能减少寻找空闲块时的消耗。.block_cycles 500描述每个块的可写入周期限制。LittleFS 会在块接近磨损极限时自动回收和重分配确保闪存寿命lfs_t lfs; lfs_file_t file; struct lfs_config lfs_cfg { .read lfs_nor_read, .prog lfs_nor_prog, .erase lfs_nor_erase, .sync lfs_diskio_sync, #ifdef LFS_THREADSAFE .lock lfs_diskio_lock, .unlock lfs_diskio_unlock, #endif .read_size 1, .prog_size 1, .block_size 4096, .block_count 32, .cache_size 256, .lookahead_size 16, .block_cycles 500, }; int write_wifi_data_to_lfs(wifidata_t *wifi_data) { int err; err lfs_file_open(lfs, file, wifi_data, LFS_O_WRONLY | LFS_O_CREAT); if (err 0) { printf(Error opening file for writing: %d\n, err); return err; } err lfs_file_write(lfs, file, wifi_data, sizeof(wifidata_t)); if (err 0) { printf(Error writing wifi_data to file: %d\n, err); lfs_file_close(lfs, file); return err; } else { printf(write lfs succ\n); } lfs_file_close(lfs, file); err lfs_diskio_sync(lfs_cfg); if (err 0) { printf(Error syncing filesystem: %d\n, err); return err; } return 0; } int read_wifi_data_from_lfs(wifidata_t *wifi_data) { int err; err lfs_file_open(lfs, file, wifi_data, LFS_O_RDONLY); if (err 0) { printf(Error opening file for reading: %d\n, err); return err; } err lfs_file_read(lfs, file, wifi_data, sizeof(wifidata_t)); if (err 0) { printf(Error reading wifi_data from file: %d\n, err); lfs_file_close(lfs, file); return err; } lfs_file_close(lfs, file); return 0; } void init_lfs(void) { int err lfs_mount(lfs, lfs_cfg); if (err) { printf(Failed to mount, formatting...\n); lfs_format(lfs, lfs_cfg); lfs_mount(lfs, lfs_cfg); } else { printf(init lfs success\n); } } void read_flash(void) { init_lfs(); if (read_wifi_data_from_lfs(wifi_data) 0) { printf(read flash\n); } else { printf(read NO data\n); } } void formatting(void) { int err lfs_format(lfs, lfs_cfg); if (err) { printf(Error formatting LFS: %d\n, err); return; } printf(formatting LFS success\n); } void init_flash(void) { init_lfs(); if (write_wifi_data_to_lfs(wifi_data) 0) { printf(Data written successfully\n); } if (read_wifi_data_from_lfs(wifi_data) 0) { printf(Data read successfully\n); } }

相关新闻