Hallo, ich will für ein Programm, dass einmal auf dem PC und einmal auf einem ATMega läuft bestimmte Teile im Quellcode gleich halten. Beim PC muss ich z.B. ein memcpy beim Atmega ein stattdessen memcpy_p benutzen. Dafür würde ich beim compilieren gerne unterschen. Irgendwie so in der Richtung #ifdef avrgcc dann mach das. Ich weiss, dass man die Version auf die Art abfragen kann. Ich würde aber gerne nur unterscheiden ist es der avr-gcc oder gcc. Welche Möglichkeiten habe ich? Die Suchfunktion hat leider nichts ergeben. Danke für die Info. Andreas
Du koenntest zum Beispiel schauen, ob F_CPU definiert ist. Das waere jetzt das Einfachste, das mir einfaellt...
Der AVR-GCC definiert einen Makro
1 | __AVR__ |
Auf dem PC wirst du im Gegenzug typischerweise einen Makro
1 | __i386__ |
finden.
Eine mehr formalisierte Methode wäre es, die autotools zu verwenden.
super danke an alle für die turbomäßig schnellen und guten Antworten. @Patrick an sowas in der Richtung hatte ich auch schon gedacht. Zwar nicht F_CPU sondern irgendetwas was es nur beim avr-gcc gibt @Jörg Das wird genommen. Auf sowas hatte ich gehofft. @Guru mit Autotools kenne ich mich nicht aus. Werde ich mir aber mal ansehen. Grüße Andreas
Ob gcc am Werk ist, sieht man am Makro
1 | __GNUC__ |
Zusammen mit
1 | __GNUC_MINOR__ |
1 | __GNUC_PATCHLEVEL__ |
bekommt man auch die gcc-Version raus: Für avr-gcc 4.7.0 sind diese Makros z.B. definiert zu 4, 7 bzw. 0. Einen Überblick über alle (internen) Makros verschafft man sich mit
1 | avr-gcc -x c /dev/null -E -dM | sort |
Andreas schrieb: > Hallo, > > ich will für ein Programm, dass einmal auf dem PC und einmal auf einem > ATMega läuft bestimmte Teile im Quellcode gleich halten. Beim PC muss > ich z.B. ein memcpy beim Atmega ein stattdessen memcpy_p benutzen. > > Dafür würde ich beim compilieren gerne unterschen. Irgendwie so in der > Richtung #ifdef avrgcc dann mach das. Am besten machst DU sowas wie
1 | #ifdef __AVR__
|
2 | # define memcpy memcpy_p
|
3 | #endif
|
statt vieler Fallunterscheidungen ueber den Code verstreut ...
>Am besten machst DU sowas wie > >#ifdef _AVR_ ># define memcpy memcpy_p >#endif Wohl besser umgekehrt, da Du vermutlich beim AVR-GCC memcpy sowie auch memcpy_p verwenden können willst. #ifndef AVR # define memcpy_p memcpy #endif
Peter schrieb: > Wohl besser umgekehrt, da Du vermutlich beim AVR-GCC memcpy sowie auch > memcpy_p verwenden können willst. > > #ifndef AVR > # define memcpy_p memcpy > #endif Habe ich gerade so gemacht. Allerdings komme ich um einige Fallunterscheidungen nicht drumherum. Auf dem PC habe ich keinen direkten CAN-Controller auf dem AT90CAN schon. Aber werde dafür sorgen, dass es nicht unübersichtlich wird.
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.