Hallo Mitstreiter, ich bin dabei mit einem MEGA128 eine CF-Karte (128MB/Toshiba) anzusteuern. Als Dateisystem habe ich ein FAT32 programmiert. Der lesende Zugriff auf das Dateisystem funktioniert soweit auch schon ganz gut. Ich kann also durch das Hauptverzeichnis springen und die ausgewählten Dateien lesen. Soweit mein aktueller Stand, nun zu meinen Fragen: 1. Meine Clustergröße beträgt 2 Sektoren. Jetzt finde ich aber in allen möglichen Dokumentationen bei Speichergrößen von 128MB immer andere Clustergrößen (4Sektoren). Habe ich da vielleicht was übersehen? 2. Wie organisieren richtige Betriebssysteme einen schreibenden Zugriff auf ein Dateisystem? Gibt es hierzu Infos/Links? Habe schon ein wenig gegoogled, aber das meiste bezieht sich nur auf den lesenden Zugriff. Was macht man z.B. wenn Dateien gelöscht werden und der Speicher Lücken aufweist? Ich stelle mir dass ganze so vor, dass ich einfach die FAT durchsuche nach Einträgen, bei denen die untersten 28Bit gleich 0 sind. Bin ich da auf dem richtigen Weg oder gibt es vielleicht noch bessere Lösungen? Viele Grüße, Ralf
Hallo Ralf! Im Elektor-download-Bereich kannst Du in Ausgabe 3/2001 und in Ausgabe 12/2001 Software zur Festplattenansteuerung downloaden. Vielleicht steht da mehr?
Hi Uwe, das ging ja schnell! Habe mir gerade mal die beiden Sachen runtergeladen. Es sieht aber leider auf den ersten Blik so aus, dass dort nur der Zugriff auf die Sektoren implementiert ist. Das funktioniert bei mir inzwischen auch schon. Ich kann also Sektoren schreiben und lesen. Meine Probleme liegen an der Stelle, wie ich Dateien in ein FAT32-Dateisytsem eintrage. Auch wenn der Speicher z.B. nicht an einem Stück belegt ist, d.h bereits vorhandene Dateien gelöscht wurden. Trotzdem danke für die superschnelle Antwort! Viele Grüße, Ralf
Hm schade, aber ich habe ja auch keine Ahnung mehr davon, das Elektronikwissen und das Programmier-Wissen hat bei mir fast 13 Jahre geruht. ;-) Ich bin gerade wieder bei der amateurmäßigen Einarbeitung. Aber eine Idee hätte ich noch. Versuch doch mal, in die Linux-sources zu schauen, die sind im allgemeinen sehr gut kommentiert. Über google sicher auch leicht zu finden. Sorry, daß ich Dir nicht besser helfen kann. Gruß Uwe
Hallo, der Tip mit Linux ist gut (bin zwar kein Linuxer). Werde mal sehen, was sich da finden lässt. Ich hoffe mal, dass ich nicht gleich erschlagen werde von Millionen von Codezeilen ;-) Hat denn vielleicht sonst noch einer irgendwelche Tips, vielleicht direkt aus dem Bereich MC? Zweck meiner Anwendung soll, wie man sich vielleicht schon denken kann, evtl. ein Logger werden. Aber zunächst geht es bei mir nur darum, dass ganze mal zu verstehen und gut zu programmieren. Bis denne, Ralf
Ralf, bei SanDisk gibt's einen "CF Card Host Developer Tool Kit" wo man findet genau was Du suchst, aber es kostet etwas. Die "cluster size" sollst Du eigentlich von der "Drive Information" struktur ablesen. 4k ist erlaubt. Oh, auch bei www.yampp.com findest Du GNU source code fuer ATA und FAT32, fuer Atmel/GCC. CF-spezifisches ATA gibt's bei yampp7, und FAT32 kriegst Du bei yampp3. Beide sind einfach zum kombinieren. Entschuldigt bitte mein Deutsch, bin kein Deutscher... Ciao, Richard Cape Town
Hallo Richard, leider bin ich nur privat auf dem Gebiet unterwegs, weshalb ich kein Geld für Developement Kits habe. Die Clustergröße meiner CF-Karte habe ich aus der Volume-ID der Partition ausgelesen. Sie beträgt bei mir 2, also 1k Clustergröße. Das hatte mich nur ein wenig verwundert, da ich bisher im Netz immer größere Clustergrößen gesehen habe. Es geht also rein ums Verständnis. Mir ist also nicht ganz klar, wie entschieden wird, welche Clustergröße ein Dateisystem verwendet (liegt es an der Größe des Mediums/ Typ des Mediums/ usw.?). Bei den Quellen, die Du angegeben hast gibt es doch soweit ich weiß auch nur Treiber für einen lesenden Zugriff auf FAT32, oder habe ich da was übersehen? Der lesende Zugriff funktioniert bei mir bereits. Ich würde jetzt nur gerne auch Dateien auf meiner CF-Karte speichern. Was ich jedoch nicht so ganz weiß, ist, wie ich am schnellsten freie Cluster finde, wenn die CF-Karte nicht defragmentiert ist. Oder muss ich im schlimmsten Fall immer die ganze FAT (bei mir sind das 970 Sektoren) durchsuchen? Das würde bei mir bedeuten, dass ich zum durchsuchen ca. 1-2 Sekunden brauche, was ich zum schnellen Loggen nicht so prächtig finde. Also bis denne, Ralf
Hallo Ralf,
Die cluster-size ist ungefaehr so bestimmt, aber dies is nur eine
Empfehlung:
DriveSize -> ClusterSize
<512 -> 512b
<=8GB -> 4Kb
<=16GB -> 16Kb
>=32GB -> 32Kb
Dabei ist ein Sektor bei den PC's IDE CF immer 512b. Es ist
moeglich die cluster-size bei den formatieren zu bestimmen und deshalb
soll sich man auf alle moeglichkeiten vorbereiten. Die cluster-size
(eigentlich die Sektors per Cluster) findet man in den
BootParameterBlock (das dritte Byte), genau wie Du es beschrieben
hast.
Bei SanDisk gibt es anscheinend eine komplette FAT32 source. Ich habe
es aber auch nicht gekauft.
Bei mir funktioniert eine vereinfachte read/write version des FAT32s
so: Wenn ich eine neue datei (DE = DirectoryEntry) auf dem CF durch
FAT32 schreiben will, dann suche ich erst nach eine geloeschte Datei.
Nur wenn es keine gibt schliesse ich eine neue DE an. Fuer die
eigentliche datei versuche ich womoeglich nebenliegende Clustern zu
finden. Bei mir geht das noch weil meine Dateien bestimmte groesse
haben. Mit dem fragmentieren ist es bei mir auch problematisch. Ich
verwende einen ATMega162 und da ist einfach nicht genuegend Speicher
fuer mehr Software (nur 16K).
Leider hilft Dir das wenig mit deinem Logging, wo die Filesize
dynamisch wachsen kann :(
1000 sektoren kann ich aber in etwa 450 Millisekunden ablesen (habe
gerade versucht). Das schoene am ATMega162 ist dass man den CF-Karte
einfach als externes RAM anschliessen kann, und der ATMega128 kann das
auch. Bei mir ist die CF-Karte in 8-bit-wide-mode angeschlossen (genau
wie bei SanDisk Application Note 801300106) und die ATA Register sind
in "Memory-mapped" mode ablesbar. Die Kode fuer das Sektorablesen ist
optimiert und in Assembler, alles andere GCC.
Entschuldige bitte mein Deutsch,
Richard,
Cape Town
Hi. Also, ich hab selbst FAT32 auf nem ATMeag162 implementiert. Momentan kann ich zwar auch noch nicht viel mehr als beliebige Dateien zu öffnen und diese bis zum Schluss auszulesen, aber ich kann dir vielleicht doch helfen. Ich hab mir zwecks Doku die FAT32 Spezifikationen von Microsoft geholt. Sind nur ca. 35 Seiten und leicht verständlich. Du möchtest ja wissen, wie man auf die Clustergröße kommt. Wenn die Karte schon mit FAT32 formatiert ist, ist das sowieso kein Problem, weils im Bootsector steht. Wenn du es nicht so einfach aus dem Bootsector auslesen willst/kannst (um etwa die Karte mit deinem uC zu formatieren), dann steht in der MS Doku folgendes: Man kann die verschiedenen FAT Sizes (also FAT12, FAT16 und FAT32) anhand ihrer Clusteranzahl ermitteln. Also musst du umgekehrt dafür sorgen, dass du eine bestimmte Anzahl von Cluster hast. Dann kannst du die Karte ohne weiteres auch zum Beispiel unter Windows weiter als FAT32 Karte lesen/schreiben. Zum wichtigen Part, die Anzahl der Cluster: Dabei werden nur die Cluster gezählt, die auch wirklich zum Speichern von Daten zur Verfügung stehen (also ohne den beiden FAT's und den "Reserved"-Bereich). Also, wenn das Filesystem weniger als 4085 nutzbare Cluster hat, dann ist es FAT12, mehr als 4085 aber weniger als 65525 -> FAT16 und mehr als 65525 -> FAT32. Bezüglich dem Suchen von freien Speicherplätzen. Bei FAT32 gibts da eine Struktur namens FAT32 FSInfo. Die wird normalerweise dazu verwendet, um auf freie Speicherplätze zu zeigen. Wie genau das funktioniert, hab ich mir nicht angesehen. Ich werd auch die FAT einfach nach einem freien Platz durchsuchen. @Richard: Ich verwende auch nen ATMega162. Will aber neben dem Lesen von FAT32 auch das Schreiben auf FAT32, ne Display Ansteuerung, ein USB Modul und ne MP3 Decodierung implementieren. Und ich denke mal, dass sich das auf 16k Flash ausgehen wird. Meine FAT32 Routinen werd ich auf etwa 8-10k unterbringen können. mfg Andreas -- Andreas Auer aauer1 (at) sbox.tugraz.at Student of Telematics http://home.pages.at/aauer1 Graz University of Technology
Hallo @Andreas: Danke für deine Beschreibung. Hätte ich eigentlich wissen müssen, da ich auch die Spec habe. Aber so ist das, manchmal hat man ein Brett vor dem Kopf. Das mit der Struktur FSInfo werde ich mir mal ansehen. Ich glaube, wir habe gerade das gleiche Projekt am laufen. Bin auch an einem MP3-Player mit USB usw. dran. @Richard: Ich betreibe meine CF-Karte auch im Memory Mapped Mode. Das empfand ich als die einfachste Lösung. Meine Routine ist allerdings langsamer wie deine. Habe alles in C geschrieben und bisher noch nichts optimiert. Meine Laufzeit habe ich allerdings auch nur simuliert. müsste es wohl mal richtig messen. Vielen Dank nochmal für eure Hilfe! Viele Grüße, Ralf
Hallo Andreas und Ralf, noch eine gute Quelle fuer FAT32 ist die "Freedos-32" software auf sourceforge.net. Ich habe viel von meinem Software auf den freedos FAT32 Treiber basiert. Andreas, wenn dein MP3 player FAT32 nur "read-only" benutzt, dann passt bestimmt alles hinein. Der yampp3(.com) kann praktisch alles tun was Du da beschrieben hast (aber ohne USB), und das alles auf nur 8KB! Der yampp3 kann soviel ich sehe fast ohne software umschreibung an einer CF-karte angeschlossen werden. Uebrigens, wenn man ueber MP3 und CF spricht, hat jemand schon versuch einen Auto-CD-Wechsler zu emulieren? Ciao, R
Hi @Richard: Also den read-only part für FAT32 hab ich eh schon implementiert. Es geht jetzt im Grunde nur noch darum, auch Files schreiben zu können. Und das ganze auch so, dass die Karte dann unter Windows auch noch funktioniert! Irgendwann in den nächsten 1 bis 2 Wochen werd ich mal schauen wie schnell ich Daten von der CF lesen kann. Werd die dann einfach mal zyklisch ins RAM schreiben. Dann wird man mal sehe, wielange ich für 1 MByte bracuh. Ich hoffe, dass mein Code das schnell schafft (bin auch zuversichtlicht)! Bezüglich Auto-CD-Wechsler hab ich mir noch keine Gedanken gemacht. Mein MP3 Player soll vorerst mal tragbar werden und das mit einer möglichst hohen Laufzeit. Auf der HMpeg Seite glaub ich, dass mal von Auto-CD-Wechslern die Rede war. Die Seite müsste www.h-mpeg.de sein mfg Andreas -- Andreas Auer aauer1 (at) sbox.tugraz.at Student of Telematics http://home.pages.at/aauer1 Graz University of Technology
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.