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