Je travaille actuellement sur un projet qui implique la journalisation rapide et continue d'une métrique plutôt spécifique à l'application sur une longue durée de vie. Pour ce faire, j'ai fini par utiliser un NXP M0 et une puce flash 32 Mo SPI. L'enregistrement est continu et doit durer de nombreuses années sur le terrain (10+), et est périodiquement vérifié par un humain pour repérer les tendances. Finalement, le tampon se remplit et commence à remplacer les anciennes données, ce qui est parfaitement correct. J'ai trouvé un algorithme simple pour parcourir tout le périphérique flash pour trouver la tête actuelle après une mise sous tension (le périphérique est mis hors tension assez fréquemment hors de mon contrôle) afin que la journalisation puisse simplement continuer là où elle s'était arrêtée. Je peux simplement utiliser la force brute à travers cette promenade et le faire avec ~ 4s comme pire scénario.
Cela m'a fait penser, y a-t-il des systèmes de fichiers structurés en journaux qui sont adaptés aux périphériques flash et aux microcontrôleurs? JFFS et tous les autres FS Log Structured FS bien connus que j'imagine seraient un peu lourds pour un simple microcontrôleur (cela dépend bien sûr de l'application). Pour être plus précis, j'aimerais connaître tous les algorithmes conçus spécifiquement pour être un journal circulaire avec un temps de recherche de tête rapide et / ou tous ceux conçus pour un système de fichiers "traditionnel" sur un périphérique flash pouvant être exécuté sur un microcontrôleur. Traditionnel dans ce sens étant comparable à quelque chose comme JFFS où il existe une structure de données qui représente une collection de fichiers à accès aléatoire mutables dans un espace de noms hiérarchique.
Réponses:
structure de données de corde
Je suis fasciné par la structure des données de corde. J'ai un projet de loisir essayant de l'adapter à un microcontrôleur avec seulement quelques octets de RAM accrochés à une énorme mémoire Flash, afin que je puisse insérer et supprimer et autrement éditer arbitrairement du texte de longueur variable dans d'énormes fichiers texte. Fichiers texte beaucoup trop volumineux pour tenir dans la RAM. Effacer la dernière moitié du fichier et la réécrire sur flash, décalé d'un octet, chaque fois que j'insère ou supprime un caractère au milieu d'un fichier texte de plusieurs mégaoctets, serait beaucoup trop lent, mais la structure des données de la corde peut le faire beaucoup plus rapidement. Étant donné que la structure de données de la corde peut représenter des fichiers à longueur variable à accès aléatoire mutables comme des morceaux de longueur fixe immuables, cela semble être une bonne correspondance pour la mémoire flash - toutes les modifications sont écrites de façon circulaire. Hélas, tous les bugs ne sont pas encore résolus dans mon code. :-(
journaux chronologiques de longueur fixe
J'ai réussi à faire fonctionner un système de journaux circulaires similaire, pour un produit que j'ai aidé à développer.
J'ai simplement écrit des enregistrements de longueur fixe l'un après l'autre, remplissant le flash comme un tableau circulaire.
(Avec un flash complètement vierge, j'ai commencé à écrire des enregistrements sur environ 3 blocs avant la fin du tableau, afin que je puisse tester le bouclage circulaire après que seulement quelques enregistrements de données ont été stockés, plutôt que de commencer à l'enregistrement zéro et d'attendre un mois de données à écrire avant de découvrir qu'il y avait un bug dans mon code de bouclage).
Je me suis assuré qu'il y avait toujours au moins 2 "blocs d'effacement" effacés prêts à être écrits. Après avoir écrit un enregistrement, s'il n'y avait que 2 "blocs effacés" qui étaient vides, j'ai effacé inconditionnellement le plus ancien bloc de données - le 3ème bloc des données les plus anciennes après les 2 "blocs effacés". (Vers la fin de la mémoire flash, "après" signifie "boucler jusqu'au début de la mémoire flash.) (Peut-être qu'un seul bloc effacé aurait été suffisant - j'oublie pourquoi je pensais avoir besoin d'au moins 2 et parfois 3) .
J'oublie exactement le nombre d'enregistrements que j'ai mis dans chaque "bloc d'effacement", mais je me suis assuré que je n'avais jamais d'enregistrements chevauchant deux blocs d'effacement - les 2 premiers octets de chaque bloc d'effacement de flash étaient soit la valeur "effacée" 0xFFFF, soit les deux premiers octets d'une somme de contrôle Fletcher-16 (qui n'est jamais 0xFFFF) dans l'en-tête de chaque enregistrement.
Cela a permis de scanner rapidement la prochaine fois qu'il s'est mis sous tension et de trouver la tête du journal circulaire - je n'ai eu qu'à regarder les deux premiers octets de chaque bloc d'effacement pour faire la distinction entre les blocs "effacés" et "données". (J'étais un peu inquiet à propos d'une "panne de courant au milieu de l'effacement d'un bloc" provoquant l'effacement des deux premiers octets à 0xFFFF mais laissant des octets non effacés au milieu du bloc, j'ai donc écrit du code pour que le microcontrôleur vérifie pour cela et redémarrez le processus "effacer un bloc").
Veuillez me dire si vous trouvez d'autres structures de données ou systèmes de fichiers compatibles avec le flash.
la source
Cela fait pas mal d'années, mais je voulais faire un suivi à ce sujet au cas où quelqu'un d'autre se promènerait. Il semble qu'il y ait quelques projets de nos jours, qui sont activement maintenus (en janvier 2020) et qui sont des systèmes de fichiers destinés aux microcontrôleurs ciblés sur le flash NOR SPI.
Notez que je ne les ai testés à aucun titre, mais ils font exactement ce que la question d'origine recherchait: "... structure de données qui représente une collection de fichiers à accès aléatoire mutables ..."
https://github.com/ARMmbed/littlefs - Créé par ARM, licence BSD
https://github.com/joembedded/JesFs - ne semble pas vraiment être sous licence, mais a été très spécifiquement conçu pour le flash SPI NOR.
la source