Hallo zusammen, Ich (Anfänger) arbeite mit dem ATmega32 und dem AT90S8515 Controllern. Werden bei der Abarbeitung von Interrupt Service Routinen (Interrupt Handlern) bei Eintreffen anderer Interruptanforderungen aus meiner aktuellen Interrupt Service Routine gesprungen um in die andere ISR zu springen. Geht das (also Vorgehen wie Hauptprogramm -> Sprung in ISR) ? Wenn ja wie oft darf gesprungen werden, d.h gibt es eine "Tiefenbegrenzung" von Interruptsprüngen innerhalt einer ISR? Gibt es eine Interrupt Priorität nach der in einer ISR nur gesprungen werden darf oder werden generell in einer ISR andere Interrupts disabeld? Ich würde mich freuen wenn einer die Antwort wüßte und sie mir schreiben könnte. Vielen Dank Peter
Hi, die Interrupts beim Atmel haben keine Prioritäten, du müsstest die Interrupts in der Routine wieder freischalten. Dann begrenzt der Stack die Einsprungtiefe. Mehr fällt mir da jetzt nicht ein. Gruß Oliver
Der AVR hat nur eine Interruptpriorität, d.h. sobald ein Interrupt in Bearbeitung ist, kann kein anderer dazwischen hauen. Es gibt aber tricky Programmierung, d.h. man kann innerhalb eines Interrupts das Global-Interupt-Bit wieder neu setzen. Aber da sollte man schon sehr genau wissen, was man tut, sonst kann es leicht sein, daß sich solange Interrupts selbst unterbrechen bis der Stack überläuft. Generell gilt daher: "Fasse Dich kurz", d.h halte alle Interrupts so kurz wie nur irgend möglich. Totsünden, die man leider oft findet, sind Warteschleifen innerhalb von Interrups. Peter
Standardmäßig sind Interrupts gesperrt, während eine ISR läuft. Du müßtest sie selbst mit SEI freischalten, dann können sie allerdings beliebig geschachtelt auftreten. Interrupt-Prioritäten gibt es nur statisch (siehe Datenblatt), die sind aber nur von Interesse, wenn mehrere Interrupt-Bedingungen gleichzeitig anliegen. Das heißt nicht, das sie gleichzeitig eingetroffen sein müssen; wenn während eines mit CLI geschützten Abschnittes mehrere Interruptbedingungen auftreten, dann würde nach dem folgenden SEI der mit der höchsten Priorität zuerst abgearbeitet.
Hallo Oliver, danke für deine Nachricht, aber in der Spec steht das es Interruptprioritäten gibt der Reset Interrupt hat die höchste Priorität und der Analog Comperator Interrupt z.B im AT90S8515 hat die niedrigste Priorität. Was meinst Du mit freischalten ich laß ja alle Interrupts während der Abarbeitung einer ISR zu... Gruß Peter
Hab ich das jetzt richtig verstanden? 1. Ich muß zuerst mit sei den Interrupt freigeben (Bekannt) 2. Interrupt tritt auf -> Sprung in ISR -> kann nicht durch einen anderen Interrupt unterbrochen werden, es sei denn ich setze erneut das globale Interrupt Bit mit sei? (dann kann auch innerhalb einer ISR ein weiterer Interrupt abgearbeitet werden) 3. Oder soll ich wenn ich keinen Interrupt in der ISR wünsche generell mit CLI arbeiten. Es ist wichtig für mich den ich habe verschiedene Ereignisse die ich per Interrupt verarbeiten muss und da ist es wichtig diese Problematik zu verstehen Danke 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.