www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FAT16 Sektoren im Cluster Reihenfolge der Belegung


Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry tippfehler sind 64
kein algo. ist einfach aus dem VBR ausgelesen

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wie erklärst Du dann, daß der erste Sektor in einem 64 Sektoren 
(also 32 kiByte) großen Cluster die Nummer 711 haben soll?

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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;
init()
{
cluster_size = Buffer[13];  // ist 64
fat_root_dir();
// nach rückkehren der funktion // plötzlich 36
}

unsigned int fat_root_dir (unsigned char *Buffer) 
{
unsigned int FirstRootDirSecNum;
unsigned char NumFATs;
unsigned short FATSz16;

mmc_read_sector (volume_boot_record_addr,Buffer);
NumFATs = Buffer[16];
FATSz16 = Buffer[22] + (Buffer[23] << 8);

//berechnet den ersten Sector des Root Directory --> VBR_ADR + reservierte Sektoren + (NumFATs * Sektoren per FAT)
FirstRootDirSecNum = ( fat_offset + (NumFATs * FATSz16));
FirstRootDirSecNum+= volume_boot_record_addr;

return(FirstRootDirSecNum);
}
Ich ändere in der Funktion nichts!
wenn ich cluster_size static mache dann merkt er sich den Inhalt.

Komisch oder ?

Autor: oszi40 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schreib einfach was Markantes rein und prüfe dann wo es steht.

http://de.wikipedia.org/wiki/File_Allocation_Table

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohne Deinen Quelltext zu sehen, ist es natürlich schwierig, 
herauszufinden, warum Dein Variablenzugriff fehlschlägt bzw. welcher 
Effekt da auftritt.

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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
unsigned char cluster_size;  // 64 Blöcke je 512 Byte
unsigned int fat_offset;  // reservierte sektoren
unsigned int cluster_offset; // erste cluster
unsigned int volume_boot_record_addr; //sek root verzeichnis

unsigned char TEMP_Buffer[BlockSize];


void fat_init (void)
{
  int i;
  int tmp_size_sek;
        unsigned short byte_per_sekor;

  unsigned char Buffer[BlockSize];

  mmc_read_sector (MASTER_BOOT_RECORD,Buffer); //Read Master Boot Record 
     
    if (Buffer[510] == 0x55 && Buffer[511] == 0xAA)
    {
         FAT_DEBUG("\r\nMBR Signatur found!\r\n");
  tmp_size_sek = Buffer[458] + (Buffer[458] << 8);
  FAT_DEBUG("Part 1 groessee : %d \n", tmp_size_sek );
    }
    else
    {
       FAT_DEBUG("\r\nMBR Signatur not found!\r\n"); 
       while(1);
    }

    volume_boot_record_addr = Buffer[VBR_ADDR] + (Buffer[VBR_ADDR+1] << 8);
    mmc_read_sector (volume_boot_record_addr,Buffer);
  
    if (Buffer[510] == 0x55 && Buffer[511] == 0xAA) FAT_DEBUG("\r\nVBR Signatur found!\r\n");
   
    cluster_size = Buffer[13];
    fat_offset = Buffer[14] + (Buffer[15] << 8);
    byte_per_sekor = Buffer[11] + (Buffer[12] << 8);
    cluster_offset = ((byte_per_sekor * 32)/BlockSize);  
FAT_DEBUG("cluser size :%d \n",cluster_size);  // ist 64 !!!
    cluster_offset += fat_root_dir_addr(Buffer);

FAT_DEBUG("cluser size :%d \n",cluster_size);  // ist 36 !!!


}


//Auslesen der Adresse des Root Directory von Volume Boot Record
unsigned int fat_root_dir_addr (unsigned char *Buffer) 
{

unsigned int FirstRootDirSecNum;
unsigned char NumFATs;
unsigned short FATSz16;
   
//auslesen des Volume Boot Record von der MMC/SD Karte 
mmc_read_sector (volume_boot_record_addr,Buffer);
NumFATs = Buffer[16];
FATSz16 = Buffer[22] + (Buffer[23] << 8);


//berechnet den ersten Sector des Root Directory --> VBR_ADR + reservierte Sektoren + (NumFATs * Sektoren per FAT)
FirstRootDirSecNum = ( fat_offset + (NumFATs * FATSz16));
FirstRootDirSecNum+= volume_boot_record_addr;

return(FirstRootDirSecNum);
}


Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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);

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
holger schrieb:
> Was ist ein unsigned char wert << 8? Genau, Null.
ne, wie kommst du da drauf ?

Habs grad getestet:
unsigned char Buffer[]={0x01, 0x11};
unsigned short fat_offset;
fat_offset = Buffer[0] + (Buffer[1] << 8);
printf("ausgabe: %x\n", fat_offset);

ausgabe: 0x1101

>> so rum is null , also 0

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann ist Dein Compiler gutmütig eingestellt und macht bei 
Schiebeoperationen eine automatische Typerweiterung.

Autor: David Lucinkiewicz (davidl)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo , ich werds auf jeden fall ändern

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.