ESP32 之 ESP-IDF 教学(十四)——虚拟文件系统(VFS)

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录       _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

       确定

文章目录

  • 一、什么是虚拟文件系统(VFS)
  • 二、ESP32中的VFS
    • 1. 标准的VFS路径
      • (1)挂载点
      • (2)路径
    • 2. 文件描述符
    • 3. 标准IO流: `stdin`、`stdout`、`stderr`

一、什么是虚拟文件系统(VFS)

如果你曾经了解过Linux,那么你大概率听说过“Linux下一切皆文件”。你插入的一个U盘,移动硬盘,乃至打印机,音响在Linux中都会被当作“文件”。

这可能不太好理解,为什么我的设备被系统当作文件了呢。实际上,这些文件不一定是真实的文件,而是虚拟的。这就是VFS中“虚拟”的含义。

谈到虚拟文件系统,就不得不谈谈“抽象”一词的含义。
抽象(abstract),是指在众多不同的事物中,忽略个别的,非本质的属性而把统一的、本质的属性抽取出来形成概念。

例如上方的例子,无论是真实的储存文件的设备(如U盘,移动硬盘)还是其他的设备(如打印机)。他们的本质都是:① 可以作为计算机的外设;② 可以跟计算机交换数据。因此,Linux通过VFS把一切设备都抽象成一个统一的文件系统,从设备读取数据视为向“文件”读取数据,向设备发送数据视为写数据到“文件”。并且不同的“文件”之间读写方式相同

因此,Linux这时候不再需要关注这个设备具体读写方式的区别,而直接使用相同的高层操作完成与外设的数据交互。

因此,虚拟文件系统的作用是:使得计算机上层的软件,能够用单一的方式,来跟底层不同的文件系统沟通(无论是真实的文件系统还是虚拟的文件系统)。在操作系统与之下的各种文件系统之间,虚拟文件系统提供了标准的操作接口,将所有不同种类的文件系统统一起来。

二、ESP32中的VFS

ESP32 吸收了Linux VFS的理念,被设计了VFS。为一些驱动提供了统一的接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FATSPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。

ESP32的VFS支持fprintf fopen等标准C库函数,调用这个函数本质上就是对VFS的访问。并提供了“路径”“文件描述符”等概念。不同的文件系统通过文件路劲来区分。

对于VFS,你可以通过手动实现读与写来挂载文件系统。除此之外,ESP-IDF提供了大量简化API为开发者实现了挂载常用的文件系统,如:

  • 挂载ESP32或模组内部flashFat文件系统
  • 挂载SD卡为Fat文件系统
  • 其他…

1. 标准的VFS路径

一个标准ESP32 VFS路径如下所示
/挂载点/path/to/file.txt
其中包含了“挂载点”和“路径”
一个挂载点被认为成一个文件系统

(1)挂载点

挂载点必须为斜杠/开头,且/后至少有一个字符

当然也有特殊情况,例如当你需要一个默认文件系统,在未找到符合条件的文件系统时访问。或者应用程序要覆盖VFS某些功能。这时候允许无名的挂载点。
不要把 / 当作根文件系统!

允许多层挂载点

例如:可以将 /storage/sdcard作为挂载点

(2)路径

路径描述某个文件系统(挂载点)下某个文件所处的位置。
注意事项:
如果挂载点中嵌套了其他挂载点,则在打开文件时使用具有最长匹配路径前缀的挂载点。 例如:
 (i) /data挂载文件系统A
 (ii) /data/flash挂载文件系统B
则:
 打开/data/index.html时,VFS会去A文件系统寻找;
 打开/data/flash/main.cpp时,VFS会去B文件系统寻找;即使没有找到,VFS也不会去/data下寻找/flash/main.cpp
点 “ . ” 在VFS中不会被特殊处理
例如..不会被当作“上一级目录”,.也不会被当作“当前目录”

2. 文件描述符

文件描述符是一组很小的正整数,从 0FD_SETSIZE - 1FD_SETSIZEnewlib ->sys/types.h 中定义。
最大文件描述符由 CONFIG_LWIP_MAX_SOCKETS 定义,且为套接字保留。
VFS 中包含一个名为 s_fd_table 的查找表,用于将全局文件描述符映射至 s_vfs 数组中注册的 VFS 驱动索引。

3. 标准IO流: stdinstdoutstderr

这三个流均属于文件描述符。默认情况下,对 stdoutstderr 执行写入操作将会通过 UART 发送字符,对 stdin 执行读取操作则会从UART 中取出字符。详见menuconfig配置

你可能感兴趣的:(ESP32,教学专栏,(基于ESP-IDF),单片机,c语言,嵌入式,物联网,ESP32)