Guten Morgen zusammen, ich habe eine kleine Frage. Und zwar verstehe ich den folgenden Code noch nicht so richtig, vor allem die zweite Zeile: /* SPI0 */ #define AVR32_SPI0_ADDRESS 0xFFFF2400 #define AVR32_SPI0 (*((volatile avr32_spi_t*)AVR32_SPI0_ADDRESS)) Also soweit ich das verstanden habe ist AVR32_SPI0_ADDRESS die Registeradresse. Und avr32_spi_t ist in einer anderen Klasse ein Struct in dem die Offsets der einzelnen Register wie Modus Register usw. definiert sind. Das sieht so aus: typedef struct avr32_spi_t { union { unsigned long cr ;//0x0000 avr32_spi_cr_t CR ; }; union { unsigned long mr ;//0x0004 avr32_spi_mr_t MR ; }; union { const unsigned long rdr ;//0x0008 const avr32_spi_rdr_t RDR ; }; . . . . . union { const unsigned long version ;//0x00fc const avr32_spi_version_t VERSION ; }; } avr32_spi_t; Ich verstehe nur die Arithmetik von #define AVR32_SPI0 (*((volatile avr32_spi_t*)AVR32_SPI0_ADDRESS)) nicht so wirklich. Gerade das mit den zwei Pointern ist irgendwie verwirrend. AVR32_SPI0 ist doch der Pointer auf die Adresse AVR32_SPI0_ADDRESS oder? Für was ist dann noch das Casting da? Gerade die Form avr32_spi_t* ?! Normal ist doch der Stern vor der Variablen oder? So ich hoffe waren nicht zu viele Fragen auf einmal so früh an nem Samstag morgen. Hoffe ihr könnt mir trotzdem helfen. Gruß Steafn
#define AVR32_SPI0 (*((volatile avr32_spi_t*) AVR32_SPI0_ADDRESS = Adresse. (volatile avr32_spi_t*)AVR32_SPI0_ADDRESS = Behandle o.g. Adresse als Pointer auf den Datentyp avr32_spi_t. (*((volatile avr32_spi_t*)AVR32_SPI0_ADDRESS)) = Nehme Inhalt auf den der o.g. Pointer zeigt. Der Inhalt wird als avr32_spi_t-Datum behandelt.
Vielen Dank, also bis zu deinem letzten Abschnitt ist es mir noch einleuchtend. Nur den letzten Abschnitt habe ich leider noch nicht verstanden. Was ist denn avr32_spi_t-Datum? Bin leider noch ziemlich neu in der C-Programmierung. Wäre nett wenn du das noch ein bisschen genauer erklären könntest.
Er meint mit dem letzten Abschnitt: Das ganze ist dann letzlich das, worauf der Pointer zeigt, und das ist eine avr32_spi_t-Struktur. Du kannst dann also sowas schreiben:
1 | unsigned long test = AVR32_SPI0.cr; |
oder:
1 | avr32_spi_cr_t test = AVR32_SPI0.CR; |
Ahhh okay. Jetzt hab ichs verstanden! Danke vielmals und noch ein schönes Wochenende! Gruß Stefan
> (*((volatile avr32_spi_t*)AVR32_SPI0_ADDRESS)) > = Nehme Inhalt auf den der o.g. Pointer zeigt. Der Inhalt wird als > avr32_spi_t-Datum behandelt. der Pointer zeigt auf ein Objekt, der gemäß der Objektdefinition "typedef struct avr32_spi_t" aufgebaut ist. "Datum" meint hier: = Datenobjekt mit definiertem Datentyp, d.h. definierter Struktur und definiertem Wertebereich. Also das Wort "Datum" nicht als "Zeitinformation", sondern als Singular von "Daten" heißt also: Nimm einfach das Objekt, und verwerte dessen Inhalt, als ob es wie ein avr32_spi_t Objekt aufgebaut wäre (was es ja auch ist)
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.