Forum: Mikrocontroller und Digitale Elektronik Compilierfehler mit #define


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Anno (Gast)


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


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


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


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


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

von Keiner N. (nichtgast)


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


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


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


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

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]
  • [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.