1. 文件系统(File Systems)

Zephyr RTOS 的虚拟文件系统开关允许应用程序在不同的挂载点(如:/fatfs 和 /nffs)挂载多个文件系统。挂载点数据结构包含实例化、挂载和操作文件系统所需的所有必要的信息。文件系统开关通过引入文件系统注册机制,将应用程序从直接访问一个文件系统指定的 API 或内部函数分离开。

在 Zephyr 中,任何文件系统的实现或库可以通过一个文件系统注册 API 插入或拔出。

int fs_register(enum fs_type type, struct fs_file_system_t *fs);
int fs_unregister(enum fs_type type, struct fs_file_system_t *fs);

Zephyr RTOS 通过使用挂载点作为磁盘卷名来支持一个文件系统的多个实例,文件系统库在格式化或挂载到一个磁盘时使用这个卷名。

文件系统的声明如下:

static struct fs_mount_t mp = {.type = FS_FATFS,                    // FS_FATFS:文件系统的类型,例如:FATFS 或 NFFS。.mnt_point = FATFS_MNTP,       // FATFS_MNTP:文件系统的挂载点。.fs_data = &fat_fs,                  // fat_fs:将被 fs_mount( ) API 使用的文件系统数据。
};

2. 已知限制(Known Limitations)

由于库内部实现的限制,NFFS 只支持文件系统的一个实例。

3. 示例(Sample)

在 samples/subsys/fs 中提供了如何使用文件系统的示例。

4. API 参考(API Reference)

4.1. 定义(Defines)

  • FS_SEEK_SET
  • FS_SEEK_CUR
  • FS_SEEK_END

4.2. 枚举(Enums)

  • enum fs_dir_entry_type
    值:
    FS_DIR_ENTRY_FILE = 0
    FS_DIR_ENTRY_DIR

  • enum fs_type
    值:
    FS_FATFS = 0
    FS_NFFS
    FS_TYPE_END

