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
Hallo, das sind die Verzeugerungsschleifen aus der LCD-Lib für AVR von Peter Fleury: Title: HD44780U LCD library Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury Link: http://homepage.hispeed.ch/peterfleury/avr-software.html Siehe "delay loop for small accurate delays: 16-bit counter, 4 cycles/loop" .
Maddin schrieb: > ich schätze das rjmp fürt direkt zum Rücksprung aus der Funktion Ne, das führt direkt hinter das rjmp. Es ist also quasi ein 2-Cycle-NOP. Maddin schrieb: > aber warum macht man das? Da musst du den Autor fragen, warum er für den 0-Fall die zwei zusätzlichen Cycles haben wollte.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.