Nein, #if _AVR_ funktioniert nicht.
Es funktioniert nur dann, wenn _AVR_ definiert ist. Ansonsten gibt's
nen Syntaxfehler auf die Mappe.
Um alle definierten Makros anzuzeigen -- sowohl Builtins als auch per
Kommandozeile mit -D als auch in der Quelle per #define -- geht
1 | avr-gcc datei.c -E -dM ...
|
Falls man die Ausgabe sortiert haben möchte und keine Quelldatei zur
Hand hat, dann geht auch
1 | echo | avr-gcc - -E -dM -mcu=atmega8 -Os -ansi | sort
|
wobei -Os -mmcu -ansi auch wegfallen können wie oben.
Um gcc zu erkennen verwendet man _GNUC_, womit man auch die
GCC-Major-Version unterscheiden kann. Für AVR geht _AVR sowie __AVR_.
Da fehlen jetzt bestimmt wieder Unterstriche, weil des Webzeugs
irgendwelche Firlefonts einbaut... In C sieht's so aus:
1 | #if defined (__GNUC__) && defined (__AVR__)
|
2 | /* Mache was speziell fuer avr-gcc */
|
3 | # include <avr/io.h>
|
4 | #endif /* avr-gcc */
|
Ein Auszug aus dem zweiten -E-Aufruf:
1 | #define __AVR 1
|
2 | #define __AVR_2_BYTE_PC__ 1
|
3 | #define __AVR_ARCH__ 4
|
4 | #define __AVR_ATmega8__ 1
|
5 | #define __AVR_ENHANCED__ 1
|
6 | #define __AVR_HAVE_LPMX__ 1
|
7 | #define __AVR_HAVE_MOVW__ 1
|
8 | #define __AVR_HAVE_MUL__ 1
|
9 | #define __AVR__ 1
|
10 | #define __GNUC_MINOR__ 3
|
11 | #define __GNUC_PATCHLEVEL__ 2
|
12 | #define __GNUC__ 4
|
13 | #define __OPTIMIZE_SIZE__ 1
|
14 | #define __OPTIMIZE__ 1
|
15 | #define __STRICT_ANSI__ 1
|
16 | #define __VERSION__ "4.3.2"
|
Es wurde also mit avr-gcc 4.3.2 erzeugt. Optimierung war aktiviert (auf
Größe), der µC gehört zur Familie 4 (ATmega8, ATmega88, ...), er verfügt
über Multiplikationsbefehle, MOVW und die erweiterte Version von LPM,
arbeitet mit einem 2-Byte langen PC und es ist ein ATmega8.
Johann