小型文件系統(littlefs)
概述
一個為微控制器設計的小故障安全文件系統。
-
掉電恢復能力: 設計用於處理隨機電源故障。所有文件操作都有很強的寫時拷貝保證,如果斷電,文件系統將恢復到上一次已知的良好狀態。
-
動態磨損均衡: 設計考慮到閃存,並提供動態塊磨損均衡。此外,littlefs可以檢測壞塊並在它們周圍工作。
-
有限RAM/ROM: 被設計為使用少量內存。RAM的使用是嚴格限制的,這意味着RAM的使用不會隨着文件系統的增長而改變。文件系統不包含無界遞歸,動態內存僅限於可靜態提供的可配置緩沖區。
在lfs.h的評論中可以找到詳細的文檔(或者至少是目前可用的盡可能多的細節)。 littlefs采用了一種配置結構,定義了文件系統的運行方式。配置結構為文件系統提供了塊設備操作和維度、可調整的參數(用於在性能上權衡內存使用情況)以及可選的靜態緩沖區(如果用戶希望避免動態內存)。 littlefs的狀態存儲在lfs\t類型中,由用戶分配,允許同時使用多個文件系統。使用lfs\u t和configuration struct,用戶可以格式化塊設備或掛載文件系統。 掛載后,littlefs提供了一整套類似POSIX的文件和目錄功能,但文件系統結構的分配必須由用戶提供。 所有POSIX操作,比如remove和rename,都是原子的,即使在斷電的情況下也是如此。此外,在對文件調用sync或close之前,文件更新實際上不會提交到文件系統。
組件安裝
yoc init
yoc install littlefs
配置
// Maximum name size in bytes, may be redefined to reduce the size of the // info struct. Limited to <= 1022. Stored in superblock and must be // respected by other littlefs drivers. #define LFS_NAME_MAX 255 // Maximum size of a file in bytes, may be redefined to limit to support other // drivers. Limited on disk to <= 4294967296. However, above 2147483647 the // functions lfs_file_seek, lfs_file_size, and lfs_file_tell will return // incorrect values due to using signed integers. Stored in superblock and // must be respected by other littlefs drivers. #define LFS_FILE_MAX 2147483647 // Maximum size of custom attributes in bytes, may be redefined, but there is // no real benefit to using a smaller LFS_ATTR_MAX. Limited to <= 1022. #define LFS_ATTR_MAX 1022
接口列表
littlefs接口如下所示:
| 函數 | 說明 |
|---|---|
| lfs_format | 用littlefs格式化塊設備 |
| lfs_mount | 掛載文件系統 |
| lfs_unmount | 卸載文件系統 |
| lfs_remove | 刪除文件系統 |
| lfs_rename | 重命名或移動文件或目錄 |
| lfs_stat | 查找有關文件或目錄的信息 |
| lfs_fstat | 查找有關文件的信息 |
| lfs_getattr | 獲取自定義屬性 |
| lfs_setattr | 設置自定義屬性 |
| lfs_removeattr | 刪除自定義屬性 |
| lfs_file_open | 打開一個文件 |
| lfs_file_opencfg | 打開具有額外配置的文件 |
| lfs_file_close | 關閉文件 |
| lfs_file_sync | 同步存儲上的文件 |
| lfs_file_read | 從文件讀取數據 |
| lfs_file_write | 將數據寫入文件 |
| lfs_file_seek | 更改文件的位置 |
| lfs_file_truncate | 將文件的大小截斷為指定的大小 |
| lfs_file_tell | 返回文件的位置 |
| lfs_file_rewind | 將文件的位置更改為文件的開頭 |
| lfs_file_size | 返回文件的大小 |
| lfs_mkdir | 創建目錄 |
| lfs_dir_open | 打開目錄 |
| lfs_dir_close | 關閉目錄 |
| lfs_dir_read | 讀取目錄中的條目 |
| lfs_dir_seek | 更改目錄的位置 |
| lfs_dir_tell | 返回目錄的位置 |
| lfs_dir_rewind | 將目錄的位置更改為目錄的開頭 |
| lfs_fs_size | 查找文件系統的當前大小 |
| lfs_fs_traverse | 遍歷文件系統正在使用的所有塊 |
| lfs_migrate | 嘗試遷移以前版本的littlefs |
| 函數 | 說明 |
|---|---|
| lfs_format | 用littlefs格式化塊設備 |
| lfs_mount | 掛載文件系統 |
| lfs_unmount | 卸載文件系統 |
| lfs_remove | 刪除文件系統 |
| lfs_rename | 重命名或移動文件或目錄 |
| lfs_stat | 查找有關文件或目錄的信息 |
| lfs_fstat | 查找有關文件的信息 |
| lfs_getattr | 獲取自定義屬性 |
| lfs_setattr | 設置自定義屬性 |
| lfs_removeattr | 刪除自定義屬性 |
| lfs_file_open | 打開一個文件 |
| lfs_file_opencfg | 打開具有額外配置的文件 |
| lfs_file_close | 關閉文件 |
| lfs_file_sync | 同步存儲上的文件 |
| lfs_file_read | 從文件讀取數據 |
| lfs_file_write | 將數據寫入文件 |
| lfs_file_seek | 更改文件的位置 |
| lfs_file_truncate | 將文件的大小截斷為指定的大小 |
| lfs_file_tell | 返回文件的位置 |
| lfs_file_rewind | 將文件的位置更改為文件的開頭 |
| lfs_file_size | 返回文件的大小 |
| lfs_mkdir | 創建目錄 |
| lfs_dir_open | 打開目錄 |
| lfs_dir_close | 關閉目錄 |
| lfs_dir_read | 讀取目錄中的條目 |
| lfs_dir_seek | 更改目錄的位置 |
| lfs_dir_tell | 返回目錄的位置 |
| lfs_dir_rewind | 將目錄的位置更改為目錄的開頭 |
| lfs_fs_size | 查找文件系統的當前大小 |
| lfs_fs_traverse | 遍歷文件系統正在使用的所有塊 |
| lfs_migrate |
接口詳細說明
枚舉定義
lfs_type
| 類型 | 說明 |
|---|---|
| LFS_TYPE_REG | file types |
| LFS_TYPE_DIR | file types |
| LFS_TYPE_SPLICE | internally used types |
| LFS_TYPE_NAME | internally used types |
| LFS_TYPE_STRUCT | internally used types |
| LFS_TYPE_USERATTR | internally used types |
| LFS_TYPE_FROM | internally used types |
| LFS_TYPE_TAIL | internally used types |
| LFS_TYPE_GLOBALS | internally used types |
| LFS_TYPE_CRC | internally used types |
| LFS_TYPE_CREATE | internally used type specializations |
| LFS_TYPE_DELETE | internally used type specializations |
| LFS_TYPE_SUPERBLOCK | internally used type specializations |
| LFS_TYPE_DIRSTRUCT | internally used type specializations |
| LFS_TYPE_CTZSTRUCT | internally used type specializations |
| LFS_TYPE_INLINESTRUCT | internally used type specializations |
| LFS_TYPE_SOFTTAIL | internally used type specializations |
| LFS_TYPE_HARDTAIL | internally used type specializations |
| LFS_TYPE_MOVESTATE | internally used type specializations |
| LFS_FROM_NOOP | internal chip sources |
| LFS_FROM_MOVE | internal chip sources |
| LFS_FROM_USERATTRS | internal chip sources |
lfs_open_flags
| 類型 | 說明 |
|---|---|
| LFS_O_RDONLY | Open a file as read only |
| LFS_O_WRONLY | Open a file as write only |
| LFS_O_RDWR | Open a file as read and write |
| LFS_O_CREAT | Create a file if it does not exist |
| LFS_O_EXCL | Fail if a file already exists |
| LFS_O_TRUNC | Truncate the existing file to zero size |
| LFS_O_APPEND | Move to end of file on every write |
| LFS_F_DIRTY | File does not match storage |
| LFS_F_WRITING | File has been written since last flush |
| LFS_F_READING | File has been read since last flush |
| LFS_F_ERRED | An error occured during write |
| LFS_F_INLINE | Currently inlined in directory entry |
| LFS_F_OPENED | File has been opened |
lfs_whence_flags
| 類型 | 說明 |
|---|---|
| LFS_SEEK_SET | Seek relative to an absolute position |
| LFS_SEEK_CUR | Seek relative to the current file position |
| LFS_SEEK_END | Seek relative to the end of the file |
結構體定義
lfs_config
| 成員 | 類型 | 說明 |
|---|---|---|
| context | void* | 傳遞給block驅動代碼的上下文 |
| read | int32_t | 從設備讀數據 |
| prog | int32_t | 向設備寫入數據,block設備在寫入前必須已經erase了 |
| erase | int32_t | 擦除block |
| sync | int32_t | sync塊設備的狀態 |
| read_size | lfs_size_t | 最小的讀取單元大小 |
| prog_size | lfs_size_t | 最小的寫入數據單元大小,也是數據metadata pair中tag的對齊尺寸 |
| block_size | lfs_size_t | 最小的擦除單元大小。可以比flash的實際block尺寸大。但是對於ctz類型的文件,block size是最小的分配單元。同時block size必須是read size和program size的倍數,block size會存儲在superblock中 |
| block_count | lfs_size_t | 屬於文件系統的block數量,block count會存儲在superblock中 |
| block_cycles | int32_t | 文件系統進行垃圾回收時的block的擦除次數,推薦取值100-1000.值越大垃圾回收的次數越少,性能越好 |
| cache_size | lfs_size_t | littlefs需要一個read cache,一個program cache,每個文件也需要一個cache。cache越大性能越好,會減少會flash的訪問次數,cache必須是block的read size和program size的倍數,同時是block size的因數 |
| lookahead_size | lfs_size_t | lookahead buffer的尺寸。lookahead buffer主要是block alloctor在分配塊的時候用到。lookahead size必須是8的倍數,因為它是采用bitmap的形式存儲的 |
| read_buffer | void* | cache size大小的read buffer,可以靜態分配也可以動態分配 |
| prog_buffer | void* | cache size大小的program buffer,可以靜態分配也可以動態分配 |
| lookahead_buffer | void* | lookahead_size大小的lookahead buffer,且是32-bit對齊的,即可以靜態分配也可以動態分配 |
| name_max | lfs_size_t | 文件名的最大長度,這個值會存儲在superblock中 |
| file_max | lfs_size_t | 文件的最大長度,存儲在superblock中 |
| attr_max | lfs_size_t | 用戶屬性的最大長度 |
lfs_info
| 成員 | 類型 | 說明 |
|---|---|---|
| type | uint8_t | 文件類型, either LFS_TYPE_REG or LFS_TYPE_DIR |
| size | lfs_size_t | 文件大小, only valid for REG files,Limited to 32-bits |
| name | char | 文件名 |
lfs_attr
| 成員 | 類型 | 說明 |
|---|---|---|
| type | uint8_t | 8位屬性類型,由用戶提供,用於標識屬性 |
| buffer | void* | 指向包含屬性的緩沖區的指針 |
| size | lfs_size_t | 以字節為單位的屬性大小,限制為LFS_ATTR_MAX |
lfs_file_config
| 成員 | 類型 | 說明 |
|---|---|---|
| buffer | void* | cache size長度的buffer,可以靜態分配也可以動態分配 |
| attrs | struct lfs_attr* | 用戶屬性,讀文件時,attr存儲從flash上讀取的文件用戶屬性,寫入文件時,attr存放用戶指定的文件屬性並會寫入到flash中 |
| attr_count | lfs_size_t | 用戶屬性的長度 |
lfs_cache_t
| 成員 | 類型 | 說明 |
|---|---|---|
| block | lfs_block_t | cache中的數據屬於的block |
| off | lfs_off_t | cache中的數據在block上的偏移地址 |
| size | lfs_size_t | cache的大小 |
| buffer | uint8_t* | cache數據的存放地址 |
lfs_mdir_t
| 成員 | 類型 | 說明 |
|---|---|---|
| pair | lfs_block_t | dir的metadata pair所在的block |
| rev | uint32_t | metadata pair的revision |
| off | lfs_off_t | tag的偏移地址 |
| etag | uint32_t | tag標志 |
| count | uint16_t | 計數 |
| erased | bool | 擦除標志 |
| split | bool | metadata pair是否是鏈表 |
| tail | lfs_block_t | 用於metadata pair的鏈表 |
lfs_dir_t
| 成員 | 類型 | 說明 |
|---|---|---|
| next | struct lfs_dir* | 指向下一個結點 |
| id | uint16_t | 編號 |
| type | uint8_t | 類型 |
| m | lfs_mdir_t | 目錄 |
| pos | lfs_off_t | 位置 |
| head | lfs_block_t | 塊頭內容 |
lfs_ctz
| 成員 | 類型 | 說明 |
|---|---|---|
| head | lfs_block_t | 當前塊頭指針地址 |
| size | lfs_size_t | 塊大小 |
lfs_file_t
| 成員 | 類型 | 說明 |
|---|---|---|
| next | struct lfs_file* | 指向下一個節點 |
| id | uint16_t | metadata tag中的id,在文件open時獲取 |
| type | uint8_t | LFS_TYPE_REG 或者 LFS_TYPE_DIR |
| m | lfs_mdir_t | 文件所在的目錄的metadata pair |
| ctz | struct lfs_ctz | 指向大文件的CTZ skip-list。對於小文件則直接inline了,無需CTZ skip-list |
| flags | uint32_t | lfs_open_flags中的值 |
| pos | lfs_off_t | 文件訪問時的偏移 |
| block | lfs_block_t | file當前的block |
| off | lfs_off_t | 在block內的offset |
| cache | lfs_cache_t | 文件訪問時的cache |
| cfg | const struct lfs_file_config* | 文件open時的配置參數,包含一個buffer以及用戶屬性 |
lfs_superblock_t
| 成員 | 類型 | 說明 |
|---|---|---|
| version | uint32_t | 版本內容 |
| block_size | lfs_size_t | 塊大小 |
| block_count | lfs_size_t | 塊計數 |
| name_max | lfs_size_t | 名稱最大長度 |
| file_max | lfs_size_t | 文件最大長度 |
| attr_max | lfs_size_t | 屬性最大長度 |
lfs_t
| 成員 | 類型 | 說明 |
|---|---|---|
| rcache | lfs_cache_t | 讀緩存 |
| pcache | lfs_cache_t | 程序緩存 |
| root | lfs_block_t | 根目錄所在塊 |
| mlist | struct lfs_mlist* | 元數據對鏈表 |
| seed | uint32_t | block alloctor的隨機數生成的種子 |
| gstate | struct lfs_gstate | 用於目錄操作sync的global state |
| gpending | struct lfs_gstate | 用於目錄操作sync的global pending |
| gdelta | struct lfs_gstate | 用於目錄操作sync的global delta |
| free | struct lfs_free | lookahead buffer,用於分配free block |
| cfg | const struct lfs_config* | 文件系統的配置參數 |
| name_max | lfs_size_t | 文件名的最大長度,和superblock中的name_max值相同 |
| file_max | lfs_size_t | 文件的最大長度,和superblock中的file_max值相同 |
| attr_max | lfs_size_t | 用戶屬性的最大長度,和superblock中的attr_max值相同 |
| lfs1 | struct lfs1* | 結構體 |
接口的具體形式如下:
lfs_format
int lfs_format(lfs_t *lfs, const struct lfs_config *config);
-
功能描述:
- 用littlefs格式化塊設備。
-
參數:
lfs: 文件系統句柄。config: 配置參數結構體。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_mount
int lfs_mount(lfs_t *lfs, const struct lfs_config *config);
-
功能描述:
- 掛載文件系統。
-
參數:
lfs: 文件系統句柄。config: 配置參數。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_unmount
int lfs_unmount(lfs_t *lfs);
-
功能描述:
- 卸載文件系統。
-
參數:
lfs: 文件系統句柄。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_remove
int lfs_remove(lfs_t *lfs, const char *path);
-
功能描述:
- 刪除文件或目錄。
-
參數:
lfs: 文件系統句柄。path: 路徑。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_rename
int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath);
-
功能描述:
- 重命名或移動文件或目錄。
-
參數:
lfs: 文件系統句柄。oldpath: 原路徑。newpath: 新路徑。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_stat
int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info);
-
功能描述:
- 查找有關文件或目錄的信息。
-
參數:
lfs: 文件系統句柄。path: 路徑。info: 信息。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_fstat
int lfs_fstat(lfs_t *lfs, lfs_file_t *file, struct lfs_info *info);
-
功能描述:
- 查找有關文件的信息。
-
參數:
lfs: 文件系統句柄。file: 文件。info: 信息。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_getattr
lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, uint8_t type, void *buffer, lfs_size_t size);
-
功能描述:
- 獲取自定義屬性。
-
參數:
lfs: 文件系統句柄。path: 路徑。type: 文件類型。buffer: 緩沖區的指針。size: 文件大小。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_setattr
int lfs_setattr(lfs_t *lfs, const char *path, uint8_t type, const void *buffer, lfs_size_t size);
-
功能描述:
- 設置自定義屬性。
-
參數:
lfs: 文件系統句柄。path: 路徑。type: 文件類型。buffer: 緩沖區的指針。size: 文件大小。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_removeattr
int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type);
-
功能描述:
- 刪除自定義屬性。
-
參數:
lfs: 文件系統句柄。path: 路徑。type: 文件類型。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_open
int lfs_file_open(lfs_t *lfs, lfs_file_t *file, const char *path, int flags);
-
功能描述:
- 打開一個文件。
-
參數:
lfs: 文件系統句柄。file: 文件。path: 路徑。flags: 文件標志。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_opencfg
int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, const char *path, int flags, const struct lfs_file_config *config);
-
功能描述:
- 打開具有額外配置的文件。
-
參數:
lfs: 文件系統句柄。file: 文件。path: 路徑。flags: 標志。config: 配置參數。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_close
int lfs_file_close(lfs_t *lfs, lfs_file_t *file);
-
功能描述:
- 關閉文件。
-
參數:
lfs: 文件系統句柄。file: 文件。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_sync
int lfs_file_sync(lfs_t *lfs, lfs_file_t *file);
-
功能描述:
- 同步存儲上的文件。
-
參數:
lfs: 文件系統句柄。file: 文件。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_read
lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, void *buffer, lfs_size_t size);
-
功能描述:
- 從文件讀取數據。
-
參數:
lfs: 文件系統句柄。file: 文件。buffer: 讀出的數據緩存。size: 讀出的數據大小。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_write
lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, const void *buffer, lfs_size_t size);
-
功能描述:
- 將數據寫入文件。
-
參數:
lfs: 文件系統句柄。file: 文件。buffer: 寫入數據的緩存。size: 寫入數據大小。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_seek
lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, lfs_soff_t off, int whence);
-
功能描述:
- 更改文件的位置。
-
參數:
lfs: 文件系統句柄。file: 文件。off: 偏移量。whence: 位置標志。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_truncate
int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size);
-
功能描述:
- 將文件的大小截斷為指定的大小。
-
參數:
lfs: 文件系統句柄。file: 文件。size: 文件大小。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_tell
lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file);
-
功能描述:
- 返回文件的位置。
-
參數:
lfs: 文件系統句柄。file: 文件。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_rewind
int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file);
-
功能描述:
- 將文件的位置更改為文件的開頭。
-
參數:
lfs: 文件系統句柄。file: 文件。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_file_size
lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file);
-
功能描述:
- 返回文件的大小。
-
參數:
lfs: 文件系統句柄。file: 文件。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_mkdir
int lfs_mkdir(lfs_t *lfs, const char *path);
-
功能描述:
- 創建目錄。
-
參數:
lfs: 文件系統句柄。path: 路徑。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_open
int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path);
-
功能描述:
- 打開目錄。
-
參數:
lfs: 文件系統句柄。dir: 目錄。path: 路徑。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_close
int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir);
-
功能描述:
- 關閉目錄。
-
參數:
lfs: 文件系統句柄。dir: 目錄。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_read
int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info);
-
功能描述:
- 讀取目錄中的條目。
-
參數:
lfs: 文件系統句柄。dir: 目錄。info: 信息。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_seek
int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off);
-
功能描述:
- 更改目錄的位置。
-
參數:
lfs: 文件系統句柄。dir: 目錄。off: 偏移量。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_tell
lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir);
-
功能描述:
- 返回目錄的位置。
-
參數:
lfs: 文件系統句柄。dir: 目錄。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_dir_rewind
int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir);
-
功能描述:
- 將目錄的位置更改為目錄的開頭。
-
參數:
lfs: 文件系統句柄。dir: 目錄。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_fs_size
lfs_ssize_t lfs_fs_size(lfs_t *lfs);
-
功能描述:
- 查找文件系統的當前大小。
-
參數:
lfs: 文件系統句柄。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_fs_traverse
int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data);
-
功能描述:
- 遍歷文件系統正在使用的所有塊。
-
參數:
lfs: 文件系統句柄。cb: 回調。data: 數據。
-
返回值:
- 0: 成功 。
- <0: 失敗。
lfs_migrate
int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg);
-
功能描述:
- 嘗試遷移以前版本的littlefs。
-
參數:
lfs: 文件系統句柄。cfg: 配置信息。
-
返回值:
- 0: 成功 。
- <0: 失敗。
示例
Here's a simple example that updates a file named boot_count every time main runs. The program can be interrupted at any time without losing track of how many times it has been booted and without corrupting the filesystem:
#include "lfs.h" // variables used by the filesystem lfs_t lfs; lfs_file_t file; // configuration of the filesystem is provided by this struct const struct lfs_config cfg = { // block device operations .read = user_provided_block_device_read, .prog = user_provided_block_device_prog, .erase = user_provided_block_device_erase, .sync = user_provided_block_device_sync, // block device configuration .read_size = 16, .prog_size = 16, .block_size = 4096, .block_count = 128, .cache_size = 16, .lookahead_size = 16, .block_cycles = 500, }; // entry point int main(void) { // mount the filesystem int err = lfs_mount(&lfs, &cfg); // reformat if we can't mount the filesystem // this should only happen on the first boot if (err) { lfs_format(&lfs, &cfg); lfs_mount(&lfs, &cfg); } // read current count uint32_t boot_count = 0; lfs_file_open(&lfs, &file, "boot_count", LFS_O_RDWR | LFS_O_CREAT); lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count)); // update boot count boot_count += 1; lfs_file_rewind(&lfs, &file); lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count)); // remember the storage is not updated until the file is closed successfully lfs_file_close(&lfs, &file); // release any resources we were using lfs_unmount(&lfs); 