Forum: Mikrocontroller und Digitale Elektronik Compilierfehler mit #define


von Anno (Gast)


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?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Anno schrieb:
> #define PC_IF_USART  ((USART_t *)(&USARTF0))
> PC_IF_USART.CTRLA= 0;

Oben verwendest Du im #define die Adresse von USARTF0. Dann musst Du 
auch
1
PC_IF_USART->CTRLA = 0;

schreiben.

von Anno (Gast)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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

Du könntest zunächst USARTC0 verwenden und im Abschluss dann per 
global-replace USARTC0 in PC_IF_USART umbenennen.

von Anno (Gast)


Lesenswert?

@Frank:
Ja, das wäre tatsächlich eine Möglichkeit, die gar nicht so umständlich 
ist!

von Keiner N. (nichtgast)


Lesenswert?

Moin,

was benutzt du denn zum programmieren?

Ich habe das gerade mit dem Atmel Studio 7 probiert und da geht das mit 
dem define eigentlich ganz gut. Ich bekomme schön die Vorschläge 
angezeigt.

von Axel S. (a-za-z0-9)


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.

von J. Zimmermann (Gast)


Lesenswert?

Keiner N. schrieb:
> Ich habe das gerade mit dem Atmel Studio 7 probiert und da geht das mit
> dem define eigentlich ganz gut. Ich bekomme schön die Vorschläge
> angezeigt.

bei mir funktioniert das auch tadellos.
mfg
Achim

von Anno (Gast)


Lesenswert?

> bei mir funktioniert das auch tadellos.

Ja stimmt, jetzt zeigt er bei mir auch die Members an.
(weil - nachdem im Rest des Programms keine Fehler mehr drin sind?)

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.