Hilfe beim Verstehen eines defines

OP #4552471
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
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
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.