Forum: Mikrocontroller und Digitale Elektronik Hilfe beim Verstehen eines defines


von Alex E. (muchtar)


Lesenswert?

Hey,
ich arbeite mich gerade in FatFs ein und versuche mein Gerät zu mounten. 
Beim mounten kommt jedoch der Fehler:
FR_NO_FILESYSTEM - There is no valid FAT volume on the drive.

Der Fehler taucht hier auf:
if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55)  /* Check boot record 
signature (always placed at offset 510 even if the sector size is >512) 
*/
return 2;

Jetzt wird hier die Funktion LD_WORD(&fs->win[BS_55AA]) != 0xAA55) 
aufgerufen und  fs->win[BS_55AA] = 0xC0.

Die Funktion ist definiert als:
#define LD_WORD(ptr) 
(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))

Meine Frage:
Was passiert genau wenn die Funktion LD_WORD() aufgerufen wird? Ich 
verstehe nicht genau was hier 
"(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))" genau gemacht 
wird.

Danke

von Michael U. (amiga)


Lesenswert?

Hallo,

ohne das aufzudröseln würde ich vermuten, daß er die Byte-Order tauscht.
Falls es eine SD-Card ist. wie ist die eingerichtet? Mit Bootrecord und 
Partition oder als "Superfloppy"?

Gruß aus Berlin
Michael

von Dennis (Gast)


Lesenswert?

Alex E. schrieb:
> Was passiert genau wenn die Funktion LD_WORD() aufgerufen wird?

Er baut dir aus zwei Bytes eine 16 Bit breite Variable. Sieht man doch 
:-)

von Alex E. (muchtar)


Lesenswert?

Ich benutze den Flash-speicher meines µControllers als Treiber und 
möchte den mounten.

von Alex E. (muchtar)


Lesenswert?

Dennis schrieb:

> Er baut dir aus zwei Bytes eine 16 Bit breite Variable. Sieht man doch
> :-)

Wenn ich es sehen würde hätte ich nicht gefragt :D
Kommt das "Bauen" einer 16 Bit Variable durch das <<8 ?

von Georg G. (df2au)


Lesenswert?

Alex E. schrieb:
> Kommt das "Bauen" einer 16 Bit Variable durch das <<8 ?

Ja. Es gibt Prozessoren, die legen bei 16-Bit Werten erst das LSByte und 
dann das MSByte im Speicher ab, bei anderen ist es umgekehrt. Die 
Boot-Kennung besteht aus zwei Bytes. Du kannst sie nacheinander auslesen 
und einzeln vergleichen oder du liest einen 16 Bit Wert und vergleichst 
den komplett - dann aber bitte die beiden Bytes in der richtigen 
Reihenfolge hinlegen. Genau das macht das #define.

von Marc S. (darkchaos)


Lesenswert?

Wenn man es mal auseinander nimmt und die vielen Casts wegnimmt hast du:

return *((BYTE*)ptr + 1) << 8 + *(BYTE*)ptr;

Zunächst: *(type*) ließt einen type von der angegebenen 
Speicheraddresse. Zunächst sagst du also, dass ptr auf ein BYTE zeigt 
und beim dereferenzieren wird eben ein Byte aus diesem Pointer 
ausgelesen.


Das gleiche tust du für ptr + 1, also das danachfolgende Byte, schiebst 
aber das Ergebnis um 8-Bit bzw. 1 Byte nach Vorne.


Insofern sind beide Antworten richtig: Er tauscht die Byteorder (denn 
sonst gehörte das erstere Byte an die erstere Stelle) und er ließt von 
einer RAM-Adresse einen 16-bit Integer.

von Alex E. (muchtar)


Lesenswert?

Alles klar danke

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.