Ich arbeite an einem Gerät, das die Microchip MDDFS-Bibliothek zum Speichern von Daten auf einer SD-Karte verwendet. Der Logger protokolliert die Daten mit einer maximalen Rate von 1 Eintrag (56 Byte) pro Minute. Das Problem ist, dass das Gerät möglicherweise während einer Schreibsequenz jederzeit die Stromversorgung verliert. Ich frage mich, wie ich meine Daten am besten vor Korruption schützen kann. Ich habe festgestellt, dass alle Daten, die nach dem letzten Schließen der Datei in die Datei geschrieben wurden, verloren gehen, wenn die Datei bei Stromausfall geöffnet ist. Ich weiß nicht, ob das Gleiche gilt, wenn die Stromversorgung in der Mitte der Schreibsequenz unterbrochen wird.
Da der Schreibvorgang nicht sehr häufig vorkommt, konnte ich die Datei jedes Mal öffnen, die Daten schreiben und die Datei dann schließen, wenn Daten protokolliert wurden. Würde dieser Ansatz die SD-Karte im Laufe der Zeit beschädigen?
Ein anderer Ansatz könnte darin bestehen, die Datei offen zu halten, aber nach jeweils 10 oder 50 Schreibvorgängen könnte ich die Datei schließen und erneut öffnen.
Ich könnte auch Daten im Speicher zwischenspeichern und die Daten dann gelegentlich löschen, möglicherweise nach einem kbyte oder so.
Die letzte Idee, die ich hatte, war, in meinem Stromkreis einen großen Kondensator hinzuzufügen, der meine Bild- / SD-Karte lange genug mit Strom versorgt, nachdem die Stromversorgung unterbrochen wurde, um die Datei schnell zu schließen. Das Problem bei diesem Ansatz ist, dass die Zeit, die zum Schließen der Datei und / oder Speichern von Daten benötigt wird, sehr inkonsistent ist. Nach meinem Verständnis kann diese Zeit stark von der aktuellen Position auf einer Flash-Seite abhängen, auf der sich die Datei befindet.
Wie auch immer, was würdet ihr vorschlagen?
Antworten:
Ein paar Dinge können passieren, wenn Sie Daten in eine Datei schreiben. Ich werde die Reihenfolge beschreiben, die für die Sicherheit von Daten erforderlich ist, nicht unbedingt für Bibliotheksaufrufe.
Wenn Sie schreiben und am Ende der Datei hinzufügen (normaler Schreibmodus), lesen Sie den letzten Block der Datei in den Speicher, ändern ihn mit Ihren Schreibdaten und schreiben dann den gesamten Block zurück auf die SD-Karte . Wenn der Block voll ist, muss ein neuer Block in der Dateizuordnungstabelle (FAT) gefunden werden. Nach dem Auffinden eines neuen Blocks muss die FAT aktualisiert werden. Dies ist ein Lese-, Änderungs- und Schreibzyklus. Wenn wir mit der Datei fertig sind, müssen wir die Dateiattribute (z. B. die Dateilänge) im Stammverzeichnis aktualisieren, was einen weiteren Lese-, Änderungs- und Schreibzyklus verursacht.
Minimieren Sie Ihre Schreibzeit
Stellen Sie sicher, dass die Datei bereits Ihre Daten enthält, wenn Sie einen Sektor schreiben. Wenn Sie mit einer großen Datei beginnen und die Daten überschreiben, anstatt sie anzufügen, sind die Daten sicher, sobald der Schreibvorgang für den SD-Kartensektor abgeschlossen ist. Auf diese Weise können Sie ein bis zwei Lese-, Änderungs- und Schreibzyklen vermeiden. Mein Startcode schreibt Nullen in Sektorschritten in eine Datei, bis die SD-Karte voll ist, und spult dann zum Anfang der Datei zurück.
Stellen Sie die Größe Ihrer Dateneinträge so ein, dass eine ganzzahlige Anzahl von Einträgen in einen Sektor passt. Ich würde Ihre Eingaben auf 64 Bytes erhöhen. Dies ist zwar weniger effizient, verhindert jedoch, dass Sie zwei Sektoren lesen, ändern und schreiben müssen.
Erstellen Sie eine Variante der FSwrite-Funktion, mit der Sie ganze Sektoren schreiben können. Wenn Sie den gesamten Sektor im SRAM behalten, geht Ihr Zyklus von "Lesen-Ändern-Schreiben" zu "Ändern-Schreiben".
Lassen Sie PIC und SD so lange wie möglich eingeschaltet
Große Kondensatoren sind gut. 470 uF sollten mehr als genug Leistung bieten, um einen Schreibzyklus zu beenden.
Stellen Sie sicher, dass Ihre Stromquelle den Strom nicht aus Ihrem Reservekondensator zieht! Fügen Sie bei Bedarf eine Diode hinzu.
Erkennen Sie, wann Sie keinen Strom mehr haben
quelle
Ein Problem, das bei SD-Karten (oder MMC, CompactFlash usw.) noch nicht erwähnt wurde, besteht darin, dass eine SD-Karte für den Host im Allgemeinen als eine einfache Sammlung von 512-Byte-Sektoren erscheint, die in beliebiger Reihenfolge gelesen und beschrieben werden können Speichern Sie 528-Byte-Seiten in Gruppen mit jeweils 32 KB, wenn diese nicht größer sind. Die einzigen unterstützten Vorgänge sind entweder das Schreiben auf eine ansonsten leere Seite oder das Löschen einer gesamten Gruppe. Um diese Einschränkung zu umgehen, speichert der Controller auf einer SD-Karte eine Tabelle, in der jeder logische Sektor einer beliebigen physischen Seite zugeordnet werden kann. Wenn eine Anforderung zum Schreiben eines Sektors gestellt wird, findet der Controller irgendwo auf dem Chip eine leere Seite und aktualisiert die Zuordnung mit der neuen Adresse des betreffenden Sektors. Wenn leere Seiten knapp werden oder zu verschiedenen anderen Zeiten,
Dies hat die Bedeutung, dass das Schreiben in einen bestimmten logischen Sektor möglicherweise das Mischen der Daten aus vielen logischen Sektoren erfordert. Wenn dabei etwas schief geht, kann dies zur Beschädigung eines beliebigen Sektors führen - nicht nur des Sektors, für den die Karte geschrieben werden soll. Ein guter SD-Karten-Controller sollte so konzipiert sein, dass er die Datenmischvorgänge so ausführt, dass er bei einem Stromausfall während eines Datenmischvorgangs feststellen kann, welche Teile des Vorgangs abgeschlossen wurden und welche nicht folglich in der Lage sein, den Vorgang ordnungsgemäß abzuschließen. Leider habe ich keine Ahnung, wie man beurteilen kann, ob die 5-Dollar-SD-Karte, die man in einem Discounter gekauft hat, in dieser Hinsicht von Nutzen ist.
Selbst wenn eine SD-Karte absolut perfekt ist, um sicherzustellen, dass jeder Schreibvorgang, der als abgeschlossen gemeldet wurde, tatsächlich einen Stromausfall überlebt (dh ob der gesamte Schreibvorgang ausgeführt wird oder nicht) Dies bedeutet nicht, dass das Host-Betriebssystem keine Probleme haben wird, wenn es einige, aber nicht alle Daten ausführt, die es schreiben möchte. Nichtsdestotrotz ist zu beachten, dass auf der Host-Seite der Software nichts getan werden kann, um Datenverluste durch Stromausfall zu vermeiden, wenn die SD-Karte das Ende des "Schnäppchen" nicht einhalten kann.
quelle
Ich würde auch vorschlagen, eine Art Prüfsumme zu verwenden, um zu überprüfen, ob die Daten auf der SD korrekt sind, wann immer sie gelesen werden müssen.
quelle
Vielleicht würde dieser Superkondensator bei Sparkfun das Problem lösen.
quelle
Wie bei jedem technischen Problem müssen Sie hier Kompromisse eingehen.
Ist es wichtig, dass keine Daten verloren gehen? Dann würde ich das oben machen. Durch den Verlust der Daten würden Sie mehr Schaden erleiden als durch die Zerstörung einer Karte. Möglicherweise möchten Sie eine Art Stresstest durchführen, um festzustellen, wie oft Sie diesen Vorgang ausführen können, bevor die Karte beschädigt wird. Wenn Sie mit der Zeitspanne, die vergangen ist, bevor die Karte unbrauchbar wurde, zufrieden sind und es eine akzeptable Zeitspanne zu sein scheint, bevor Sie die Karte wechseln, würde ich diese Route einschlagen.
quelle
Wenn Sie nur Daten speichern möchten, ist kein Dateisystem erforderlich. Der Schreibvorgang wird direkt über die SPI ausgeführt, indem die Blockadresse ausgewählt wird. Auf diese Weise minimieren Sie die Schreibzeit und das Risiko einer Datenbeschädigung.
Selbst im Falle eines Stromausfalls und ohne Glück verlieren Sie nur einen Eintrag (was auf manchen Systemen möglicherweise akzeptabel ist).
quelle