avr-gcc macht einen guten Code. Teilweise kommt es auch drauf an, wie man Sachen hinschreibt und man erhält kompakteren Code oder schnelleren.
Wenn es wirklich zeitkritisch ist, kannst du auch sehr gut C mit asm kombinieren, den avr-gcc erzeugt lediglich Assembler und ruft dann intern den Assembler auf, den avr-as.
Du kannst also
- Assembler-Stückchen via inline asm in deinen Code einbauen. Wie das genau geht, steht in der Doku zur avr-libc.
- Du kannst ganze Module direkt in Assembler hinschreiben und den avr-as drüberrauschen lassen, evtl auch den Preprozessor. Die erzeugten Objekte bindet man wie gewohnt mit dem Linker zusammen.
inline asm sieht dann etwa so aus:
Code:
#define bit_count(_x) \
({ \
unsigned char __p = 0; \
unsigned char __x = _x; \
asm volatile (\
"; %0 = bit_count (%1)" "\n\t"\
"0:" "\n\t"\
"lsr %1" "\n\t"\
"adc %0, __zero_reg__" "\n\t"\
"tst %1" "\n\t"\
"brne 0b" "\n\t"\
: "=&r" (__p), "=&r" (__x) \
: "1" (__x), "0" (__p));\
__p; \
})
Man kann also auch C-Variablen übergeben und einfach benutzen:
// a ist Anzahl gesetzter Bits in b
unsigned char a, b;
...
a = bit_count(b);
Lesezeichen