Forum: Mikrocontroller und Digitale Elektronik USB Datei- und Dateisystem Korruption


von Flöte (nsolo)


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?

: Bearbeitet durch User
von Harald K. (kirnbichler)


Lesenswert?

Flöte schrieb:
> Bei file write() wird ja nur in den Buffer geschrieben

Kommt drauf an, wie das in Deinem µC-Projekt umgesetzt wird.

Die USB- und die Dateisystemlibrary hast Du offenkundig nicht selbst 
geschrieben, welche verwendest Du also?

von Flöte (nsolo)


Lesenswert?

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

Habs oben rein editiert.

: Bearbeitet durch User
von Irgend W. (Firma: egal) (irgendwer)


Lesenswert?

Flöte schrieb:
> file open()

Machst du die Datei auch jedesmal wieder zu, oder läst du die immer 
offen?
Hast du brownout vernünftig eingestellt? Die Hast du wenigstens in der 
zugehörigen ISR drin das die Datei geschlossen wird. Reicht dein 
Puffer-Elko damit noch genug Zeit bleibt alle offenen Transaktionen 
abzuschließen?

von G. 4. (g457)


Lesenswert?

> 1. Mache ich das richtig?

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

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

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

von Frank K. (fchk)


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

von Flöte (nsolo)


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?

: Bearbeitet durch User
von Flöte (nsolo)


Lesenswert?

Frank K. schrieb:
> USB-Stick auswerfen

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

von Frank K. (fchk)


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

von Alexander (alecxs)


Lesenswert?

Korruption in Dateisystemen kannte ich noch nicht. Werden die 
Verantwortlichen nun vom Journal zur Rechenschaft gezogen?

von Jim M. (turboj)


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.

von Monk (roehrmond)


Lesenswert?

Ich habe die Erfahrung gemacht, dass Flash Speicher manchmal ihren 
Inhalt verlieren, wenn beim Zugriff (auch read-only) die Stromversorgung 
instabil ist. Kontrolliere das.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.