Forum: Mikrocontroller und Digitale Elektronik Datei mit bestimmter größe allozieren - FAT16 Dateisystem


von Marcus (Gast)


Lesenswert?

Hallo,

ich verwende für einen Datenlogger das FAT-Library von Holger Klabunde, 
soweit funktioniert schreiben und lesen derzeit auch.

Da ich jedoch jede Sekunde logge und somit leider auch die Dateigröße 
sich jede Sekunde ändert, leben meine SD - Karten nicht lange.

Verstehe ich das jetzt richtig, dass ich lediglich die endgültige 
Dateigröße (eine Datei pro Tag) in den FAT Eintrag (Filesize) eintragen 
muß und sollange, freie Cluster allozieren kann, bis die Dateigröße 
erreicht ist?
Anschließend wie unter Linux auch die Datei mittels fseek quasi füllen?
Was hab ich übersehen? Kenne mich leider nicht soo gut mit FAT aus.

Gruß MArcus

von Schoasch (Gast)


Lesenswert?

Im Grunde ja, bei FAT 32 muss man aber aufpassen, da ich da soetwas wie 
einen Eintrag für alle freien Cluster gesehen habe. Bei FAT 16 Kannst du 
die Bytes im Datensektor ruhigen Gewissens ändern. das interessiert das 
Fatsystem nicht die Bohne

von holger (Gast)


Lesenswert?

Hi Marcus, konntest nicht auf meine E-Mail Antwort warten ?

Na gut, dann machen wirs halt hier.

>Da ich jedoch jede Sekunde logge und somit leider auch die Dateigröße
>sich jede Sekunde ändert, leben meine SD - Karten nicht lange.

Sterben die wirklich ? Das wär ja mal was für die ct.

>Verstehe ich das jetzt richtig, dass ich lediglich die endgültige
>Dateigröße (eine Datei pro Tag) in den FAT Eintrag (Filesize) eintragen
>muß und sollange, freie Cluster allozieren kann, bis die Dateigröße
>erreicht ist?
>Anschließend wie unter Linux auch die Datei mittels fseek quasi füllen?
>Was hab ich übersehen? Kenne mich leider nicht soo gut mit FAT aus.

FileSize steht im Verzeichniseintrag! Nicht in der FAT.
Fummel nicht selber an FileSize rum, das ist nur meinen FAT
Routinen erlaubt. Lesen darfst du es. Das allozieren von Clustern
machen die auch selbstständig. Du solltest nicht versuchen dies auf
eigene Faust zu tun. Fseek über FileSize hinaus alloziert bei meinem
FAT System (noch) keine neuen Cluster. Fseek geht bisher nur bis
FileSize.

Du willst einmal pro Sekunde Daten schreiben. Dann solltest du nicht
die Datei öffnen, schreiben und gleich wieder schließen. Beim schließen
werden neue FAT Einträge und der Verzeichniseintrag der Datei 
aufgefrischt.
Und das dann jede Sekunde. Halte die Datei einfach so lange offen wie du
es vertreten kannst. Schließe sie z.B. nur alle 60s,120s,240s... oder
rufe in diesen Zeitabständen Fflush auf ohne die Datei zu schließen.

Wenn du Schreibzugriffe auf die Karte minimieren willst gibt es
mehrere Möglichkeiten:

1. Lass 11MB Leerdateien schon von Win/Linux schreiben.
   Dann sind keine Schreibzugriffe auf FAT-/Verzeichnissektoren mit
   meinem FAT Programm mehr nötig.

2. Erzeuge mit meinem FAT Programm erstmal eine 11MB Leerdatei.
   Das wird allerdings einige Sekunden/Minuten je nach Karte dauern.
   Der Verzeichniseintrag mit FileSize wird dann aber nur ein mal 
gemacht.

3. Benutze den FAT Buffer
   Im Idealfall wird bei FAT16 dann nur alle 256 Cluster, bei FAT32
   nur alle 128 Cluster ein FAT Schreibzugriff nötig. Solange die Datei
   offen bleibt! Fclose schreibt den FAT Buffer.

