Gast
#2375067
Hey,
kann mir jemand sagen was hier getrieben wird:
static inline void _delayFourCycles(unsigned int __count)
{
if ( __count == 0 )
_asm_ __volatile__( "rjmp 1f\n 1:" ); // 2 cycles
else
_asm__ __volatile_ (
"1: sbiw %0,1" "\n\t"
"brne 1b" // 4 cycles/loop
: "=w" (__count)
: "0" (__count)
);
}
Also es wird Assembler eingebunden, ist klar.
Wenn ich jetzt dem delay eine 0 übergebe, wird etwas anderes ausgeführt,
ich schätze das rjmp fürt direkt zum Rücksprung aus der Funktion, aber
warum macht man das? könnte man nicht auch direkt return dort hin
schreiben?
Wofür steht das volatile in dem Fall? damit die Zählerrei nicht
wegoptimiert wird? ist das gleichzusetzen mit dem Volatile bei einer
Variablendeklaration in C?
Ich mache viel in C auf dem AVR, ich wäre jedoch dankbar wenn mir auch
jemand den Codeschnipsel:
(
"1: sbiw %0,1" "\n\t"
"brne 1b" // 4 cycles/loop
: "=w" (__count)
: "0" (__count)
);
erläutern würde:-) Vor allem:
_asm_ (""); Scheint ja die "Hülle" zu Assemblerangaben zu sein, aber
was machen die Doppelpunkte und die Variable in Klammern dort? Vor allem
was ist "=w" für ein Ausdruck, sieht nicht nach ASM aus, oder?
Gruß,
M