spiffs、vfs是什么
SPIFFS 是一个用于 SPI NOR flash 设备的嵌入式文件系统,支持磨损均衡、文件系统一致性检查等功能。——简单文件系统
(目前,SPIFFS尚不支持目录,但可以生成扁平结构。如果SPIFFS 挂载在 /spiffs 下,在 /spiffs/tmp/myfile.txt 路径下创建一个文件则会在SPIFFS 中生成一个名为 /tmp/myfile.txt 的文件,而不是在 /spiffs/tmp 下生成名为 myfile.txt 的文件;)
虚拟文件系统(VFS)
如果你曾经了解过Linux,那么你大概率听说过“Linux下一切皆文件”。你插入的一个U盘,移动硬盘,乃至打印机,音响在Linux中都会被当作“文件”。
这可能不太好理解,为什么我的设备被系统当作文件了呢。实际上,这些文件不一定是真实的文件,而是虚拟的。这就是VFS中“虚拟”的含义。
从设备读取数据视为向“文件”读取数据,向设备发送数据视为写数据到“文件”。并且不同的“文件”之间读写方式相同
因此,虚拟文件系统的作用是:使得计算机上层的软件,能够用单一的方式,来跟底层不同的文件系统沟通(无论是真实的文件系统还是虚拟的文件系统)。在操作系统与之下的各种文件系统之间,虚拟文件系统提供了标准的操作接口,将所有不同种类的文件系统统一起来。
ESP32 吸收了Linux VFS的理念,被设计了VFS。为一些驱动提供了统一的接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。
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 标准IO流: stdin、stdout、stderr
这三个流均属于文件描述符。默认情况下,对 stdout 或 stderr 执行写入操作将会通过 UART 发送字符,对 stdin 执行读取操作则会从UART 中取出字符。详见menuconfig配置