PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum "Conditional Compilation"



irobot_22587
18.03.2007, 16:29
Moin,

ich habe beim stöbern im Netz ein Programcode gefunden, der folgende Zeilen enthielt:


#ifdef RC5_AVAILABLE
if (enableRC5 && !(count36kHz % 8))
IsrRC5(); // wird alle 222.2us aufgerufen
#endif

Im Standardwerk von Kernighan & Ritchie finde ich dazu nur auf Seite 208, dass der Code zwischen #ifdef und #endif nur compiliert wird, wenn der identifier (RC5_AVAILABLE) im preprocessor (??) definiert wurde, d.h. wenn er in einer #define control Zeile enthalten war.
Wo muss (in welchem Programm) das #define RC5_AVAILABLE definiert werden?

Hat jemand hierzu Erfahrung?

m.a.r.v.i.n
18.03.2007, 18:07
Hi,


Im Standardwerk von Kernighan & Ritchie finde ich dazu nur auf Seite 208, dass der Code zwischen #ifdef und #endif nur compiliert wird, wenn der identifier (RC5_AVAILABLE) im preprocessor (??) definiert wurde, d.h. wenn er in einer #define control Zeile enthalten war.


Das ist soweit korrekt.



Wo muss (in welchem Programm) das #define RC5_AVAILABLE definiert werden?

Das kann man auf mehrere Arten machen.
In diesem speziellen Fall würde ich das Define im Makefile selbst definieren.

Der Hintergrund ist folgender:
Die Funktion IsrRC5 steht in einer eigenen Quelldatei (rc5.c), ebenso die Variable enableRC5. Diese Quelldatei muß auch im Makefile eingebunden werden. Die #ifdef Abfrage ist deshalb drin, damit es beim Übersetzen anderer Projekte keine Fehlermeldung gibt.

So sehen dann die Anpassungen im Makefile aus:


# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c

# If there is more than one source file, append them above, or adjust and
# uncomment the following:
SRC += asuro.c \
rc5.c

# Optional compiler flags.
# -g: generate debugging information (for GDB, or for COFF conversion)
# -O*: optimization level
# -f...: tuning, see gcc manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
# -ahlms: create assembler listing
CFLAGS = -g -O$(OPT) -I../../lib/inc -DRC5_AVAILABLE\
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-ahlms=$(<:.c=.lst)



rc5.c ist die zusätzliche Quelldatei.


CFLAGS = -g -O$(OPT) -I../../lib/inc -DRC5_AVAILABLE\

Mit der Option -D bei den CFLAGS (Compiler-Optionen) kann man ein Define im Makefile definieren. Dies bewirkt dasselbe wie

#define RC5_AVAILABLE
in einer Quell-Datei.

Das ganze Projekt findet sich im AsuroWiki (http://www.asurowiki.de/pmwiki/pmwiki.php/Main/RC5DemoC)
Damit läßt sich der Asuro mit einer IR Renbedienung steuern, die RC5 kompatible ist (z.B. jede Universalfernbedienung)
Die Doku im AsuroWiki ist derzeit leider noch unvollständig.

irobot_22587
18.03.2007, 18:45
m.a.r.v.i.n,

thank for you help! Du bist immer eine sichere Quelle zur Problemlösung!https://www.roboternetz.de/phpBB2/images/smiles/eusa_angel.gif
Angel

Noch ein schönes Restwochenende. O:)