Système de fichiers ESP32 et SPIFFS


SPIFFS - (Serial Peripheral Interface Flash File System) système de fichiers pour mémoire flash connecté via une interface périphérique série. En termes simples: il y a un microcontrôleur ESP32 (Figure 1), il a une mémoire NOR non volatile réinscriptible intégrée, qui stocke: Préférences, chargeur de démarrage, firmware (croquis compilé), système de fichiers (SPIFFS) et autre chose quelque chose comme une mise à jour en direct (OTA).



Figure 1. Schéma fonctionnel du microcontrôleur ESP32


La mémoire NOR est un type de mémoire réinscriptible non volatile qui a une vitesse de lecture assez élevée, une vitesse d'écriture et d'effacement relativement faible, par rapport au type de mémoire NAND . Il est presque impossible de rencontrer une mémoire NOR de grande capacité, généralement limitée à 128 Mo. Dans le cas de ESP32 - quatre .


Aujourd'hui, SPIFFS présente certains inconvénients. défauts , notamment: le manque de prise en charge des dossiers; pas une pile en temps réel, donc la même opération peut prendre des temps différents; manque de capacité à trouver et réparer les blocs cassés. Si les lacunes énumérées ne sont pas critiques pour vous, nous continuons à lire le paragraphe suivant.


Parlons de l'utilisation


Malheureusement, prêt à l'emploi, la mémoire du microcontrôleur n'est pas marquée comme SPIFFS, pour le marquer, vous devez utiliser le plug-in ESP32FS pour l'environnement de développement Arduino IDE.


Une fois le plugin téléchargé, il doit être installé:


  • Assurez-vous que la dernière version de l'environnement de développement Arduino IDE et le pilote de votre appareil sur l' ESP32 sont installés . J'ai le pilote M5Stack CP210X que je télécharge à partir de ce lien;
  • Copiez le dossier des outils téléchargés avec le plugin intégré dans le dossier / Arduino / tools / ESP32FS / ;
  • Sous macOS, le dossier se trouve dans ~ / Documents / Arduino / ;
  • Redémarrez l'ordinateur et enregistrez dans l'environnement de développement dans le menu Outils l' élément ESP32 Sketch Data Upload apparaît (Figure 2) - cela signifie que vous avez tout fait correctement;


Figure 2. Menu Outils


  • Faites attention au dossier de données situé à côté du croquis. Tous les fichiers situés dans ce dossier seront chargés dans la mémoire de l'appareil pendant le formatage;
  • N'hésitez pas à sélectionner l'élément indiqué et attendez la fin du formatage de la zone mémoire. Veuillez noter que les autres sections de la mémoire ne seront PAS affectées, ce qui signifie que le firmware restera dans la mémoire de l'appareil et fonctionnera. De même avec l'esquisse, lorsqu'elle est compilée dans le firmware et téléchargée sur l'appareil, le système de fichiers ne sera pas affecté.

Si vous voulez du confort


  • Si vous souhaitez toucher des fichiers et voir des informations sur l'espace libre, téléchargez le croquis BRIDGE et flashez votre appareil dessus.


  • Téléchargez également et compiler gestionnaire de fichiers multiplateforme A-Explorer (figure 3). Sur GitHub, les binaires seront bientôt dans le dossier bin .



    Figure 3 a. Gestionnaire de fichiers A-Explorer pour macOS



    Figure 3, b. Gestionnaire de fichiers A-Explorer pour Windows



Ce gestionnaire de fichiers vous permettra de trouver des informations sur l'espace libre, de télécharger / télécharger / supprimer des fichiers. Il y a une indication de l'avancement de l'opération.


Comme vous pouvez le voir sur la figure 3, le plug-in a alloué environ 1,38 Mo de mémoire sous SPIFFS.


Qui est ce BRIDGE?


BRIDGE est une esquisse, et tout d'abord, une fonction du même nom qui fonctionne avec le système de fichiers SPIFFS et A-Explorer est un shell graphique pour cela. Ce dernier envoie une commande ou une autre, et cette fonction la traite sur l'appareil lui-même à l'aide des bibliothèques FS et SPIFFS . Voyons ce qui est intéressant dans ces bibliothèques.


