Forum: Mikrocontroller und Digitale Elektronik AVR Tutorial interrupt


von Oliver D. (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Oliver D. (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von AVRFan (Gast)


Lesenswert?

>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.

von Hannes L. (hannes)


Lesenswert?

> 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. ;-)

...

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
Noch kein Account? Hier anmelden.