Zitat Zitat von radbruch Beitrag anzeigen
[...viel Code...]
*Bei der letzten Version fällt Code wie 1 << nr in der ISR unangenehm auf, da dieser Ausdruck in einer Schleife zur Laufzeit berechnet werden muss. Weil C vorschreibt, daß die Operation auf int-Ebene auszuführen ist, wird's besonders übel.

*Leider ist dem nicht so einfach beizukommen; in avr-gcc 4.7 gibt's eine Optimierung die das Problem abmildert, aber eine Schleife bleibt's immer noch.

Falls Ausführungsbeschwindigkeit oberste Priorität hat — was in einer ISR nicht unwahrscheinlich ist — und man keine Angst davor hat, den Code mit inline-Assembler zu verunstalten, geht 1 << nr auch ohne Schleife und in 7 Ticks:
Code:
// Berechnet 1 << nr
static inline unsigned char
pow2_n (unsigned char nr)
{
** *unsigned char val;
** *
** *asm ("ldi *%0, 1" *"\n\t"
** * * * "sbrc %1, 1" *"\n\t"
** * * * "ldi *%0, 4" *"\n\t"
** * * * "sbrc %1, 0" *"\n\t"
** * * * "lsl *%0" * * "\n\t"
** * * * "sbrc %1, 2" *"\n\t"
** * * * "swap %0"
** * * * : "=&d" (val)
** * * * : "r" (nr));

** *return val;
}