Forum: Compiler & IDEs Präprozessor #if anweisung


von CMM (Gast)


Lesenswert?

Hallo,

ich versuche gerade eine Bedingte anweisung für verschieden 
Mikrocontroller zu schreiben:

Ich übergebe avr-gcc dazu mit der -D option um welchen Mikrokontroller 
es sich handelt.

avr-gcc -DMCU=atmega16
oder
avr-gcc -DMCU=atmega48

Im Quellcode schreibe ich dann:

#if (MCU == atmega48)
C-Code
#endif


Aber der C-Code wird immer berücksichtigt, egal welchen prozessor ich 
MCU zuweise. Kann mir wer sagen wo der Fehler liegt?

Viele Grüße

CMM

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Die Vergleichsoperatoren, die für #if etc. zur Verfügung stehen, können 
nur* numerische Ausdrücke auswerten.

Du könntest also mit -DMCU=16

und

#if (MCU == 16)
...
#endif

arbeiten.



*) Soweit ich weiß und die Dokumentation meines C-Compilers richtig 
interpretiere. Will nicht ausschließen, daß ich mich da irre.

von CMM (Gast)


Lesenswert?

Danke für die schnelle Antwort,

es funktioniert. Dann lasse ich halt das "atmega" weg :-)

Viele Grüße

CMM

von Peter D. (peda)


Lesenswert?

Oder so:

avr-gcc -Datmega16
oder
avr-gcc -Datmega48

Im Quellcode schreibe ich dann:

#ifdef atmega48
C-Code
#endif



Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1
#if defined(__AVR__ATmega16__)
2
...
3
#elif defined(__AVR__ATmega48__)
4
...
5
#else
6
#  error Unsupported MCU type
7
#endif

von Peter D. (peda)


Lesenswert?

Jörg Wunsch wrote:
>
1
> #if defined(__AVR__ATmega16__)
2
>

Sehr schön, die Frage ist bloß, wie kriegt man diese Namen raus ?

Gibt es vielleicht einen Compilerschalter, um ein Listfile mit allen 
internen Symbolen zu erzeugen ?



Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger wrote:

> Sehr schön, die Frage ist bloß, wie kriegt man diese Namen raus?

Durch RTFM:

http://www.nongnu.org/avr-libc/user-manual/using_tools.html

> Gibt es vielleicht einen Compilerschalter, um ein Listfile mit allen
> internen Symbolen zu erzeugen?

gcc -E -dM gibt die Liste aller Makros mit ihren Werten, die sie am
Ende des preprocessing haben, auf stdout aus.  Sollte man sinnvoller-
weise wohl gleich noch duch »sort« pipen.  Wenn du das in einer Datei
haben willst, lenkst du die Ausgabe in eine Datei um.  (Ich pipe es
immer nach »less« und lese es mir gleich am Bildschirm durch.)

von Peter D. (peda)


Lesenswert?

Jörg Wunsch wrote:

> gcc -E -dM


Danke, das habe ich schon lange gesucht.


Peter

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.