4.3. 函数(Functions)

  • int fs_open(struct fs_file_t * zfp, const char * file_name)
    打开文件。
    打开一个已存在文件或创建一个新的文件,并将一个流与其关联。
    参数:

    • zfp:指向文件对象的指针。
    • file_name:要打开的文件名。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_close(struct fs_file_t * zfp)
    关闭文件。
    刷新关联的流,并关闭文件。
    参数:

    • zfp:指向文件对象的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • fs_unlink(const char * path)
    删除文件链接(File unlink)。
    删除指定的文件或目录。
    参数:

    • path:要删除的文件或目录的路径。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_rename(const char * from, const char * to)
    文件或目录重命名。
    执行指定源路径的重命名和或移动到指定的目的地。源路径可以引用文件或目录。目标路径中的所有中间目录必须已经存在。如果源路径引用文件,则目标路径必须包含完整的文件名路径,而不仅仅是新的父目录。如果一个对象已经在指定的目标路径上存在,这个函数会在重命名之前将其删除链接(即:目标被损毁(the destination gets clobbered))。
    参数:

    • from:源路径。
    • to:目的路径。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • ssize_t fs_read(struct fs_file_t * zfp, void * ptr, size_t size)
    读文件。
    返回:读取的字节数。如果成功,读取的字节数将等于要求读取的字节数。如果文件中没有足够的有效字节数,将返回少于要求读取的字节数。发生错误时将返回 -ERRNO
    参数:

    • zfp:指向文件对象的指针。
    • ptr:指向数据缓存区的指针。
    • size:要求读取的字节数。
  • ssize_t fs_write(struct fs_file_t * zfp, const void * ptr, size_t size)
    写文件。
    返回:写入的字节数。如果成功,写入的字节数将等于要求写入的字节数。其它任何值都表示出错。错误时将返回 -ERRNO。在返回 -ERRNO 的情况下,由于无法启动操作,文件指针将不会被提前(will not be advanced)。如果它能够写入,但不能写入所有要求的字节数,这是因为磁盘已经满了。这种情况下,它将返回少于要求写入的字节数,但不像常规错误那样返回 -ERRNO
    参数:

    • zfp:指向文件对象的指针。
    • ptr:指向数据缓存区的指针。
    • size:要求写入的字节数。
  • int fs_seek(struct fs_file_t * zfp, off_t offset, int whence)
    偏移文件。
    将文件位置移动到文件中的新位置。偏移量是基于 whence 增加到新位置的。
    参数:

    • zfp:指向文件对象的指针。
    • offset:要将文件指针移动的相对偏移。
    • whence:计算偏移量的相对位置。
      • FS_SEEK_SET:从文件起始处开始偏移。
      • FS_SEEK_CUR:从当前位置开始偏移。
      • FS_SEEK_END:从文件结尾开始偏移。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • off_t fs_tell(struct fs_file_t * zfp)
    获取文件的当前位置。
    参数:

    • zfp:指向文件对象的指针。

    返回值:

    • position:文件当前的位置,当前修订不验证文件对象(Current position in file Current revision does not validate the file object)。
  • int fs_truncate(struct fs_file_t * zfp, off_t length)
    更改打开文件的大小。
    如果文件的新长度小于当前文件的大小,则将其截断为新的长度。如果文件的新长度大于当前文件的大小,则将其扩张为新的长度。扩张后的区域填充 0。
    Note:在扩张的情况下,如果在扩张时卷已经被填满了,则函数扩张到最大可能的长度并返回成功。调用者应检查扩张的长度与要求的长度是否一致。
    参数:

    • zfp:指向文件对象的指针。
    • length:文件的新长度。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_sync(struct fs_file_t * zfp)
    刷新打开文件的写缓存。
    该函数可以用于刷新打开文件的缓存。可以调用该函数来确保数据立刻写入到存储介质。这样做可能是为了避免在意外断电时丢失数据。**注意,关闭文件时会进行刷新缓存,因此如果文件正在关闭,则不需要调用该函数。

    参数:

    • zfp:指向文件对象的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_mkdir(const char * path)
    创建目录。
    使用指定路径创建一个新目录。
    参数:

    • path:要创建新目录的路径。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_opendir(struct fs_dir_t * zdp, const char * path)
    打开目录。
    使用指定路径打开一个已存在的目录。
    参数:

    • zdp:指向目录对象的指针。
    • path:要打开新目录的路径。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_readdir(struct fs_dir_t * zdp, struct fs_dirent * entry)
    读取目录。
    读取打开目录的目录项。
    返回:在目录末尾(In end-of-dir)的情况下,将返回 0 并设置 entry->name[0] = 0
    参数:

    • zdp:指向目录对象的指针。
    • entry:指向要读取目录项的存放的结构体 zfs_dirent 的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_closedir(struct fs_dir_t * zdp)
    关闭目录。
    关闭一个打开的目录。
    参数:

    • zdp:指向目录对象的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_mount(struct fs_mount_t * mp)
    挂载文件系统。
    执行挂载文件系统所需的步骤,如调用文件系统指定挂载函数并将挂载点挂载到文件系统列表中。
    参数:

    • mp:指向结构体 fs_mount_t的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_unmount(struct fs_mount_t * mp)
    卸载文件系统。
    执行卸载文件系统所需的步骤,如调用文件系统指定卸载函数并将挂载点从文件系统列表中移除。
    参数:

    • mp:指向结构体 fs_mount_t的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_stat(const char * path, struct fs_dirent * entry)
    文件或目录的状态。
    检查指定路径的文件或目录的状态。
    参数:

    • path:文件或目录的路径。
    • entry:指向结构体 zfs_dirent 的指针,如果文件或目录存在时则填充该结构体。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_statvfs(const char * path, struct fs_statvfs * stat)
    检索文件系统卷的统计信息。
    返回文件系统卷中总的可用空间。
    参数:

    • path:挂载目录的路径。
    • stat:指向结构体 zfs_statvfs 的指针,用于接收文件系统的统计信息。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_register(enum fs_type type, struct fs_file_system_t * fs)
    注册一个文件系统。
    用虚拟文件系统注册文件系统。
    参数:

    • type:文件系统的类型(如:FS_FATFS)
    • fs:指向文件系统的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。
  • int fs_unregister(enum fs_type type, struct fs_file_system_t * fs)
    注销文件系统。
    用虚拟文件系统注销文件系统。
    参数:

    • type:文件系统的类型(如:FS_FATFS)
    • fs:指向文件系统的指针。

    返回值:

    • 0:成功。
    • -ERRNO:错误代码。

