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!
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...
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
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.
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
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
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
Warum legst du immer wieder eine neue Datei an? Schreib doch einfach in EINE Datei immer 500bytes hinteinander rein
> 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.
12Byte eines Sektors, wenn man eine 2GB sd-Karte mit 3906250 hat.
@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
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.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.