USB Datei- und Dateisystem Korruption

OP #7473426
Lesenswert?

Hi,

in meinem uC Projekt verwende ich einen USB Stick mit FAT32.

Ich schreibe ein paar Logs und Tabellen, aber auch einen langsamen Datenlogger, der bis auf 1s Abtastrate eingestellt werden kann. Die ganze Geschichte ist weder von der Datenmenge noch Geschwindigkeit sonderlich speziell.

Das System wird einfach über einen Hauptschalter mitten im Betrieb ausgeschaltet, wenn es nicht mehr gebraucht wird.

Jetzt kam immer mal wieder vor, dass entweder Dateien oder das ganze Dateisystem korrupt war und ich den Stick am PC nicht mehr nutzen konnte ohne zu formatieren.

ich habe nun ein Testprogramm geschrieben und ein Relais in die USB Datenleitungen eingeschleift. Damit unterbreche ich beim Schreibvorgang die Verbindung zum Stick um genau "Datenverlust" zu provozieren. Klappt nicht.

Daher frage ich mich, ob ich das richtig mache.

file open() loop: file write() file flush()

Bei flush versuche ich "zeitgleich" über das Relais den Stick zu trennen.

Ist das die richtige zeitliche Stelle? Bei file write() wird ja nur in den Buffer geschrieben und wenn dieser voll ist wohl geflusht.

Ich bin dankbar über antworten:

  1. Mache ich das richtig?
  2. wie verhindere ich eine Datei(system)korruption?
  3. Was muss gerade auf dem Dateisystem ablaufen, dass es zur Korruption kommt?

Wäre wirklich toll, wenn ihr mir den Einstieg erleichtert. Dateisysteme und USB Sticks sind mir im embedded Bereich zwar nicht neu, aber tief bin ich nie eingestiegen.


IDE: e²studio
LIB: Reneas Synergy FileX aus dem SSP 2.2.0
HW: S5D9


Wie fahre ich so einen Schreibvorgang richtig herunter bei power loss? kann ich das über interne Funktionen lösen, ohne Außenbeschaltung?

#7473485
Lesenswert?

  1. Mache ich das richtig?

Ja. Wahrscheinlich glichst du zum falschen Zeitpunkt und kannst es deswegen bisher nicht reproduzieren.

  1. wie verhindere ich eine Datei(system)korruption?

Entweder genug (elektrischen) Puffer vorsehen, dass immer alles konsistent geschrieben wird (dazu zählt dann auch die Datei wieder zu schließen und das Dateisystem und das Gerät zu flushen). Oder eines Dateisystem mit Journaling verwenden (und das Journaling auch wirklich verwenden, nicht nur ein Dateisystem benutzen, dass es ∗könnte∗ wenn man wollte).

Und am Besten beides zusammen.

  1. Was muss gerade auf dem Dateisystem ablaufen, dass es zur Korruption kommt?

Eine Aktion, die bei Unterbrechung zu einem inkonistenten Zustand führt. Schreiben ist häufig so eine :-)

#7473509
Lesenswert?

Flöte schrieb:

Das System wird einfach über einen Hauptschalter mitten im Betrieb ausgeschaltet, wenn es nicht mehr gebraucht wird.

Jetzt kam immer mal wieder vor, dass entweder Dateien oder das ganze Dateisystem korrupt war und ich den Stick am PC nicht mehr nutzen konnte ohne zu formatieren.

Genau.

Dein Problem ist, dass Du "Manged Flash" benutzt. Mananged Flash hat neben dem eigentlichen Flash-Speicher noch einen uC mit eigener Software und eigenem RAM. Der Controller kann im Hintergrund Blöcke verschieben (fürs Wear Leveling) und sonstige Dinge machen, die Du nicht mitbekommst und auch nicht beeinflussen kannst. Wenn Du auf Managed Flash irgendwas schreibst, dann landet das noch lange nicht im Flash, sondern erstmal im RAM des Controllers und wird irgendwann mal weggeschrieben, wenn der interne Controller meint, dass es jetzt Zeit wäre. Du weißt auch nicht, in welchen Teil des Flashes Deine Daten landen - das weiß nur der Controller. Wenn da auf einmal der Strom weg ist, ist das eben doof.

Zu Managed Flash gehören USB-Sticks, SD-Karten, EMMC und SSDs.

Die andere Art von Flash ist Raw Flash, also rohes Flash, wo Du die Flash-Chips selber verwaltest und direkt ohne Controller ansteuerst. Dieses Flash gibts entweder mit SPI oder mit parallelem Interface. Da gibts keinen Controller, der irgendwas im Hintergrund macht, kein verstecktes RAM (außer vielleicht einem Spaltenpuffer), nichts. Wenn Du da einen Block schreibst und das Flash Vollzug meldet, dann sind die Daten tatsächlich sicher. Rohes Flash ist deterministisch, Managed Flash nicht.

Wenn Du also eine robuste Lösung willst, nimmst Du rohes, unmanaged Flash.

Wenn Du managed Flash verwenden willst oder musst, dann musst Du eben verhindern, dass der Strom einfach so plötzlich weg ist. Das darf dann nicht sein - wie auch immer Du das anstellst. Bei einem Power Loss musst Du dann alle Puffer wegschreiben und den USB-Stick auswerfen (was den internen Controller dazu veranlasst, seine internen Puffer wegzuschreiben und sich herunterzufahren). Dafür musst Du irgendwie die benötigte Energie vorhalten, üblicherweise in einer Kondensatorbank.

fchk

OP #7473511
Lesenswert?

ja, das file close habe ich vergessen, sorry.

file create()
loop:
file open()
file write()
file flush()
file close()

Und dabei versuche ich im passenden Moment die USB Leitung zu trennen.

Was hilft mir hier der WDT? Nur dass keine zufälligen Daten geschrieben werden oder auch, dass der (HW?) Prozess schnell abgeschlossen wird?

#7473533
Lesenswert?

Flöte schrieb:

Frank K. schrieb:

USB-Stick auswerfen

Danke für Deinen Text. Wie werfe ich einen USB Stick denn aus? Ich kann dazu nichts finden.

  • SCSI SYNC-CACHE senden (oder das Äquivalent im MSD)
  • SCSI STOP senden (oder das Äquivalent im MSD)
  • USB suspend

Das müsste es sein. Ich kenne jetzt Deinen USB-Stack nicht, die Implementationsdetails musst Du selber rausfinden.

fchk

#7473666
Lesenswert?

Flöte schrieb:

Ist das die richtige zeitliche Stelle?

Eher nicht.

Die empfindliche stelle ist meistens das fclose() weil da der Verszeichniseintrag mit der Dateigröße aktualisiert wird.

Außerdem wird oft auch erst da die FAT aktualisiert - falls der Dateisystem Code einen FAT Puffer hat.

Relais braucht ein paar ms um abzufallen, das kann u.U. zu lagsam sein.

Ich würde hier eher das Bedienkonzept überdenken - der Schalter ist entweder virtuell (also nur an µC Ports die einfach ausgelesen werden) oder nur ein Taster.

Falls man den Hauptschalter beibehalten möchte, bräuchte man ziemlich dicke Elko in der Schaltung die ein paar Sekunden Schreiblast puffern können. Dann kann der µC auf die Abschaltung der Versorgung noch reagieren.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren