ESP32- und SPIFFS-Dateisystem


SPIFFS - (Serial Peripheral Interface Flash File System) Dateisystem für Flash-Speicher, der über eine serielle Peripherieschnittstelle angeschlossen ist. Mit einfachen Worten: Es gibt einen ESP32-Mikrocontroller (Abbildung 1), der über einen integrierten, wiederbeschreibbaren, nichtflüchtigen NOR-Speicher verfügt, in dem Einstellungen, Bootloader, Firmware (kompilierte Skizze), Dateisystem (SPIFFS) und etwas anderes gespeichert sind so etwas wie ein Over-the-Air-Update (OTA).



Abbildung 1. Funktionsblockdiagramm des ESP32-Mikrocontrollers


NOR-Speicher ist eine Art nichtflüchtiger wiederbeschreibbarer Speicher, der im Vergleich zur Art des NAND-Speichers eine relativ hohe Lesegeschwindigkeit, eine relativ niedrige Schreib- und Löschgeschwindigkeit aufweist. Es ist fast unmöglich, NOR-Speicher mit großer Kapazität zu erfüllen, der normalerweise auf 128 MB beschränkt ist. Im Fall von ESP32 - vier .


Heute hat SPIFFS einige Nachteile. Mängel , einschließlich: fehlende Ordnerunterstützung; Kein Echtzeitstapel, daher kann derselbe Vorgang zu unterschiedlichen Zeiten ausgeführt werden. Mangel an Fähigkeit, gebrochene Blöcke zu finden und zu reparieren. Wenn die aufgeführten Mängel für Sie nicht kritisch sind, lesen wir den nächsten Absatz weiter.


Sprechen wir über die Verwendung


Leider ist der Speicher des Mikrocontrollers nicht für SPIFFS vorgesehen. Um ihn zu kennzeichnen, müssen Sie das ESP32FS- Plug- In für die Arduino IDE-Entwicklungsumgebung verwenden.


Nachdem das Plugin heruntergeladen wurde, muss es installiert werden:


  • Stellen Sie sicher, dass Sie die neueste Version der Arduino IDE- Entwicklungsumgebung und den Treiber für Ihr Gerät auf dem ESP32 installiert haben . Ich habe den M5Stack- Treiber CP210X, den ich über diesen Link heruntergeladen habe .
  • Kopieren Sie den heruntergeladenen Tool- Ordner mit dem darin eingebetteten Plugin in den Ordner / Arduino / tools / ESP32FS / .
  • Unter macOS befindet sich der Ordner unter ~ / Documents / Arduino / ;
  • Starten Sie den Computer neu und überprüfen Sie in der Entwicklungsumgebung im Menü Extras, ob das Element zum Hochladen von ESP32-Skizzendaten angezeigt wird (Abbildung 2).


Abbildung 2. Menü Extras


  • Achten Sie auf den Datenordner neben der Skizze. Alle Dateien in diesem Ordner werden beim Formatieren in den Speicher des Geräts geladen.
  • Wählen Sie den gewünschten Eintrag aus und warten Sie, bis der Speicherbereich vollständig formatiert ist. Bitte beachten Sie, dass andere Bereiche des Speichers NICHT betroffen sind. Dies bedeutet, dass die Firmware im Speicher des Geräts verbleibt und funktioniert. Ähnlich wie bei der Skizze ist das Dateisystem nicht betroffen, wenn es in die Firmware kompiliert und auf das Gerät heruntergeladen wird.

Wenn Sie Komfort wollen


  • Wenn Sie Dateien berühren und Informationen zum freien Speicherplatz anzeigen möchten, laden Sie die BRIDGE- Skizze herunter und flashen Sie Ihr Gerät darauf.


  • Auch herunterladen und kompilieren plattformübergreifender Dateimanager A-Explorer (Abbildung 3). Auf GitHub befinden sich Binärdateien bald im Ordner bin .



    Abbildung 3 a. A-Explorer Dateimanager für macOS



    Abbildung 3, b. A-Explorer-Dateimanager für Windows



Mit diesem Dateimanager können Sie Informationen zu freiem Speicherplatz abrufen, Dateien hochladen, herunterladen und löschen. Es gibt einen Hinweis auf den Fortschritt der Operation.


Wie Sie in Abbildung 3 sehen können, hat das Plug-in unter SPIFFS ungefähr 1,38 MB Speicher zugewiesen.


Wer ist diese BRÜCKE?


BRIDGE ist eine Skizze und vor allem eine gleichnamige Funktion, die mit dem SPIFFS-Dateisystem funktioniert, und A-Explorer ist eine grafische Shell dafür. Letzterer sendet den einen oder anderen Befehl und diese Funktion verarbeitet ihn auf dem Gerät selbst unter Verwendung der FS- und SPIFFS-Bibliotheken . Mal sehen, was in diesen Bibliotheken interessant ist.


Betrachten wir zunächst die öffentlichen Methoden der SPIFFS-Klasse :


  • Bool-Startmethode (bool formatOnFail = false, const char * basePath = "/ spiffs", uint8_t maxOpenFiles = 10). Diese Methode versucht, eine Instanz der Klasse zu initialisieren. Das erste Argument ist true oder false, wenn das Dateisystem formatiert werden soll, wenn das Dateisystem nicht formatiert ist. Das zweite Argument gibt den Pfad an, in dem sich das Stammverzeichnis des Dateisystems befindet. Das dritte Argument bestimmt die Anzahl der gleichzeitig geöffneten Dateien. Es ist besser, die letzten beiden Parameter als Standard zu belassen und nicht zu ändern. Wenn das Dateisystem fehlt (das obige Plugin wurde nicht verwendet). dann wird die Funktion false zurückgeben.


  • Die Methode bool format () prüft, ob das Dateisystem formatiert ist - gibt true zurück, andernfalls false.


  • Methode size_t totalBytes (). Diese Methode gibt die size_t-number der Gesamtzahl der für das Dateisystem zugewiesenen Bytes zurück.


  • Size_t-Methode usedBytes (). Diese Methode gibt die size_t Anzahl der im Dateisystem verwendeten Bytes zurück.


  • Void end () Methode. Diese Methode deinitialisiert diese Klasse. Nach dem Aufruf dieser Methode ist es nicht sinnvoll, andere Methoden aufzurufen.



Alles in dieser Klasse gibt es nichts besonders Interessantes. Gehen wir weiter zur FS-Klasse und sehen, was sich von dort als nützlich erweisen kann.


  • Das Erste, was Ihnen auffällt, ist die Initialisierungsmethode der Klasse bool begin (). Diese Methode erfordert keine Argumente und muss nicht aufgerufen werden, da die nächste Methode sofort verwendet wird.


  • Die Methode zum Öffnen von Dateien (const char path, const char mode) und deren Bruder File open (const String & path, const char * mode). Diese Methoden verwenden zwei Argumente, von denen das erste ein symbolischer und ein Zeichenfolgenzeiger auf den Dateipfad ist und das zweite der Öffnungsmodus ist, der die folgende Konstante sein kann:



FILE_READ - nur zum Lesen geöffnet;


FILE_WRITE - nur zum Schreiben geöffnet;


FILE_APPEND - Zum Überschreiben öffnen.


Nachdem wir die Datei geöffnet haben, können wir nun beliebige Operationen daran ausführen.


  • Mit der Methode size_t write (uint8_t) können Sie eine 8-Bit-Ganzzahl ohne Vorzeichen an das Ende der Datei schreiben.
  • Mit der Methode size_t write (const uint8_t * buf, size_t size) können Sie im zweiten Argument eine Reihe von Ganzzahlen ohne Vorzeichen mit der angegebenen Länge schreiben.
  • Die Methode int available () zählt die Anzahl der Zeichen vom Ende bis zum Zeiger.
  • Die Methode int read () liest ein Zeichen aus der Datei und gibt es als Ganzzahl zurück, während der Cursor eine Einheit nach rechts verschiebt.
  • Die Methode size_t readBytes (char * buffer, size_t length) liest Zeichen in den Puffer, auf den das erste Argument zeigt, und die Anzahl der Zeichen, die das zweite Argument übergibt. Gibt die Anzahl der gelesenen Zeichen zurück.
  • Die String-Methode readString () liest eine Zeile aus einer Datei.
  • Die Methode int peek () funktioniert ähnlich wie die Methode int read (), nur der Cursor bleibt an Ort und Stelle.
  • Die Methoden bool seek (uint32_t pos, SeekMode-Modus) und bool seek (uint32_t pos, SeekMode-Modus) setzen den Cursor auf die angegebene Position. Die Position wird als erstes Argument und die zweite Regel ( SeekSet - Cursor setzen) übergeben. Bei Erfolg wird true zurückgegeben, andernfalls false.
  • Die Methode size_t position () gibt die Cursorposition zurück.
  • Die size_t size () -Methode gibt die Dateigröße in Bytes zurück.
  • Die const char * name () -Methode gibt den Dateinamen zurück.
  • Die const char * fullName () -Methode unter Berücksichtigung des vollständigen Pfads.
  • Die Methode bool isFile () gibt true zurück, wenn das geöffnete Objekt eine Datei ist. Ansonsten - eine Lüge.
  • Die Methode bool isDirectory () gibt true zurück, wenn das geöffnete Objekt ein Ordner ist. Ansonsten - eine Lüge.
  • Die Methode File openNextFile () gibt einen Zeiger auf die nächste Datei im Stammverzeichnis zurück, andernfalls NULL.
  • Die Methoden bool exists (const char * path) und bool exists (const String & path) verwenden den vollständigen Namen der Datei als Argument. Wenn eine solche Datei vorhanden ist, wird true zurückgegeben, andernfalls false.
  • Die Methoden bool remove (const char * path) und bool remove (const String & path) versuchen, die Datei zu löschen, deren Name als Argument übergeben wird. Bei Erfolg wird true zurückgegeben, andernfalls false.
  • Methode bool umbenennen (const char pathFrom, const char pathTo) und bool umbenennen (const String & pathFrom, const String & pathTo); Akzeptiert den vollständigen Dateinamen als erstes Argument und den zweiten als vollständigen neuen Dateinamen und benennt ihn um.

Ja, ja, Sie können diese Funktion in einem separaten Thread in einer anderen Skizze ausführen


Vielen Dank für Ihre Zeit! Ich würde mich freuen, wenn dieser Artikel Ihnen zugute kommt.


Referenzen und (oder) Quellen:


  • SPIFFS-Dateisystem hier
  • Arbeiten Sie hier mit dem Dateisystem im ESP8266-Addon in der Arduino IDE
  • Arduino ESP32-Dateisystem-Uploader hier

Source: https://habr.com/ru/post/de483280/


All Articles