Commençons par regarder les méthodes publiques de la classe SPIFFS :


  • Méthode de début booléen (bool formatOnFail = false, const char * basePath = "/ spiffs", uint8_t maxOpenFiles = 10). Cette méthode tente d'initialiser une instance de la classe. Le premier argument est vrai ou faux au cas où le système de fichiers devrait être formaté s'il n'est pas formaté. Le deuxième argument prend le chemin où se trouvera la racine du système de fichiers. Le troisième argument déterminera le nombre de fichiers ouverts simultanément. Il vaut mieux laisser les deux derniers paramètres par défaut et ne pas les changer. Si le système de fichiers est manquant (le plugin ci-dessus n'a pas été utilisé). alors la fonction retournera false.


  • La méthode bool format () vérifie si le système de fichiers est formaté - renvoie vrai, sinon - faux.


  • Méthode size_t totalBytes (). Cette méthode retourne le size_t-number du nombre total d'octets alloués au système de fichiers.


  • Méthode Size_t usedBytes (). Cette méthode renvoie le nombre size_t d'octets utilisés dans le système de fichiers.


  • Méthode Void end (). Cette méthode désinitialise cette classe. Après avoir appelé cette méthode, cela n'a aucun sens d'appeler d'autres méthodes.



Tout dans cette classe, il n'y a rien de particulièrement intéressant. Passons à la classe FS et voyons ce qui peut être utile à partir de là.


  • La première chose qui attire votre attention est la méthode d'initialisation de la classe bool begin (). Cette méthode ne nécessite pas d'arguments et il n'est pas nécessaire de l'appeler, car nous utiliserons immédiatement la méthode suivante.


  • La méthode File open ( chemin const char, mode const char ) et son frère File open (const String & path, mode const char *). Ces méthodes prennent deux arguments, dont le premier est un pointeur symbolique et chaîne vers le chemin du fichier, et le second est le mode d'ouverture, qui peut être la constante suivante:



FILE_READ - ouvert en lecture seule;


FILE_WRITE - ouvert pour l'écriture uniquement;


FILE_APPEND - ouvert pour l'écrasement.


Après avoir ouvert le fichier, nous pouvons maintenant effectuer toutes les opérations sur celui-ci.


  • La méthode size_t write (uint8_t) vous permet d'écrire un entier non signé 8 bits à la fin du fichier.
  • La méthode d'écriture size_t (const uint8_t * buf, size_t size) vous permet d'écrire une série d'entiers non signés de la longueur spécifiée dans le deuxième argument.
  • La méthode int available () compte le nombre de caractères de la fin au pointeur.
  • La méthode int read () lit un caractère du fichier et le renvoie sous forme d'entier, tandis que le curseur décale d'une unité vers la droite.
  • La méthode size_t readBytes (char * buffer, size_t length) lit les caractères dans le tampon pointé par le premier argument et le nombre de caractères transmis par le deuxième argument. Renvoie le nombre de caractères lus.
  • La méthode String readString () lit une ligne dans un fichier.
  • La méthode int peek () fonctionne de manière similaire à la méthode int read (), seul le curseur reste en place.
  • Les méthodes booléenne (uint32_t pos, mode SeekMode) et booléenne (uint32_t pos, mode SeekMode) positionnent le curseur à l'emplacement spécifié. La position est passée comme premier argument et la deuxième règle ( SeekSet - positionnez le curseur). En cas de succès - renvoie vrai, sinon - faux.
  • La méthode size_t position () renvoie la position du curseur.
  • La méthode size_t size () renvoie la taille du fichier en octets.
  • La méthode const char * name () renvoie le nom du fichier.
  • La méthode const char * fullName (), en tenant compte du chemin complet.
  • La méthode bool isFile () renvoie true si l'objet ouvert est un fichier. Sinon - un mensonge.
  • La méthode bool isDirectory () renvoie true si l'objet ouvert est un dossier. Sinon - un mensonge.
  • La méthode File openNextFile () renvoie un pointeur sur le fichier suivant à la racine, sinon NULL.
  • Les méthodes bool existent (const char * path) et bool exist (const String & path) prennent le nom complet du fichier comme argument, et si un tel fichier existe, il renvoie true, sinon il renvoie false.
  • Les méthodes bool remove (const char * path) et bool remove (const String & path) essaient de supprimer le fichier dont le nom est passé par argument. En cas de succès, renvoie vrai, sinon - faux.
  • Méthode bool rename (const char pathFrom, const char pathTo) et bool rename (const String & pathFrom, const String & pathTo); accepte le nom de fichier complet comme premier argument et le second comme nouveau nom de fichier complet et renommez-le.

Oui, oui, vous pouvez prendre cette fonction et l'exécuter dans un thread séparé dans n'importe quel autre croquis


Merci beaucoup pour votre temps! Je serais heureux si cet article vous profite.


Références et (ou) sources:


  • Système de fichiers SPIFFS ici
  • Travailler avec le système de fichiers de l'addon ESP8266 dans l'IDE Arduino ici
  • Téléchargement du système de fichiers Arduino ESP32 ici

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


All Articles