Was sollte bei Interrupteinsprung auf den Stapel

OP #1376189
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?
Gast #1376197
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
Gast #1376226
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.
Gast #1376282
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.
#1376373
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren