ESP32和SPIFFS文件系统


SPIFFS- (串行外设接口闪存文件系统)文件系统,用于通过串行外设接口连接的闪存。 简而言之:有一个ESP32微控制器(图1),它具有一个内置的可重写非易失性NOR存储器,该存储器存储:首选项,引导加载程序,固件(编译草图),文件系统(SPIFFS)等像无线(OTA)更新。



图1. ESP32微控制器功能框图


NOR存储器是一种非易失性可重写存储器,与NAND存储器相比,具有相当高的读取速度,相对较低的写入和擦除速度。 满足通常限于128 MB的大容量NOR内存几乎是不可能的。 在ESP32的情况下-


如今,SPIFFS具有一些缺点。 缺陷 ,包括:缺少文件夹支持; 不是实时堆栈,因此同一操作可能会花费不同的时间; 缺乏查找和修复损坏的块的能力。 如果列出的缺点对您而言并不重要,那么我们将继续阅读下一段。


让我们谈谈使用


不幸的是,开箱即用,微控制器的内存未标记为SPIFFS,为了对其进行标记,您需要针对Arduino IDE开发环境使用ESP32FS插件。


下载插件后,必须安装它:


  • 确保您已安装最新版本的Arduino IDE开发环境以及已在ESP32上安装设备驱动 程序 。 我有从此链接下载的M5Stack驱动程序CP210X
  • 将嵌入插件的下载工具文件夹复制到/ Arduino / tools / ESP32FS /文件夹 ;
  • macOS上,该文件夹位于〜/ Documents / Arduino / ;
  • 重新启动计算机,并在“ 工具”菜单中检查开发环境,将显示ESP32 Sketch Data Upload项目(图2)-这意味着您已正确完成所有操作;


图2. 工具菜单


  • 注意草图旁边的数据文件夹。 格式化过程中,此文件夹中的所有文件都将被加载到设备的内存中。
  • 随意选择指示的项目,然后等待格式化存储区结束。 请注意,内存的其他部分不会受到影响,这意味着固件将保留在设备的内存中并且可以使用。 与草图类似,当将其编译到固件中并下载到设备中时,文件系统将不会受到影响。

如果你想要安慰


  • 如果要触摸文件并查看有关可用空间的信息,请下载BRIDGE草图并将设备刷新到该草图。


  • 也下载 并编译 跨平台文件管理器A-Explorer (图3)。 在GitHub上,二进制文件很快就会在bin文件夹中。



    图3 a。 适用于macOS的A-Explorer文件管理器



    图3,b。 Windows的A-Explorer文件管理器



该文件管理器将允许您查找有关可用空间的信息,上载/下载/删除文件。 指示操作进度。


从图3中可以看到,该插件在SPIFFS下分配了大约1.38 MB的内存。


这个桥是谁?


BRIDGE是一个草图,首先是与SPIFFS文件系统一起使用的同名功能,而A-Explorer是其图形外壳。 后者发送一个或另一个命令,此功能使用FSSPIFFS库在设备本身上对其进行处理。 让我们看看这些库中有什么有趣的东西。


让我们从查看SPIFFS类的公共方法开始:


  • Bool begin方法(bool formatOnFail = false,const char * basePath =“ / spiffs”,uint8_t maxOpenFiles = 10)。 此方法尝试初始化该类的实例。 如果不格式化文件系统,则第一个参数为true或false,以防止格式化文件系统。 第二个参数采用文件系统根目录所在的路径。 第三个参数将确定同时打开的文件数。 最好将最后两个参数保留为默认值,而不更改它们。 如果缺少文件系统(未使用上述插件)。 然后该函数将返回false。


  • bool format()方法将检查文件系统是否已格式化-返回true,否则返回false。


  • 方法size_t totalBytes()。 此方法返回为文件系统分配的字节总数的size_t-number。


  • Size_t方法usedBytes()。 此方法返回在文件系统中使用的size_t字节数。


  • 虚空end()方法。 此方法取消初始化此类。 调用此方法后,调用其他方法毫无意义。



在本课程中的所有内容,没有什么特别有趣的。 让我们继续进行FS类 ,看看在那里可以派上用场。


  • 引起您注意的第一件事是bool begin()类的初始化方法。 此方法不需要参数,也不需要调用它,因为我们将立即使用next方法。


  • File打开方法(const char 路径,const char模式)及其兄弟File打开方法(const String和路径,const char *模式)。 这些方法有两个参数,第一个是指向文件路径的符号和字符串指针,第二个是打开模式,可以是以下常量:



FILE_READ-仅开放阅读;


FILE_WRITE-仅开放用于写入;


FILE_APPEND-打开以供覆盖。


打开文件后,我们现在可以对其执行任何操作。


  • size_t write(uint8_t)方法允许您将一个8位无符号整数写入文件末尾。
  • size_t写入方法(const uint8_t * buf,size_t大小)允许您在第二个参数中写入一系列指定长度的无符号整数。
  • int available()方法计算从结尾到指针的字符数。
  • int read()方法从文件中读取一个字符并将其作为整数返回,而光标则向右移动一个单位。
  • size_t readBytes(char *缓冲区,size_t长度)方法将字符读取到第一个参数指向的缓冲区中,并将第二个参数传递的字符数读取到缓冲区中。 返回读取的字符数。
  • String readString()方法从文件读取一行。
  • int peek()方法的工作方式与int read()方法相似,只是光标保留在原处。
  • bool seek(uint32_t pos,SeekMode模式)和bool seek(uint32_t pos,SeekMode模式)方法将光标设置到指定位置。 该位置作为第一个参数和第二个规则( SeekSet-设置光标) 传递 。 如果成功-返回true,否则返回false。
  • size_t position()方法返回光标位置。
  • size_t size()方法返回以字节为单位的文件大小。
  • const char * name()方法返回文件名。
  • const char * fullName()方法,考虑了完整路径。
  • 如果打开的对象是文件,则bool isFile()方法将返回true。 否则-说谎。
  • 如果打开的对象是文件夹,则bool isDirectory()方法将返回true。 否则-说谎。
  • File openNextFile()方法返回指向根目录中下一个文件的指针,否则返回NULL。
  • bool存在(const char *路径),而bool存在(const String和路径)方法将文件的全名作为参数,如果存在该文件,则返回true,否则返回false。
  • 布尔删除(const char * path)和布尔删除(const String&path)方法尝试删除其名称由参数传递的文件。 如果成功,则返回true,否则返回false。
  • 方法bool重命名(const char pathFrom,const char pathTo)和bool重命名(const String&pathFrom,const String&pathTo); 接受完整的文件名作为第一个参数,第二个作为完整的新文件名并重命名。

是的,是的,您可以使用此功能并在其他任何草图中的单独线程中运行它


非常感谢您的宝贵时间! 如果本文使您受益,我将感到高兴。


参考和(或)资料来源:


  • SPIFFS文件系统在这里
  • 此处使用Arduino IDE中的ESP8266插件中的文件系统
  • Arduino ESP32文件系统上传器在这里

Source: https://habr.com/ru/post/zh-CN483280/


All Articles