hi, ich habe ein compile-übergreifendes header-file, was standarttypen definiert. fie frage ist: wie erkenne ich den AVR-compiler um für verschiedene Compiler und Architekturen untershciedliche definitionen zu erstellen? Ich benutze den avr-gcc vom win-AVR
1 | /*
|
2 | Predefined macros in avr-gcc:
|
3 | AVR
|
4 | __AVR
|
5 | __AVR__
|
6 | |
7 | Controller specific (example for ATmega16):
|
8 | __AVR_ATMEGA__
|
9 | __AVR_ATmega16__
|
10 | */
|
11 | |
12 | #if __AVR__
|
13 | #endif
|
nu gut seis drum, mit meinen Suchen hatte ich keinene Erfolg. Versucht hatte ichs auf jeden Fall. Danke nochmal.
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
IAR benutzt
1 | __ICCAVR__ |
. Von anderen Compilern kenne ich die vordefinierten Makros nicht.
Johann L. wrote: > Es funktioniert nur dann, wenn _AVR_ definiert ist. Ansonsten gibt's > nen Syntaxfehler auf die Mappe. Schön wär's, weil leider ein prima Platz für Schreibfehler. Bei unbekanntem Symbol wird das #if nämlich ohne Meldung abgewiesen (=0).
A. K. wrote: > Johann L. wrote: > >> Es funktioniert nur dann, wenn _AVR_ definiert ist. Ansonsten gibt's >> nen Syntaxfehler auf die Mappe. > > Schön wär's, weil leider ein prima Platz für Schreibfehler. Bei > unbekanntem Symbol wird das #if nämlich ohne Meldung abgewiesen (=0). Stimmt. Falsch hingeguckt. Ist ja was anderes als ein leers #if. Johann
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.