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?
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
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
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
also erst temp retten und dann erst fürs Auslesen des SREGs benutzen, danke
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.
auch ne Möglichkeit, ich nutze nur einen einzigen Interrupt, habe da auch nichts anderes erlaubt.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.