Hilfe beim Verstehen eines defines

OP #4552471
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
#4552588
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.
#4552589
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.

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