mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik fr_disk_error oder fr_invalid_object nach f_close


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Stanislav (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich bekomme die Fehler fr_disk_error oder fr_invalid_object nach 
ausführen von f_close.
fresult1 = f_open(&myFILE, FILENAME_LOG_INC, FA_WRITE|FA_OPEN_APPEND);

f_write(&myFILE, &MOTCTRL_STRING.cmd, sizeof(MOTCTRL_STRING.cmd), &written_bytes);
f_write(&myFILE, "\r\n", strlen("\r\n"), &written_bytes);

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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.