VFS与SPIFFS文件系统
这几天忙着搬砖,差点没时间更新博客了,所谓一日未脱贫,打工不能停,搬砖不狠,明天地位不稳呀。 不多说了,且看以下内容吧~
一、VFS虚拟文件系统
先来看下文件系统的定义,文件系统是操作系统中用于组织、管理和存储持久性数据的一个关键组件。它是方法和数据结构的集合,使操作系统能够有效地在存储设备(如硬盘驱动器、固态硬盘、USB闪存驱动器等)上存储、检索和管理文件。
文件系统通常由三个主要部分组成:
1)文件系统的接口:用户和应用程序与文件系统交互的方式。
2)对对象操纵和管理的软件集合:实现文件创建、删除、读取、写入、重命名等操作的系统软件。
3)对象及属性:实际存储的数据文件以及与之相关的元数据信息。
当我们使用标准文件操作时,比如我们使用fwrite(buffer,size,count,file)函数时,我们不用关心到底是写入到磁盘上哪个地址,偏移量是多少等等诸如此类的硬件底层问题,因为这些操作文件系统已经帮我们处理好了,我们只需要关注往哪个文件写入什么内容,从哪个文件读取什么内容即可,文件系统帮我们把这些文件有效的管理组织起来,形成包括文件和目录的层次结构。
在esp-idf中虚拟文件系统 (VFS) 组件为驱动程序提供一个统一接口,可以操作类文件对象。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是提供文件类接口的设备驱动程序。
VFS 组件支持 C 库函数(如 fopen 和 fprintf 等)与文件系统 (FS) 驱动程序协同工作。在高层级,每个 FS 驱动程序均与某些路径前缀相关联。当一个 C 库函数需要打开文件时,VFS 组件将搜索与该文件所在文件路径相关联的 FS 驱动程序,并将调用传递给该驱动程序。针对该文件的读取、写入等其他操作的调用也将传递给这个驱动程序。
例如,使用 /fat 前缀注册 FAT 文件系统驱动,之后即可调用 fopen("/fat/file.txt", "w")。之后,VFS 将调用FAT驱动的 open 函数,并将参数 /file.txt 和合适的打开模式传递给 open 函数;后续对返回的 FILE* 数据流调用C库函数也同样会传递给 FAT 驱动。
如需注册 FS 驱动程序,应用程序首先要定义一个 esp_vfs_t 结构体实例,并用指向 FS API 的函数指针填充它。
esp_vfs_t myfs = {
.flags = ESP_VFS_FLAG_DEFAULT,
.write = &myfs_write,
.open = &myfs_open,
.fstat = &myfs_fstat,
.close = &myfs_close,
.read = &myfs_read,
};
ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL));
在上述代码中需要用到 read、 write 或 read_p、 write_p,具体使用哪组函数由 FS 驱动程序 API 的声明方式决定。
示例 1:声明 API 函数时不带额外的上下文指针参数,即 FS 驱动程序为单例模式,此时使用 write
ssize_t myfs_write(int fd, const void * data, size_t size);
// In definition of esp_vfs_t:
.flags = ESP_VFS_FLAG_DEFAULT,
.write = &myfs_write,// ... other members initialized
// When registering FS, context pointer (third argument) is NULL:
ESP_ERROR_CHECK(esp_vfs_register("/data", &myfs, NULL));
示例 2:声明 API 函数时需要一个额外的上下文指针作为参数,即可支持多个 FS 驱动程序实例,此时使用 write_p
&n

最低0.47元/天 解锁文章
2391

被折叠的 条评论
为什么被折叠?



