Forum: Mikrocontroller und Digitale Elektronik FAT32 allg. + Schreibzugriff


von Ralf (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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?

von Ralf (Gast)


Lesenswert?

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

von Uwe (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Richard (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Richard (Gast)


Lesenswert?

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

von Andreas Auer (Gast)


Lesenswert?

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

von Ralf (Gast)


Lesenswert?

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

von Richard (Gast)


Lesenswert?

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

von Andreas Auer (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.