4. Formatiere die Karte mit möglichst großen Clustern
   Je größer die Cluster sind, desto weniger FAT Zugriffe sind nötig.

Es ist zur Zeit nicht möglich mit meinem FAT Programm eine Datei
bestimmter Größe zu erzeugen ohne die Dateisektoren zu
beschreiben. Da werd ich mal drüber nachdenken ;)

Gruß
 holger

von holger (Gast)


Lesenswert?

Nachtrag:

>1. Lass 11MB Leerdateien schon von Win/Linux schreiben.
>   Dann sind keine Schreibzugriffe auf FAT-/Verzeichnissektoren mit
>   meinem FAT Programm mehr nötig.

Das war jetzt nicht ganz richtig :(
Fclose schreibt auf jeden Fall den Verzeichniseintrag.
Das ist nötig um die Zeit des letzten Schreibzugriffs zu speichern.

Verbesserung: Halte die Datei so lange offen wie es vertretbar ist.

von Marcus (Gast)


Lesenswert?

Hallo Holger,

doch, hätte auch auf die Antwort von Dir noch gewartet, aber der 
Basteldrang hatte "vorrang". Hab gestern abend schon versucht da was 
dran zu ändern bzw. das auszuprobieren und Deine Routinen so anzupassen. 
Nur leider stand ich mir beim FAT auf dem Schlauch, daher die Frage an 
die Allgemeinheit.

Deine Idee mit den 11MB großen Dateien ist nicht gerade schlecht.

Leider mußte ich bei den letzten Tests mit PC und AD - Wandler via UART 
als Logger feststellen, dass zwei Karten abgeraucht sind. Beide hatten 
512MB und waren eher von der Sorte sehr alt. Aber trozdem ist es 
unschön, wenn ein großer Teil der Daten verloren geht. Daher hab ich mir 
gesagt, ich bau es jetzt mit einem AVR - braucht weniger Strom - und ich 
hab mehr Möglichkeiten da direkt Einfluß drauf zu nehmen.

Die Dateien kann ich grundsätzlich einen Tag lang offen halten, muß nur 
regelmäßig den Puffer schreiben, und das dann so alle 5 - 10 Sekunden.
Daher auch die Idee mit der Dateigröße, dann kann eigentlich passieren, 
was will, lediglich der letzte Schreibzugriff wird falsch geloggt. Was 
aber meiner Meinung nach kein wirkliches Problem darstellt, da ich ja 
aus der Verzeichnissstruktur ersehen kann, welche Daten da sind und 
welche nicht.

Es wäre für mich wichtiger, eine gültige Struktur zu haben und ein 
Handel für die Datei (=> möglich wenig Speicherverbrauch), so dass nur 
max ein Cluster Müll ist, denn die Dateigröße ist ja fix.

In wie weit ist das denn mit Deinem jetzigen Library möglich?

Gruß Marcus

PS: gern auch per PM

von holger (Gast)


Lesenswert?

>Es wäre für mich wichtiger, eine gültige Struktur zu haben und ein
>Handel für die Datei (=> möglich wenig Speicherverbrauch), so dass nur
>max ein Cluster Müll ist, denn die Dateigröße ist ja fix.

>In wie weit ist das denn mit Deinem jetzigen Library möglich?

Wenn die Datei bereits existiert, alle Cluster in der FAT
eingetragen sind, sowie die Dateigröße fix ist, kannst du eigentlich
nur einen Sektor an Daten verlieren. Wenn der Strom ausfällt
können aber ganz merkwürdige Dinge passieren wenn dabei auf
die Karte geschrieben wird :( Da sollte ne Notstromversorgung
mit Stromausfallerkennung dafür sorgen das wenigstens alle
gesammelten Daten noch geschrieben werden können. Das Problem
ist dann zu erkennen wie viele Daten in der Datei gültig sind.
Z.B. mehr als vier Nullen nacheinander bedeutet Dateiende.
Oder sowas in der Art. Bei dynamischer Erweiterung der Datei
und mit FAT Buffer kann es ganz übel kommen bei Stromausfall.
Das sind halt die Tücken bei FAT. Bei NTFS oder EXT3 hast du da aber
auch die Ars..karte gezogen ;)

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.