Compilierfehler mit #define

Gast #5726763
Lesenswert?

Hallo,

ich möchte die tatsächlich benutzten Peripheriemodule in einer 
Headerdatei mit #defines angeben/festlegen.

Beim Xmega sind in der ioxxx.h Strukturen auf die Peripherieregister 
definiert - Bspw.:
typedef struct USART_struct
{
    register8_t DATA;  /* Data Register */
    register8_t STATUS;  /* Status Register */
    register8_t CTRLA;  /* Control Register A */
    ....
} USART_t;

Normalerweise benutzt man dann im c-Quelltext:
USARTC0.CTRLA= xxx;

Wenn ich schreibe:
#define PC_IF_USART       USARTC0
PC_IF_USART.CTRLA= 0;
Compiliert er fehlerfrei, jedoch gibt A.Studio beim eintippen keine 
Unterstützung der Member (...CTRLA).
Schreibe ich dagegen:
#define PC_IF_USART  ((USART_t *)(&USARTF0))
PC_IF_USART.CTRLA= 0;
Zeigt er mir beim Eintippen die Member an, jedoch meldet der Compiler:
"error: request for member 'CTRLA' in something not a structure or 
union"

Wo ist mein Fehler?
Wie macht man das richtig?
#5726978
Lesenswert?

Anno schrieb:
> Ahh, ja eigentlich klar. Danke.
> Schade nur dass man bei der einfacheren Schreibweise mit
> #define PC_IF_USART       USARTC0
> keine Member-Unterstützung bekommt...

Das sind zwei verschiedene Dinge. Deine beiden #defines sind auch 
abseits des Casts verschieden. Das eine definiert einen neuen Namen für 
die struct, das andere einen neuen Namen für den Zeiger auf die struct.

Wie wäre es denn, wenn du statt
1
#define PC_IF_USART  ((USART_t *)(&USARTF0))

besser
1
#define PC_IF_USART  ((USART_t)(USARTF0))

schreibst?

Dann kannst du später bei
1
  PC_IF_USART.CTRLA= 0;

bleiben und mußt nicht den -> Operator benutzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren