Gast
#5184
Hello,
Für ein Programm bräuchte ich genaues Timing. Z.b. 10ns.
Zuerst habe ich es einfach mit
#define rwait() asm volatile( \
"ldi R17, 0x0D" "\n" "WGLOOPx: dec R17" "\n\r" \
"brne WGLOOPx" "\n\r" "nop")
definiert, damit keine Zeit für einen Funktionsaufruf vergeht.
Dann bin ich aber draufgekommen das das mit WGLOOPx ein Problem ist wenn
ich das Makro öfter verwenden will. So bin ich gezwungenermassen auf
eine Funktion umgestiegen:
void rwait(void)
{
asm volatile(
"ldi R17, 0x0D" "\n" "WGLOOPx: dec R17" "\n\r"
"brne WGLOOPx" "nop");
}
Aber erstens: Was ist jetzt, wenn z.B. Register 17 schon vorher benötigt
worden ist und jetzt einen anderen Wert einnimmt? Oder werden alle
Register bei einem Funktionsaufruf (wie bei tigcc) auf dem Stack
gespeichert und nach der Funktion wieder in die Register
zurückgeschrieben?
Zweitens, wie lange braucht jetzt dann die Version mit dem
Funktionsaufruf länger? Wenn ich denke das 10us gerade mal 40
Zyklen,also im Prinzip 40 Befehle sind (bei 4Mhz) ist das ganze nicht
viel. Wenn ich jetzt den Funktionsaufruf mitrechne, dann kommen ja
ziemlich viele Befehle dazu und das könnte ja die Dauer verfälschen
oder?
Hat der Funktionsaufruf eine Bedeutung oder soll ich dafür weniger
Schleifendurchläufe nehmen?
BTW: Der Code wurde mit AVRDelayLoopGenerator erzeugt.
Niki
PS: Ich will auf den Timer verzichten da er den Code für meine Zwecke
nur unnötig kompliziert macht. Ich muss einfach nur manchmal 10us warten
und da wäre eine Funktion die das einfach täte das idealste für mich