⼩型⽂件系统(littlefs)
⼩型⽂件系统(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
write的返回值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_t8位属性类型,由⽤户提供,⽤于标识属性
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值相同
lfs1struct lfs1*结构体
接⼝的具体形式如下:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论