Leichter Circular Log-Algorithmus (dateisystemähnlich) für Flash-basierten Speicher


8

Ich arbeite derzeit an einem Projekt, bei dem eine ziemlich anwendungsspezifische Metrik über einen langen Zeitraum schnell und kontinuierlich protokolliert wird. Dazu habe ich einen NXP M0 und einen 32MiB SPI-Flash-Chip verwendet. Die Protokollierung ist kontinuierlich und muss viele Jahre im Feld (10+) dauern. Sie wird regelmäßig von einem Menschen auf Trenderkennung überprüft. Schließlich füllt sich der Puffer und beginnt, alte Daten zu überschreiben, was vollkommen in Ordnung ist. Ich habe einen einfachen Algorithmus entwickelt, mit dem das gesamte Flash-Gerät nach dem Einschalten nach dem aktuellen Kopf durchsucht werden kann (das Gerät wird außerhalb meiner Kontrolle ziemlich häufig ausgeschaltet), sodass die Protokollierung einfach dort fortgesetzt werden kann, wo sie aufgehört hat. Ich kann diesen Spaziergang nur mit brutaler Gewalt durchführen und dies mit ~ 4s als Worst-Case-Szenario tun.

Dies brachte mich zum Nachdenken, gibt es logarithmisch strukturierte Dateisysteme, die für Flash-Geräte und Mikrocontroller geeignet sind? JFFS und all die anderen bekannten log Structured FSs, die ich mir vorstelle, wären für einen einfachen Mikrocontroller etwas schwer (hängt natürlich von der Anwendung ab). Um genauer zu sein, würde ich gerne wissen, welche Algorithmen speziell als kreisförmiges Protokoll mit schneller Kopfsuchzeit konzipiert sind und / oder welche für ein "traditionelles" Dateisystem auf einem Flash-Gerät entwickelt wurden, das auf einem ausgeführt werden kann Mikrocontroller. Traditionell in diesem Sinne mit JFFS vergleichbar zu sein, wo es eine Datenstruktur gibt, die eine Sammlung veränderlicher Dateien mit wahlfreiem Zugriff in einem hierarchischen Namensraum darstellt.


ist FAT32 oder FAT16 auf einer SD-Karte zu langsam?
Vicatcu

2
Diese Frage ist hier vollständig zum Thema, aber wenn Sie keine guten Antworten erhalten, kann StackOverflow wahrscheinlich helfen. Hoffen wir, dass wir hier einige gute Antworten bekommen können!
Kellenjb

@vicatcu Es ist nicht so, dass es zu langsam ist, für meine Anwendung ist SD-Karte plus Anschluss teurer und SD-Karten können weniger zuverlässig sein. Kellenjb Ich war mir nicht sicher, wo ich es hinstellen sollte. Wie viele eingebettete Designfragen fällt diese Art in die Mitte. Wenn es hier nicht gut geht, würde ich es gerne verschieben.
Kris Bahnsen

Ist es ein roher Flash-Chip? Wenn ja, wie gehen Sie mit toten Blöcken um? Ein großer Teil der Flash-FS-Implementierung befasst sich mit toten Blöcken. Wenn Sie der Meinung sind, dass JFFS / JFFS2 zu schwer ist, sollten Sie sich YAFFS ansehen. Es fühlt sich zumindest wie ein sehr einfaches Dateisystem an, daher sollte es ziemlich leicht sein.
Leo

Ja, so ist es. Fehlerhafte Blöcke sind in dieser speziellen Anwendung nicht schrecklich, da sie so langfristig sind, dass das Herausziehen von Daten nur ein grober Trend ist, und in den meisten Fällen bezweifle ich, dass die Protokollierung überhaupt verwendet wird.
Kris Bahnsen

Antworten:


2

Seil Datenstruktur

