Hi,
kurze Frage an die FAT Experten. In nem Cluster 4 (ab Sektor 711) sind
bei mir 36 Sektoren. Dort ist der Inhalt einer TXT Datei laut FAT. Wenn
ich ab Cluster 4 den ersten Sektor ausgebe, kommt erst jede Menge
Quatsch und dann der richtige Inhalt.
Ist es nicht festgelegt das die Daten immer im 1ten Sektor des Clusters
anfangen muss ? Oder kann das dort abgelegt sein wie es will ?
MfG
David
In einem Cluster sind mit Sicherheit NIE 36 Sektoren enthalten. Das sind
immer glatte Zweierpotenzen.
Dein Algorithmus zur Clustergrößenberechnung scheint daher fehlerhaft zu
sein, und damit auch die Bestimmung der zu einem Cluster gehörenden
Sektoren.
das interessiert mich nicht, die nummern sind fiktiv, ich wollte eig.
nur wissen ob daten im cluster immer bei sektor 1 beginnen.
aber hier: mein cluster offset ist sektor 647 da fängt der erste cluster
an, und 711 ist der zweite cluster usw.
Alle Sektoren, aus denen ein Cluster besteht, sind linear hintereinander
angeordnet, der erste Sektor ist der erste Sektor.
Wenn Du eine bekannte Datei liest, aber der erwartete Inhalt nicht an
der erwarteten Stelle steht, hast Du einen Positionierungsfehler.
Um wieviele Sektoren (512-Byte-Schritte) ist denn Dein Dateianfang
verschoben?
Dein "cluster offset" ist vermutlich um genau diesen Wert zu klein.
hey rufus,
des problem war tat. das meine clustergröße falsch war, ich habe mit
einer Funktion init die clustergröße rausgelesen
unsigned char cluster_size;
1
init()
2
{
3
cluster_size=Buffer[13];// ist 64
4
fat_root_dir();
5
// nach rückkehren der funktion // plötzlich 36
6
}
7
8
unsignedintfat_root_dir(unsignedchar*Buffer)
9
{
10
unsignedintFirstRootDirSecNum;
11
unsignedcharNumFATs;
12
unsignedshortFATSz16;
13
14
mmc_read_sector(volume_boot_record_addr,Buffer);
15
NumFATs=Buffer[16];
16
FATSz16=Buffer[22]+(Buffer[23]<<8);
17
18
//berechnet den ersten Sector des Root Directory --> VBR_ADR + reservierte Sektoren + (NumFATs * Sektoren per FAT)
jo, wie gesagt passt schon, das problem ist das meine variable geändert
wird ohne dass ich was dran mache. Es gibt auch keine Referenz darauf,
hmm...
wenn ich die variable mit const deklariere und den 1ten zugriff
rausmache, dann meckert der compiler nicht, also kann ich davon
ausgehen, dass mir die niemand mit der original referenz ändert
im prinzip sinds zwei funktionen, ich ruf die init auf, und in der init
die fat_root_dir, und wenn ich von der fat_root_dir zurückkehre ist
meine variable ansatt 64, 36 außer ich mach se static
>FAT_DEBUG("cluser size :%d \n",cluster_size); // ist 36 !!!
Ob das wirklich so ist?
Du verrechnest dich dauernd! Und das an mehreren Stellen.
fat_offset = Buffer[14] + (Buffer[15] << 8);
Was ist ein unsigned char wert << 8? Genau, Null.
fat_offset = Buffer[14] + ((uint16_t)Buffer[15] << 8);