Hallo,
ich wollte mal fragen, warum man beim avr tutorial theme interrupts,
dies hier schreibt:
push temp
in temp, SREG
Das per push etwas in den stack schreibt und per pop wieder herausholt
ist mir klar.
Nur warum wird das sichern von SREG auf diese Weise gemacht?
Hierbei wird doch temp auf den stack geschoben.
Danach wird in temp SREG kopiert.
HIer kommt huddel fuddel...(wobei unsere Werte ja 100% sicher sein
sollten)
danach kommt das hier:
out SREG, temp ; Die Register SREG und temp wieder
pop temp
dort wird von temp zurück in SREG kopiert und danach temp
wiederhergestellt.
Ich dachte aber, dass man SREG im Stack absichern soll?
Hierbei ist doch nur temp auf den Stack gelegt worden und SREG in temp
kopiert worden.
Hätte man nun während der interruptroutine etwas in temp geschrieben,
dann währe doch SREG nicht mehr wiederherstellbar gewesen, oder?
Ich frage deshalb, weil ich mir sicher sein will, das ganze 100%
verstanden zu haben.
Ich hoffe ihr versteht meine Frage.
gruß
Oliver D.
Hi
Das SREG lässt sich nicht direkt auf den Stack befördern. Das geht nur
über ein Register. Dazu wird erst das Register gesichert und danach
SREG.
MfG Spess
SREG wird in diesem Beispiel (was etwas verwirrend ist) gar nicht auf
dem Stack gesichert. Das allgemeine temporäre Rechenregister temp wird
gesichert und SREG wird für die Dauer des Interrupt Handlers in temp
"aufbewahrt". Normalerweise würde man es tatsächlich so machen, dass man
SREG über einen Zwischenschritt auf den Stack befördert und hinterher
wieder zurück. Wäre auch für das Beispiel im Tut vielleicht besser
gewesen, zumal die gezeigte Methode programmtechnisch keinen direkten
Vorteil bietet. Schließlich darf in diesem Fall temp im Interrupt
Handler nicht verändert werden.
Hi
Johannes hat natürlich recht. Nur wenn du temp in der IR benötigt wird
sollte es so aussehen:
push temp
in temp,SREG
push temp
...
pop temp
out SREG,temp
pop temp
reti
MfG Spess
Compiler sichern das SREG und alle verwendeten Register (manche Compiler
sogar auch alle unbenutzten) im Stack. Wer ASM über den Compiler-Output
gelernt hat, der auch...
Der AVR hat aber nun 32 Register, da kann man es sich (in handgemachtem
ASM) leisten, ein Exklusivregister für die SREG-Kopie zu opfern, es
reicht meist auch noch für ein paar wenige Tempregister, die nur in der
ISR verwendet werden. Damit braucht dann gar nicht gePUSHt und gePOPt
werden. Dies wäre dann das extreme Gegenteil von dem, was Compiler so
tun.
Das Optimum ist ein Kompromiss zwischen beiden Extremen und fällt von
Fall zu Fall anders aus.
...
Coole Sache, dank!
Da bin ich ja froh, dass ich nichts falsch verstanden habe.
Vielleicht könnte man das ja im Tutorial anmerken, denn den aufmerksamen
Leser, könnte es etwas verwirren, dass SREG ja garnicht "gut" gesichert
wurde.
> Vielleicht könnte man das ja im Tutorial anmerken, denn den aufmerksamen> Leser, könnte es etwas verwirren,
Ein Tutorial soll erste Schritte vermitteln und kann daher nicht auf
alle Eventualitäten eingehen. Die Codebeispiele sind kein Dogma, sie
sollen lediglich den Leser zu Kreativität inspirieren.
Es gibt verschedene Wege, ein Problem zu lösen bzw. ein Programm zu
schreiben. Vieles haben die Autoren so (und nicht anders) gemacht, weil
sie es immer so machen, Vieles ist bewusst vereinfacht worden, damit der
Anfänger es versteht.
Nimm die Beispiele nicht unbedingt als Bausteine für eigene Programme,
sondern nur als Vorschlag, wie man es auch machen kann.
...
>Der AVR hat aber nun 32 Register, da kann man es sich (in handgemachtem>ASM) leisten, ein Exklusivregister für die SREG-Kopie zu opfern,
Ja, das ist die cleverste Variante (code- und zeitsparend - wo gibts
sowas sonst noch? ;-) ). Man sollte vielleicht der Vollständigkeit
halber noch hinzufügen, dass ein SREG-Rettungs-Register i. a. nicht
mehr ausreicht, wenn Interrupts innerhalb Interrupts über 'sei'
freigegeben werden. Dies sollte man aber auch niemals tun - von sehr
gut begründeten Ausnahmefällen abgesehen.
> wenn Interrupts innerhalb Interrupts über 'sei'> freigegeben werden. Dies sollte man aber auch niemals tun ...
Dies sollte man beim Beantworten einer Anfängerfrage erst gar nicht
erwähnen, es sei denn, der Anfänger fragt speziell danach. ;-)
...