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


von Thomas (kosmos)


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?

von Michael U. (amiga)


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

von Holger (Gast)


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

von Thomas (kosmos)


Lesenswert?

sollte doch so gehen

in temp, SREG
push temp

von Michael U. (amiga)


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

von Thomas (kosmos)


Lesenswert?

also erst temp retten und dann erst fürs Auslesen des SREGs benutzen, 
danke

von Gast (Gast)


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.

von Thomas (kosmos)


Lesenswert?

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

von Gast (Gast)


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.

von Peter D. (peda)


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

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.