mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Pointer mit Cast


Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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:
unsigned long test = AVR32_SPI0.cr;
oder:
avr32_spi_cr_t test = AVR32_SPI0.CR;

Autor: S. F. (deffman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhh okay. Jetzt hab ichs verstanden!

Danke vielmals und noch ein schönes Wochenende!

Gruß Stefan

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.