Forum: Mikrocontroller und Digitale Elektronik Frage zu Pointer mit Cast


von S. F. (deffman)


Lesenswert?

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

von T. H. (pumpkin) Benutzerseite


Lesenswert?

#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.

von S. F. (deffman)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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;

von S. F. (deffman)


Lesenswert?

Ahhh okay. Jetzt hab ichs verstanden!

Danke vielmals und noch ein schönes Wochenende!

Gruß Stefan

von Wegstaben V. (wegstabenverbuchsler)


Lesenswert?

> (*((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
Noch kein Account? Hier anmelden.