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
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
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 :-)
Ich benutze den Flash-speicher meines µControllers als Treiber und möchte den mounten.
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 ?
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.