MMC + FAT16 Assembler Atmega8

Gast #3322665
Lesenswert?

Hallo!

Ich bin gerade dabei meinem Atmega8 FAT16 beizubringen. Ich möchte 
wissen warum RootDirSectors so errechnet wird:

RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) / 
BPB_BytsPerSec;

Note also that this computation rounds up.

Ich habe schon Google befragt, aber keine zufriedenstellende Antwort 
gefunden. Angeblich hat das Aufrunden mit der Konvertierung zwischen CHS 
und LBA zu tun, nur eine Erklärung habe ich nicht gefunden. Jedoch 
spreche ich eine mmc Karte immer per LBA an.

Jedenfalls bin ich bei der oben genannten Rechnung immer 1 Block über 
dem richtigen Ergebnis (habe ein hex dump der Karte im Hexeditor 
analysiert).

z.B RootEntCnt=512; BPB_BytsPerSec=512

(512*32+511)/512=32,998 -> RootDirSectors=33
Jedoch ist RootDirSectors auf der Karte nur 32 Blocks groß. Möglich wäre 
auch das RootDirSectors=33 ein "sizeof" wert ist und ich bei der 
Adressierung -1 rechnen muss. Jedoch stimmt das leider auch nicht.

Irgendwelche Ideen?

Schöne Grüße
Gast #3322675
Lesenswert?

Stefan schrieb:

> RootDirSectors = ((BPB_RootEntCnt * 32) + (BPB_BytsPerSec – 1)) /
> BPB_BytsPerSec;
>
> Note also that this computation rounds up.
>
> Angeblich hat das Aufrunden mit der Konvertierung zwischen CHS
> und LBA zu tun

Nein, hat es nicht. Das hat einfach damit zu tun, daß Platz auf 
Blockmedien eben nur sektorweise belegbar ist und daß auch die letzten 
Einträge des Rootverzeichnisses irgendwo liegen müssen, die keinen 
vollständigen Sektor mehr belegen.

> Jedenfalls bin ich bei der oben genannten Rechnung immer 1 Block über
> dem richtigen Ergebnis (habe ein hex dump der Karte im Hexeditor
> analysiert).
>
> z.B RootEntCnt=512; BPB_BytsPerSec=512
>
> (512*32+511)/512=32,998 -> RootDirSectors=33

Mann, die Division ist eine GANZZAHLDIVISION und ergibt 32!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren