Wie schütze ich die SD-Karte vor unerwarteten Stromausfällen?


18

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?


2
Wenn Sie auf RAW-NAND-Flash mit einem minimalen Dateisystem umgestellt haben, könnten Sie viele der Abstraktionsebenen durchgehen, die derzeit Ihre Fähigkeit zum Festschreiben kleiner Schreibvorgänge behindern, und wahrscheinlich die Fähigkeit erlangen, Teilblockschreibvorgänge sofort durchzuführen, wenn die Daten verfügbar werden. Sie könnten sich auch davor schützen, dass ein Endbenutzer eine Karte mit anderen Leistungsdetails (möglicherweise sogar einer marginalen Grauwertkarte) ersetzt.
Chris Stratton

Antworten:


16

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

  • Eine große Stromversorgungskappe gibt Ihnen 10 ms oder mehr, um die Dinge mit einer SD-Karte zu verpacken, aber drücken Sie nicht Ihr Glück. Verwenden Sie einen Stift an Ihrem Mikrocontroller, um festzustellen, ob Ihre Stromquelle noch in Ordnung ist, und schreiben Sie nicht, wenn Ihre Quelle tot ist.

Danke für die Information. Sehr hilfreich. Ich werde sehen, was ich damit machen kann ...
PICyourBrain

Wie lange würde es Ihrer Meinung nach dauern, alle Nullen auf eine 4-GB-Karte zu schreiben? Scheint lange zu dauern. Haben Sie auch Codebeispiele, die Sie zum Ändern der Funktion fswrite verwenden könnten, um vollständige Schreibvorgänge für ganze Sektoren zuzulassen?
PICyourBrain

Auch wenn Sie alle Nullen in die Datei schreiben. Wie können Sie verfolgen, wo das Ende Ihrer tatsächlichen Daten liegt? Lesen Sie einfach alle Daten am Anfang und finden Sie die Nullenfolge?
PICyourBrain

1
Wenn Sie FAT16 verwenden, sind Sie meiner Meinung nach auf 2 GB beschränkt. Ich glaube, die SD / MMC-Karte verfügt über eine Funktion zum Löschen von Blöcken, die in der MDDFS-Bibliothek anscheinend nicht implementiert ist. Ich habe für mein SD-Kartenprojekt eine proprietäre Codebibliothek verwendet, daher kann ich keine Codebeispiele freigeben. Um die letzten Daten zu finden, müssten Sie lesen, bis Sie alle Nullen in einem Datensatz gefunden haben. Wenn Ihr Datensatz alle 0en sein kann, würde ich empfehlen, einige Daten ungleich Null oder eine Art Trennzeichen hinzuzufügen.
W5VO

6

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.


Das ist ein sehr aufschlussreicher Kommentar.
Fred Basset

5

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.


3

Vielleicht würde dieser Superkondensator bei Sparkfun das Problem lösen.


2
Es würde den Speicher des PIC enthalten, hat jedoch eine maximale Stromstärke von 10 uA. Ich glaube nicht, dass man mit so viel Strom auf eine SD-Karte schreiben kann.
W5VO

1
Das Konzept ist jedoch gut. Eine schnelle Suche ergab, dass der Illinois Capacitor ( illinoiscapacitor.com ) einen Superkondensator von bis zu 8 F hat und Ströme von bis zu 4 A unterstützen kann. Wenn Sie einen dieser Kondensatoren oder eine Batterie hinzufügen, hat das Mikro die Möglichkeit, einen Schreibvorgang abzuschließen und den Betrieb zu beenden Schön, wenn die Hauptstromquelle ausfällt.
Das Photon

3

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?

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.


1

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).

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.