Forum: Mikrocontroller und Digitale Elektronik fr_disk_error oder fr_invalid_object nach f_close


von Stanislav (Gast)


Lesenswert?

Moin,

ich bekomme die Fehler fr_disk_error oder fr_invalid_object nach 
ausführen von f_close.
1
fresult1 = f_open(&myFILE, FILENAME_LOG_INC, FA_WRITE|FA_OPEN_APPEND);
2
3
f_write(&myFILE, &MOTCTRL_STRING.cmd, sizeof(MOTCTRL_STRING.cmd), &written_bytes);
4
f_write(&myFILE, "\r\n", strlen("\r\n"), &written_bytes);
5
6
fresult1 = f_close(&myFILE);


Das Schreiben funktioniert soweit auch einige Wiederholungen (ich rufe 
diese Routine sekündlich auf - Datenlogger) jedoch nach einer 
unspezifischen Anzahl an Wiederholungen treten die besagten Fehler auf.

Ich nutze das STM32F407 Nucleo Board, arbeite mit der Bibliothek von 
elmChan (FatFS) und benutze sowohl eine SanDisk 32Gb sowie eine no-name 
8Gb SD-Karte, jeweils mit FAT32 und 32kB formatiert.

Habt Ihr Lösungsvorschläge?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stanislav schrieb:
> Habt Ihr Lösungsvorschläge?
Was passiert, wenn du die Datei nicht dauernd wieder schließt?
Oder wenn du Daten über 30 Sekunden sammelst, dann die Schreibprozedur 
für die ganze Sammlung durchläufst?
Denn die Karte muss ja zwischendurch auch mal wieder Blöcke löschen und 
sonst noch ein wenig "Housekeeping" machen.

Stanislav schrieb:
> ich rufe diese Routine sekündlich auf - Datenlogger
Das ist die sichere Art, eine Karte schnell kaputt zu bekommen. Denn mit 
jedem abgeschlossenen Schreibvorgang muss die FAT aktualisiert werden. 
Und das braucht jeweils einen neuen Block (so wie deine Daten jedesmal 
einen 32kB Block löschen und neu beschreiben). Ungünstig, wenn eine 
Consumer TLC Karte pro Block gerade mal 100 Löschzyklen hat.

Handelsübliche SD Karten sind geeignet zum seltenen Speichern großer 
Datenmengen (so wie z.B. im Handy oder im Fotoapparat). Deine Anwendung 
mit winzigen Datenmengen schnell nacheinander dürfte eine Art 
Killerapplikation sein...

: Bearbeitet durch Moderator
von Stanislav (Gast)


Lesenswert?

Danke für deine schnelle Antwort.

Ich habe zwei Dateien die ich beschreibe.
Deiner Antwort entnehme ich das, dass eine Datei sinnvoller wäre. Ich 
somit aus zwei Dateien eine mache um (unter anderem) die f_close und 
f_open funktion jeweils nur einmal in der gesamten Programlaufzeit 
aufzurufen?
Zudem wäre es besser Messdaten zu sammeln und dann nur alle paar dutzend 
Sekunden zu beschreiben.





Du schreibst von handelsüblichen SD-Karten. Was ist das bewährte 
Speichermedium für ähnliche Aufgaben wie diese in der Industrie?
Bzw. wieviele Löschzyklen erlauben professionellere Karten?

von PittyJ (Gast)


Lesenswert?

Ich habe manchmal die Karten roh beschrieben, d.h. ohne jedes 
Filesystem.
Am Anfang wird die Karte komplett mit 0en beschrieben.
Beim Einschalten sucht sich das Programm den letzten beschriebenen 
Sektor (Binärsuche). Und dann wird immer gepuffert, bis ein Sektor voll 
ist, und dieser dann roh geschrieben.
Die Recordgröße war fix, und es war immer ein Timestamp enthalten.

Das hat ganz gut funktioniert, und vermied häufiges Schreiben in 
FAT-Verwaltungsstrukturen oder ähnlichem.

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.