mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Was sollte bei Interrupteinsprung auf den Stapel


Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal eine Frage dazu, was man bei einem Interrupteinsprung bei 
einem AVR auf den Stapel pushen sollte.

Sind nur die Register notwendig die man in der Interruptroutine benutzt 
oder sollte man hier noch andere Dinge auf den Stapel legen um Sie am 
ende wieder zurück zu popen bevor man die Routine beendet?

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

was sind "andere Dinge"?

Denke daran, daß der Zustand von SREG gerettet werden muß, wenn in der 
ISR Befehle benutzt werden, die die Flags beeinflussen.

Gruß aus Berlin
Michael

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin, das hängt doch wohl von Deinem Programm ab. Überlege Dir, aus 
welcher Situation heraus ein Interrupt auftreten kann und was Dein 
restliches Programm zu dieser Zeit macht. Dann solltest Du schon wissen, 
was die Interruptroutine z.B. an den Registern verändert.  Michael U. 
(amiga) kann ich hinsichtlich des sreg zustimmen.


Holger

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sollte doch so gehen

in temp, SREG
push temp

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Thomas O. schrieb:
> sollte doch so gehen
>
> in temp, SREG
> push temp

besser so:

push temp
in temp, SREG
push temp

...

pop temp
out temp, SREG
pop temp

sonst ist temp gleich im Eimer... ;-)

Gruß aus Berlin
Michael

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also erst temp retten und dann erst fürs Auslesen des SREGs benutzen, 
danke

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder einfach ein eigenes Register dafür spendieren, z. B. SaveSREG. 
Dafür bietet sich gut eins der Register aus der unteren Hälfte an, denn 
die Befehle in und out funktionieren ja mit denen.

Dann wird die Sache denkbar simpel, kurz und schnell:

-------------------------
ISRHandler:
  in SaveSREG, SREG

  [...]

  out SREG, SaveSREG

  reti
-------------------------

Üblicherweise reicht ein SaveSREG-Register für alle ISRs aus, wobei 
"üblicherweise" bedeutet, dass keine ISR eine andere ISR interrupten 
kann.

Autor: Thomas O. (kosmos)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch ne Möglichkeit, ich nutze nur einen einzigen Interrupt, habe da 
auch nichts anderes erlaubt.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst ruhig mehrere Interrupts haben. Solange es keinen Interrupt 
gibt, der einen anderen unterbrechen kann (was standardmäßig 
ausgeschlossen ist, weil das I-Flag bei der Ausführung eines Interrupts 
ja von der Controllerhardware gelöscht wird), reicht ein 
SaveSREG-Register für alle Interrupts aus.

Interrupts in Interrupts zuzulassen ist zwar möglich, aber ausdrücklich 
nicht ratsam, u. a. weil es spezielle Probleme mit sich bringt (was 
ist, wenn sich ein Interrupt sich selbst unterbricht?). Nötig ist das 
nur zur Lösung äußerst zeitkritischer Probleme.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas O. schrieb:
> Ich habe mal eine Frage dazu, was man bei einem Interrupteinsprung bei
> einem AVR auf den Stapel pushen sollte.

In Assembler hast Du die Freiheit, garnichts pushen zu müssen.

Du hast ja 32 Register, also kannst Du bequem welche für das Main und 
welche für die Interrupts benutzen.

Nur wenn der Interrupt den Z-Pointer benötigt, muß er ihn sichern, da 
dieser nur einmal vorhanden ist. Pushen muß man dann aber auch nicht, es 
reicht ihn per MOVW in ein Registerpaar des Interrupts zu sichern.

Und das SREG sollte sein eigenes Sicherungsregister (z.B. R2) erhalten.

In Assembler können Interrupts also vollkommen PUSH/POP-frei sein.


Peter

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.