mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Tutorial interrupt


Autor: Oliver D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Oliver D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.