www.mikrocontroller.net

Forum: Compiler & IDEs #define Frage


Autor: Bronko Pavel (bronko99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend,

folgendes Szenario:
uint8_t PD0;
uint8_t P0;

...
#define PORT_0        PD0,  P0 

#define IO_PORT_WRITE(x)                     IO_PORT_WRITE2(x)
#define IO_PORT_WRITE3(ddr, port, value)      port = value

...
IO_PORT_WRITE(PORT_0, 0xFF);


macro argument error ... sagt er

Warum haut das nicht hin?
Bronko

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil es IO_PORT_WRITE2 nicht gibt?

Autor: Bronko Pavel (bronko99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist eigentlich eine 2.
Copy&Paste Fehler von mir.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
IO_PORT_WRITE hat nur ein Argument, Du übergibst 2!

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir für solche Zwecke eher inline-Funktionen an, da meckert 
wenigstens der Compiler richtig :-)

Autor: Bronko Pavel (bronko99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Absolut logisch! Das wars, danke.

Falls das jemals jemand braucht:
uint8_t PD0;
uint8_t P0;

...
#define PORT_0        PD0,  P0 

#define IO_PORT_WRITE(x,value)                     IO_PORT_WRITE2(x,value)
#define IO_PORT_WRITE2(ddr, port, value)           port = value

...
IO_PORT_WRITE(PORT_0, 0xFF);

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Falls das jemals jemand braucht:

Wozu soll das gut sein?

>#define IO_PORT_WRITE(x,value)                     IO_PORT_WRITE2(x,value)

Doppelt hält besser oder was?

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Doppelt hält besser oder was?

Beim C-Präprozessor mit seinen nicht ganz einfachen Expansionsregeln
muss man manchmal etwas doppelt machen, das ist schon ok.

Ich frage mich aber trotzdem, wozu das gut sein soll, zumal das erste
Argument von IO_PORT_WRITE2 gar nicht benutzt wird.

Autor: Bronko Pavel (bronko99)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, weils euch interessiert. Ziel war es eine möglichst effektive IO pin 
Abstraktion für alle uC, die ich programmiere, zu haben. D,h. folgende 
Zeile funktioniert sofort beim AVR, PIC, R8C, ..., weil das Makro in 
einem Headerfile z.B. io.h ist und ich somit nur noch das Macro anfassen 
muss und dessen Argument, das restliche Programm bleibt unverändert.

IO_PORT_WRITE(PORT_0, 0xFF);

Das mit inline ist mir bekannt und ist auch die "bessere" Lösung. Das 
inline ist unter Umständen compilerspezifisch.

Gruß
Bronko

PS: Das zweite Argument ist für das dataDirektion Makro gut
    Es gibt noch weitere Makros

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bronko Pavel schrieb:
> PS: Das zweite Argument ist für das dataDirektion Makro gut
>     Es gibt noch weitere Makros

Ok, in diesem Kontext ergibt die Sache einen Sinn.

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.