Ich bin fasziniert von der Seildatenstruktur. Ich habe ein Hobbyprojekt, das versucht, es an einen Mikrocontroller mit nur wenigen Bytes RAM anzupassen, der an einen riesigen Flash-Speicher angeschlossen ist, damit ich Text mit variabler Länge in riesige Textdateien einfügen und löschen und auf andere Weise willkürlich bearbeiten kann. Textdateien sind viel zu groß, um in den RAM zu passen. Das Löschen der letzten Hälfte der Datei und das erneute Schreiben in Flash, verschoben um ein Byte, jedes Mal, wenn ich ein Zeichen in der Mitte einer Multi-Megabyte-Textdatei einfüge oder lösche, wäre viel zu langsam, aber die Seildatenstruktur kann dies viel schneller tun. Da die Seildatenstruktur solche veränderlichen Dateien mit variabler Länge und wahlfreiem Zugriff als unveränderliche Teile fester Länge darstellen kann, scheint sie gut zum Flash-Speicher zu passen - alle Änderungen werden kreisförmig geschrieben. Leider sind in meinem Code noch nicht alle Fehler behoben. :-(

chronologische Protokolle fester Länge

Ich habe ein ähnliches Rundschreiben-System für ein Produkt zum Laufen gebracht, das ich mitentwickelt habe.

Ich habe einfach nacheinander Datensätze mit fester Länge geschrieben und Flash als kreisförmiges Array ausgefüllt.

(Mit einem völlig leeren Blitz begann ich, Datensätze ungefähr 3 Blöcke vor dem Ende des Arrays zu schreiben, damit ich den kreisförmigen Wrap-Around testen konnte, nachdem nur wenige Datensätze von Daten gespeichert wurden, anstatt bei Datensatz Null zu beginnen und auf a zu warten Daten im Wert von einem Monat, die geschrieben werden müssen, bevor festgestellt wird, dass mein Wrap-Around-Code einen Fehler enthält.

Ich habe dafür gesorgt, dass immer mindestens 2 gelöschte "Löschblöcke" zum Schreiben bereit waren. Wenn nach dem Schreiben eines Datensatzes nur 2 "gelöschte Blöcke" leer waren, habe ich den ältesten Datenblock bedingungslos gelöscht - den 3. Block der ältesten Daten nach den 2 "gelöschten Blöcken". (Gegen Ende des Flash-Speichers bedeutet "nach" "um den Anfang des Flash-Speichers wickeln".) Vielleicht wäre ein einzelner gelöschter Block ausreichend gewesen - ich vergesse, warum ich dachte, ich brauche mindestens 2 und manchmal 3) .

Ich habe genau vergessen, wie viele Datensätze ich in jeden "Löschblock" eingefügt habe, aber ich habe sichergestellt, dass ich nie einen Datensatz über zwei Löschblöcke hatte - die ersten 2 Bytes jedes Löschblocks waren entweder der "gelöschte" Wert 0xFFFF oder Die ersten zwei Bytes einer Fletcher-16-Prüfsumme (die niemals 0xFFFF ist) im Header jedes Datensatzes.

Das machte es schnell, beim nächsten Einschalten zu scannen und den Kopf des kreisförmigen Protokolls zu finden - ich musste nur die ersten zwei Bytes jedes Löschblocks betrachten, um zwischen "gelöschten" und "Daten" -Blöcken zu unterscheiden. (Ich war ein wenig besorgt über einen "Stromausfall während des Löschens eines Blocks", der dazu führte, dass die ersten beiden Bytes auf 0xFFFF gelöscht wurden, aber nicht gelöschte Bytes in der Mitte des Blocks zurückblieben. Deshalb schrieb ich Code, den der Mikrocontroller überprüfen sollte dafür und starten Sie den Prozess "Block löschen" neu).

Bitte sagen Sie mir, wenn Sie andere flashfreundliche Datenstrukturen oder Dateisysteme finden.


Ihr Ansatz klingt etwas ähnlich wie meiner. Ich würde jedoch vorschlagen, eine weitere leichte Wendung hinzuzufügen: Reservieren Sie ein paar Bytes in jedem Block, um anzuzeigen, dass er "gestartet" und "voll" ist. Für alle Blöcke außer den gelöschten Blöcken sollten die "gestarteten" Bits programmiert sein. Wenn es Zeit ist, einen Block zu löschen, setzen Sie das "volle" Byte auf das letzte Datenbyte, löschen Sie dann den Block und setzen Sie sofort das "gestartete" Bit des ältesten gelöschten Blocks. Wenn Sie beim Start feststellen, dass der "letzte" Block "voll" und nicht "gestartet" ist, wiederholen Sie das Löschen.
Supercat

Ein solcher Ansatz mag wie ein Overkill erscheinen, aber wenn ein Flash-Block teilweise gelöscht wird, können Bytes willkürlich entscheiden, FF oder etwas anderes zu lesen. Die Tatsache, dass ein Block leer erscheint, ist keine Garantie dafür, dass Bits dort nicht spontan "erscheinen". Wenn Sie während eines Löschvorgangs die Stromversorgung verlieren, warten Sie beim nächsten Start eine Weile und wiederholen Sie den Löschvorgang, auch wenn der Block leer erscheint .
Supercat

Vielen Dank für die Info, ich werde etwas genauer darauf eingehen, wenn ich tatsächlich den Code für den Flash-Speicher drücke und Sie wissen lasse, was passiert.
Kris Bahnsen

@supercat: Danke, das klingt nach einer großartigen Idee.
Davidcary

@davidcary: Ich weiß nicht, dass ich jemals einen Block hatte, der völlig leer erschien und nicht leer war, aber ich hatte einen Block, der bei aufeinanderfolgenden Lesevorgängen unterschiedliche Ergebnisse liefern würde. Es ist möglich, dass der Block fälschlicherweise als leer gelesen wurde. Mein Code hat versucht, ihn trotzdem zu programmieren, was zu einem merkwürdigen Durcheinander neuer programmierter Daten und altem, unterbrochenem Löschmüll führte. In jedem Fall ist ein Szenario, in dem ein Block manchmal leer erscheint, kaum unrealistisch.
Supercat

0

Es ist schon einige Jahre her, aber ich wollte dem nachgehen, falls jemand anders vorbeikommt. Es sieht so aus, als ob es heutzutage einige Projekte gibt, die aktiv gewartet werden (Stand: Januar 2020) und Dateisysteme für Mikrocontroller sind, die auf NOR SPI Flash ausgerichtet sind.

Beachten Sie, dass ich diese in keiner Weise getestet habe, aber sie genau das tun, wonach die ursprüngliche Frage gesucht hat: "... Datenstruktur, die eine Sammlung veränderlicher Dateien mit wahlfreiem Zugriff darstellt ..."

https://github.com/ARMmbed/littlefs - Erstellt von ARM, BSD-lizenziert

https://github.com/joembedded/JesFs - Scheint nicht wirklich lizenziert zu sein, wurde aber speziell für SPI NOR Flash entwickelt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.