Forum: Mikrocontroller und Digitale Elektronik MMC + FAT16 Assembler Atmega8


von Stefan (Gast)


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

von c-hater (Gast)


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!

von Stefan (Gast)


Lesenswert?

Alles klar, danke das ergibt jetzt einen Sinn. Ich wusste ich hab 
irgendwo einen blöden Denkfehler.

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.