Forum: Mikrocontroller und Digitale Elektronik SD-Karte mit FAT und viele Dateien Geschwindigkeit?


von Nico (prinzenrolle)


Lesenswert?

Hallo,
ich habe einige Probleme/Fragen beim Datenloggen mit FAT.

Ich würde gerne alle X Sekunden etwas 500 Byte auf eine SD-Karte 
schreiben.
Ich nutze einen PIC und die MDD Library von Microchip.

Das schreiben der Daten funktioniert ohne Probleme.

Jetzt ist mir aber aufgefallen: Wenn umso mehr Dateien (>500) im "root" 
Verzeichnis liegen dauert das Schreiben einer neuen Datei länger.
-------
Logger()
- Datei anlegen
- Daten in die Datei schreiben
- Datei beenden
- Dateiname++
-----
Dieser Vorgang dauert bei steigender Anzahl von Dateien länger.
Dies ist natürlich schlecht und nicht gewollt.
Ich vermute das dies mit der FAT zusammenhängt und dem Suchen der 
nächsten freien Cluster oder?

Bis jetzt wurden alle Daten in das Wurzelverzeichnis geschrieben.
Schreibe ich nun immer x Dateien in einen Ordner, umgehe ich dann dieses 
Problem?

Oder schreibe ich die Daten am Besten direkt auf die Karte, ohne ein 
Dateisystem? Es ist nicht zwingend notwendig die Daten auf dem PC 
auszuwerten.

Über Hilfe, Vorschläge und oder Tipps bin ich sehr dankbar!

von Colt F. (Firma: TUC) (coltfish)


Lesenswert?

Nico Becker schrieb:
> Dieser Vorgang dauert bei steigender Anzahl von Dateien länger.
> Ich vermute das dies mit der FAT zusammenhängt und dem Suchen der
> nächsten freien Cluster oder?
So ist es.

> Bis jetzt wurden alle Daten in das Wurzelverzeichnis geschrieben.
> Schreibe ich nun immer x Dateien in einen Ordner, umgehe ich dann dieses
> Problem?
Ja, das könnte helfen.

> Oder schreibe ich die Daten am Besten direkt auf die Karte, ohne ein
> Dateisystem? Es ist nicht zwingend notwendig die Daten auf dem PC
> auszuwerten.
Das würde auf jeden Fall Performanceprobleme lösen, allerdings müsstest 
Du dann vermutlich noch einige Zeit in die Verwaltung Deines eigenen 
"Dateisystems" investieren und Du verlierst die Flexibilität der 
aktuellen Lösung.
Die Microchip-FAT ist nicht schlecht, sie stellt sehr viele Funktionen 
recht bequem zur Verfügung. Die Performance ist allerdings miserabel. 
Allerdings kann man die Library gut "tunen" um eine bessere Performance 
zu erreichen. Leider muss man sich dafür bereits sehr gut mit der 
Materie auskennen... und dann ist der Schritt zu einem eigenen 
Filesystem nicht mehr allzu weit.

> Über Hilfe, Vorschläge und oder Tipps bin ich sehr dankbar!
Du musst nur verhindern, dass die Suche nach dem nächsten freien Cluster 
immer am Anfang des Verzeichnisses beginnt, sondern erst nach dem 
zuletzt beschriebenen. Das beschleunigt die Sache auf jeden Fall. Die 
Funktionen FileFind, FindFirst, FindNext sind dazu vermutlich zu 
modifizieren. Und das ist nicht ganz ohne...

von Sebastian (Gast)


Lesenswert?

Wenn es an der Suche nach dem nächsten freien Cluster liegt helfen 
Unterordner nicht, denn auch dann musst du ja erstmal einen freien 
Cluster finden. Es könnte aber durchaus dein Problem sein.

Könnte auch sein, dass dein Root-verzeichnis zu groß wird. Dann muss er 
zwischendring FAT nachladen, dann wieder den nächsten Cluster von 
Root...

Wenn du wenige große Dateien hast ist wahrscheinlich ersteres dein 
Problem, bei vielen sehr kleinen wohl ehr letzteres. Genaues kann man 
nur sagen, wenn man deine Dateien (Größe und Ort) und die 
Implementierung des FAT kennt.


Je nachdem wie regelmäßig deine Dateien sind kann es sich wirklich 
lohnen einfach direkt auf die Karte zu schreiben. Einen linearen Stream 
z.B. würde ich nicht erst in Dateien zerlegen und dem Dateisystem 
übergeben.

Sebastian

von vlad (Gast)


Lesenswert?

sectorgröße in SD Karten ist 512Byte
beschreib das ding doch einfach im Raw-Modus!
Solltest nur den 1. sektor in Ruhe lassen und am besten eine Datei 
anlegen, die das gesammte Volume belegt, damit nicht ausversehen 
draufgeschrieben, wird, wenn du es an den Rechner packst.

Am rechner kannst du es auch im Raw-Modus öffnen und so auslesen.

Mit ein paar tricks, bekommt man es bestimmt so hin, dass die datei die 
sektoren der Reihe nach belegt, so dass man mit jedem normalen Programm 
das ding öffnen kann.

von Nico (prinzenrolle)


Lesenswert?

hallo,
danke für die Antwort!

Wie schreibe ich denn im raw modus, habe in der MDD Bibliothek nichts 
gefunden?

gruß und danke für die antworten

von vlad (Gast)


Lesenswert?

http://www.ulrichradig.de/home/index.php/avr/mmc-sd
da gibts beispiel code.
da kannst du reinschauen.
in mmc.h
mmc_read_sector und mmc_write_sector

von geb (Gast)


Lesenswert?

Frage an vlad:

Ist man an den 512byte sektor auch im raw-Format gebunden, oder kann man 
grundsätzlich sequentiell hineinschreiben? Was ist mit CRC?
Kann man eine formatierte SD Karte so löschen,daß sie wirklich "raw" ist 
also keinen FAT mehr enthält?

Grüße Gebhard

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Warum legst du immer wieder eine neue Datei an?
Schreib doch einfach in EINE Datei immer 500bytes hinteinander rein

von vlad (Gast)


Lesenswert?

> Ist man an den 512byte sektor auch im raw-Format gebunden, oder kann man
> grundsätzlich sequentiell hineinschreiben? Was ist mit CRC?
ja die 512 byte sind bindend, es muss immer der ganze block geschrieben 
werden, so sieht es das mmc-protokoll vor.
meinst du den CRC, der mitgeschickt werden muss?
Lies dir am besten die kommentare im Code durch, die sind recht 
verständlich.
das ist nur ein dummy-CRC. man kann den CRC check allerdings per 
kommando an die karte aktivieren.

wenn du nur 500Bytes schreiben wills, würd ich die restlichen einfach 
ignorieren, was sind schon 12Byte, wenn man eine 2GB sd-Karte mit 
3906250 hat.



>Kann man eine formatierte SD Karte so löschen,daß sie wirklich "raw" ist
>also keinen FAT mehr enthält?
Genau weiß ich das mit dem Dateisystem jetzt aber auch nicht, aber wenn 
du den ersten (oder nullten, je nach zählweise, weiß grad nicht wo man 
da anfängt) sector überschreibst, dann machst du die Partitionstabelle 
kaputt. Kann sein, dass das FAT woanders liegt. Müsste man ja aus der 
FAT-Implementierung von Ulli Radig rauskriegen.
sobald man die Karte in den rechner steckt und darauf zugreift (bei win 
zumindest) bekommt man gesagt, dass der Datenträger unformatiert ist und 
man bitte formatieren soll.

Deswegen mein Vorschlag, das ding zu formatieren und eine große 
Platzhalterdatei drauf machen (und klären, wo man hinscreiben darf, ohne 
das FAT zu zerstören).
Dannn kann man nicht ausversehen die Daten, die auf der Karte sind 
überschreiben.

von vlad (Gast)


Lesenswert?

12Byte eines Sektors, wenn man eine 2GB sd-Karte mit
3906250  hat.

von geb (Gast)


Lesenswert?

@vlad

Ich glaube wir haben uns mißverstanden.
Ich hätte das ganze gern für einen bestehenden Datenlogger,wobei die SD 
Karte immer drin bleibt und nur bei Bedarf über den MC ausgelesenwird.
Momentan hab ich fürs loggen große Flash-Speicher, die ich selbst 
verwalte.
Da´gibts bei mir kein File System. Die Datensätze sind immer gleich 
groß, passen aber nicht in das 512byte Raster. im schlechtesten Fall 
wäre dann halt fast die Hälfte des SD-Speichers verloren. (muß meine 
Daten immer sofort abspeichern wegen Verlust bei Stromausfall) Ja, am 
liebsten wär mir halt ein Speicher, der sich gleich wie das bestehende 
Flash beschreiben läßt. Scheint bei der SD Geschichte nicht wirklich zu 
funktionieren, oder?

Grüße gebhard

von vlad (Gast)


Lesenswert?

warum wär die hälfte verloren?
wenn du immer 500Byte blöcke hast, ist das doch ok, wie gesagt, die 12 
Byte die da pro Block übrig pleiben. Das sind bei einer 2GB karte etwas 
unter 50MB.

Bei der SD karte brauchst du dich  ja auch um nix kümmern, du gibst der 
Funktion den sektor wos hinsoll und die Date.
Brauchst natürlich genug ram, da du idealerweise 2x512Byte vorhalten 
musst, vielleicht kann mans auch optimieren, dass man mit 1x auskommt.
man könnte die funktionen aber sicherlich auch so anpassen, dass man 
nach Bedarf bytes rüberschiebt undmit kleineren Puffern auskommt. Da man 
der SD-Karte den Takt ja vorgibt, kann man die ja warten lassen.

>Karte immer drin bleibt und nur bei Bedarf über den MC ausgelesenwird

Das macht das ganze ja noch einfacher, dann ist die Karte für dich nix 
anderes, als ein SPI-Flash, wobei ich anstatt die Karte aufs board zu 
löten, einen mini-oder micro-Adapter drauflöten würde, dann kann man die 
Karte nämlich trotzdem entfernen und muss nicht über den langsamen µC 
2GB an Daten schaufeln.

von geb (Gast)


Lesenswert?

@vlad

wenn ich richtig verstanden habe, meinst du, daß man z. B. 350 Bytes (1 
Block) schreibt,dann wartet bis der nächste Block berechnet ist, dann 
162 Bytes davon in den alten sektor schreibt und dann die restlichen 188 
bytes in einen neuen Sektor schreibt. Hmmm.. könnte man mit einer State 
machine gut lösen.
Könnte da noch Ungemach sein, wenn mann einen Sektor nicht 
vollgeschrieben hat und die Versorgung fällt aus ?

liebe Grüße Gebhard

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich glaube er meint das schon so wie er schreibt:

von den 512bytes eines Sektors benuzt du nur 500 bytes die restlichen 
12bytes schreibst du z.B. mit einer Definierten Bytefolge, einer 
Checksumme, CRC oder dem Geburtsdatum deiner Cousine voll. (auf die Art 
erkennst du dann auch "volle" von Leeren Sektoren/Blöcken falls während 
des Schreibens ein Fehler/Stromausfall auftritt.

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.