4.4. 结构体(struct)

  • struct fs_mount_t
    文件系统挂载信息结构体。#include <fs.h>
    成员:

    • nodefs_mount_list 列表的入口。
    • type:文件系统的类型。
    • mnt_point:挂载点目录名称(如:“/fatfs”)
    • fs_data:指向文件系统特定数据的指针。
    • storage_dev:指向后端存储设备的指针。
    • mountp_len:挂载点字符串的长度。
    • fs:指向挂载点文件系统接口的指针。
  • struct fs_dirent
    结构体用于接收文件或目录信息。#include <fs.h>
    用于读取目录项以获取文件或目录信息的函数中。
    成员:

    • dir_entry_type:文件或目录。

      • FS_DIR_ENTRY_FILE
      • FS_DIR_ENTRY_DIR
    • name:文件或目录的名称。
    • size:文件的大小。如果是目录则为 0。
  • struct fs_statvfs
    结构体用于接收卷的统计信息。
    用于检索卷中总的可用空间信息。
    成员:

    • f_bsize:最优传递块大小。
    • f_frsize:分配单位大小。
    • f_blocks:FS 以 f_frsize 为单位的大小。
    • f_bfree:空闲块的个数。
  • struct fs_file_system_t
    文件系统接口结构体。 #include <fs.h>
    成员:

    • open:打开一个已存在的文件或创建一个新的文件。
    • read:读取数据项的数字节。
    • write:写入数字节到数据项。
    • lseek:将文件位置移动到文件中的新位置。
    • tell:检索在文件中的当前位置。
    • truncate:截短文件到新长度。
    • sync:刷新打开文件的缓存。
    • close:刷新相关流并关闭文件。
    • opendir:通过指定路径打开已存在的目录。
    • readdir:读取打开目录的目录项。
    • closedir:关闭一个打开的目录。
    • mount:挂载一个文件系统。
    • unmount:卸载一个文件系统。
    • unlik:删除指定的文件或目录。
    • rename:文件或目录重命名。
    • mkdir:使用指定路径创建一个新的目录。
    • stat:通过指定路径检查文件或目录的状态。
    • statvfs:返回文件系统卷中总的可用空间。

Zephyr_FileSystems相关推荐

最新文章

  1. 文件系统的两种文件索引模式extent和blockmap
  2. python numpy模块
  3. MyBatis中提示:元素类型为 mapper 的内容必须匹配 (cache-ref|cache|resultMap*|parameterMap*|sql*|insert*|update*|de
  4. XCTF WEB webshell
  5. JavaWeb学习总结(五十)——文件上传和下载
  6. raid卡缓存对硬盘性能_Mac Pro 2019加装2.5英寸机械硬盘方案
  7. ES6_字符串模板以及其使用
  8. HDU 5157(回文树)
  9. java命令javac java,使用命令行JAVAC编译Java
  10. ES6 class关键字 ~ 非常详细
  11. Java新职篇:使用程序块
  12. JAVA日志框架概述
  13. 安卓仿苹果键盘输入法_苹果手机键盘背景图 安卓仿iphone输入法
  14. 能当「公务员」、服务员,商用服务机器人今年为啥这么火?
  15. H264 YUV420视频翻转
  16. 用ipv6校园网访问gg学术
  17. 斜挎包长度到哪里合适_斜挎包背带一般多长 斜挎包背带太长怎么办
  18. 搜索引擎使用的10个技巧
  19. 三位数除以两位数竖式计算没有余数_四年级上册数学三位数除两位数练习题没有余数...
  20. 压力位和支撑位的理解。

热门文章

  1. “不敢冒险就不是硅谷的企业”
  2. 国内各大IT公司经典面试题集锦
  3. 诺基亚7.2 刷入第三方ROM
  4. Python之使用LRU缓存策略进行缓存
  5. SVD和Kmeans做 《贝加尔湖畔》图片特征抽取压缩的比较
  6. 【宏观经济学】01-GDP乘数效应
  7. saltstack 的安装
  8. 使用双缓冲技术可轻松消除闪烁
  9. 废除闰秒真的有必要吗?不废除会有哪些影响?
  10. 都说Dapper性能好,突然就遇到个坑,还是个性能问题