Ich nehm hier mal das UW_R.
Das Original:
Code:
UW_R(){
OUT = OUT & 255 - _BV(UW_M) | _BV(UW_P);
UW_ACTION = UW_A_R;
}
Als inline-Funktion (In den Header schreiben und includieren):
Das Original:
Code:
static inline void UW_R()
{
OUT &= ~(_BV(UW_M) | _BV(UW_P));
UW_ACTION = UW_A_R;
}
Als Makro (ebenfalls in den Header, evtl. Seiteneffekte beachten!)
Code:
#define UW_R() \
do {
OUT &= ~(_BV(UW_M) | _BV(UW_P));
UW_ACTION = UW_A_R;
} while(0)
Das while (0) macht man, damit das ganze ein Block wird, und wie gewohnt benutzbar ist. Etwa:
if (...)
UW_R();
else
...
In beiden Fällen muss in dem Header auch das Zeug includet werden, das man sonst so braucht (<avr/io.h>, OUT, ...).
Kommt auch drauf an, wo die Priorität ist, ob bei Code-Größe oder Geschwindigkeit und was OFF ist, etc.
Inline ist übrigens nur eine Empfehlung an den Compiler, Code zu inlinen. Eine externe Funktion zu inlinen, kann z.B. nicht gehen. Die wird als ganz normale Funktion da stehen später. Und während ein Makro immer aufgelöst wird, wird nicht bei allen Optimierungsstufen geinlinet.
Lesezeichen