Hallo zusammen!
Ich habe eine ganz weit hergeholte Frage: Hab hier einen Treiber für FAT32 geerbt, mit dem ein Mikrocontroller auf eine SD-Karte schreiben soll. Die Karte hat 2GB in Sektoren von 512 Byte. Blöderweise kann der Treiber nicht an bestehende Dateien anhängen. Das hab ich jetzt versucht ihm beizubringen, aber mit wenig Erfolg. Beim Versuch, das Ganze zu debuggen, stoße ich auf mehrere Probleme:
1. Ich krieg die SD-Karte nicht mehr sauber. Ein einfaches Formatieren unter Windows XP hinterlässt noch jede Menge Daten - kann ich die nicht irgendwie wipen, also mit Nullen füllen?
Ich habe mittels eines Hex-Editors den Verdacht entwickelt (kann ich wegen 1. nicht genau sagen), dass meine angehängten Testdaten tatsächlich auf der Karte landen, aber leider nicht da, wo die FAT sie findet. Leider hab ich keine Ahnung, wie eine FAT funktioniert. Hab mir einiges zusammengereimt, bin mir aber nicht so sicher, was davon stimmt. Kann mir vielleicht jemand was zu den Folgenden Fragen sagen? Oder einen Literaturtipp geben?
2. Ist die FAT ein zusammenhängender Block am Anfang der Karte?
3. Der Sektor scheint die kleinste Einheit der SD-Karte zu sein. Kann jeder Sektor nur zu einer Datei gehören?
4. Es gibt doch Fragmentation - heißt das, dass in der FAT unter dem Eintrag der Datei nur die Nummer des ersten datenbeinhaltenden Sektors steht, und von da ab zu jedem datenbeinhaltenden Sektor die Nummer des die nächsten Daten beinhaltenden Sektors?
5. Wie funktioniert anhängen? Wenn ich immer den kompletten Sektor schreiben muss - soll ich dann den beim ersten Anlegen der Datei geschriebenen Sektor einfach einlesen, meine neuen Daten hintendranhängen und das Ganze wieder an dieselbe Stelle schreiben, an der es stand?
Ich weiß, dass das hier alles ziemlich konfus ist. Gerne liefer ich noch Informationen nach. Auf einen der Beispielcodes von mikrocontroller.net umzusteigen kommt nicht in Frage, weil wir jetzt nicht das Ganze Projekt auseinanderrupfen wollen. Meinen Treiber posten ebenfalls nicht (zwecks Geheimhaltung). Aber wenn mir trotzdem jemand einen Anhaltspunkt geben könnte, wäre das ganz toll.
Liebe Grüße,
Severin
low-level-FAT-Programmierung auf SD-Karte
-
- Beiträge: 197
- Registriert: 22.08.2005 19:58:49
- Lizenz eigener Beiträge: Artistic Lizenz
- Wohnort: Aachen
Re: low-level-FAT-Programmierung auf SD-Karte
Dann hast Du das Dateisystem kaputtgemacht. Das Formatieren sollte aber eigentlich eine neue FAT schreiben. Möglich, daß auch Windows da was falsch macht.severin hat geschrieben:[…] Hab hier einen Treiber für FAT32 geerbt […] Blöderweise kann der Treiber nicht an bestehende Dateien anhängen. Das hab ich jetzt versucht ihm beizubringen, aber mit wenig Erfolg. Beim Versuch, das Ganze zu debuggen, stoße ich auf mehrere Probleme:
1. Ich krieg die SD-Karte nicht mehr sauber. Ein einfaches Formatieren unter Windows XP hinterlässt noch jede Menge Daten - kann ich die nicht irgendwie wipen, also mit Nullen füllen?
Nein, es kann N Kopien der FAT geben mit normalerweise N=2. Das darf man aber nicht voraussetzen, wenn man nicht sehr unsauber programmieren will. Deren Anzahl und wo die Kopien zu finden sind, wird beim Formatieren festgelegt. Auch das Wurzelverzeichnis steht an einer bestimmten Stelle und hat eine festgelegte Anzahl möglicher Eintragungen. Inwieweit das bei FAT32 anders als bei FAT12 und FAT16 ist, weiß ich nicht auswendig.severin hat geschrieben:[…] 2. Ist die FAT ein zusammenhängender Block am Anfang der Karte?
Ja, das ist so. Der Rest nach dem letzten Byte (die Dateilänge ist ja bekannt) ist verschwendeter Platz. FAT mißt nach "Zuordnungseinheiten" die ein ganzzahliges Vielfaches der Sektorenzahl sind, also Z=1…64 Sektoren (alte FAT16) oder 128 (zum Beispiel FAT16 bei Windows NT, Größe der Blöcke 64kB, Linux kann das auch inder Nicht-Norm-Größe). Frage mich nicht nach der Grenze bei FAT32, jedenfalls sind die "Blockadressen" bei den traditionellen FATs immer Zahlen mit endlicher Länge, das heißt bei größeren Dateisystemen muß man größere Blöcke als die mindestens 512 Bytes Sektorengröße nehmen und kommt dann auf eine maximale Partitionsgröße, früher mal 2GiB.severin hat geschrieben:3. Der Sektor scheint die kleinste Einheit der SD-Karte zu sein. Kann jeder Sektor nur zu einer Datei gehören?
Gemessen wird in Zuordnungseinheiten und die sind verkettet, soweit ich mich erinnere.severin hat geschrieben:4. Es gibt doch Fragmentation - heißt das, dass in der FAT unter dem Eintrag der Datei nur die Nummer des ersten datenbeinhaltenden Sektors steht, und von da ab zu jedem datenbeinhaltenden Sektor die Nummer des die nächsten Daten beinhaltenden Sektors?
Nein, es ist so, daß Du Dich ans Ende "durchhangeln" mußt, die letzte Zurodnungseinheit einlesen und dann anhängen, aber an das Ende der Daten, nicht ans Ende eines Sektors oder einer Zuordnungseinheit. Schreiben kannst Du nur ganze Sektoren, für den nächsten anzubrechenden mußt Du neuen freien Platz finden. Da Du einen Treiber schreibst, mußt Du Dich um diese Sachen im Prinzip selber kümmern, kannst aber natürlich die Funktion wiederzuverwenden versuchen, die neue Dateien schreibt, das kann er ja offenbar schon.severin hat geschrieben:5. Wie funktioniert anhängen? Wenn ich immer den kompletten Sektor schreiben muss - soll ich dann den beim ersten Anlegen der Datei geschriebenen Sektor einfach einlesen, meine neuen Daten hintendranhängen und das Ganze wieder an dieselbe Stelle schreiben, an der es stand?
Dann frage ich mich, ob Dein Arbeitgeber Hilfe von hier überhaupt verdient hat. Ihr wollt auf unser Wissen hier kostenlos zugreifen, aber selber mit nichts rausrücken? Nachlesen gehe ich dafür jedenfalls jetzt schon mal nirgendwo mehr, was ich so aus dem Kopf über FAT weiß, muß dann halt genügen. Deine Chefs sollten ihre Haltung überdenken oder das Teil neu schreiben oder sich selber die Zähne dran ausbeißen oder Dir ein Buch über FAT-Dateisysteme spendieren. Gib denen das hier ruhig zu lesen. Wenn das kein öffentliches Forum wäre, hätte ich mich noch weitaus unfeiner ausgedrückt.severin hat geschrieben:Ich weiß, dass das hier alles ziemlich konfus ist. Gerne liefer ich noch Informationen nach. Auf einen der Beispielcodes von mikrocontroller.net umzusteigen kommt nicht in Frage, weil wir jetzt nicht das Ganze Projekt auseinanderrupfen wollen. Meinen Treiber posten ebenfalls nicht (zwecks Geheimhaltung).
Christoph
- bmario
- Beiträge: 1257
- Registriert: 05.09.2007 12:15:47
- Lizenz eigener Beiträge: MIT Lizenz
- Wohnort: Dresden
Re: low-level-FAT-Programmierung auf SD-Karte
Nichts zu tun ist viel besser,
als mit viel Mühe nichts zu schaffen. - Laotse
als mit viel Mühe nichts zu schaffen. - Laotse
-
- Beiträge: 5625
- Registriert: 30.12.2004 15:31:07
- Wohnort: Wegberg
Re: low-level-FAT-Programmierung auf SD-Karte
Hallo
Dann lies mal den Artikel in der Elektor, Januar 2011, FAt embedded , S.48ff
Da wird FAT sehr nett erklärt incl. FAT-libraries als Open-Source, außerdem ist für dich dann auch interessant der Infokasten im Artikel (SD-Karten und Lizenzen, S.50 unten)!
mfg
schwedenmann
Dann lies mal den Artikel in der Elektor, Januar 2011, FAt embedded , S.48ff
Da wird FAT sehr nett erklärt incl. FAT-libraries als Open-Source, außerdem ist für dich dann auch interessant der Infokasten im Artikel (SD-Karten und Lizenzen, S.50 unten)!
mfg
schwedenmann