Wie funktionieren Interrupts in eingebetteten Systemen? Ich brauche einen Überblick

Ich versuche, Interrupts in eingebetteten Systemen zu verstehen. Bitte korrigieren Sie mich, wo ich falsch liege. Unten ist mein Verständnis.

Dies könnte mir und anderen helfen, die versuchen, Interrupts zu verstehen.

  1. Interrupts sind die Signale, die von einem Peripheriegerät erzeugt werden, um den Mikroprozessor aufzufordern, eine Aufgabe auszuführen. Wenn ein Interrupt auftritt, führt die CPU die aktuell laufende Anweisung aus und speichert dann die erforderlichen Informationen des Stapelzeigers und des Programmzählers (PC) irgendwo in dem für die aktuelle Funktion zugewiesenen RAM.

  2. Der PC wird nun zum entsprechenden Interrupt-Vektortabellenindex vektorisiert, um die ISR-Routine auszuführen.

  3. Allen Interrupts sind individuelle Freigabebits zugeordnet, die zusammen mit dem globalen Interrupt-Freigabebit in das Statusregister logisch Eins geschrieben werden müssen, um den Interrupt freizugeben.

  4. Wenn ein Interrupt auftritt, wird sein Interrupt-Flag gesetzt und die entsprechende ISR-Routine liest dieses Flag in sich. Bei einigen Peripheriegeräten können diese automatisch gelöscht werden, indem das Interrupt-Flag-Bit und das Datenregister gelesen werden, während wir bei einigen Peripheriegeräten explizit eine logische Eins schreiben müssen, um das Interrupt-Flag-Bit zu löschen.

  5. Wenn das entsprechende Interrupt-Flag-Bit nicht gelöscht wird, kann es entsprechende Ereignisse nicht erneut unterbrechen (wenn beispielsweise Interrupt A aufgetreten ist und sein Interrupt-Flag gesetzt ist, bis Sie das Interrupt-Flag löschen, wird der Prozessor nicht über das nächste Ereignis von A benachrichtigt. ) Lesen Sie unbedingt die erforderlichen Register, bevor Sie sie löschen. Hab ich recht?

  6. Wenn ein Interrupt auftritt, können wir den Interrupt innerhalb seiner ISR-Routine deaktivieren, indem wir entweder das individuelle Interrupt-Aktivierungsbit auf Null setzen oder indem wir das globale Interrupt-Bit auf Null setzen. Dies wird nicht empfohlen, da dies verhindert, dass verschachtelte Interrupts auftreten, sodass einige Informationen verloren gehen.

  7. Wenn verschachtelte Interrupts aktiviert sind, kann ein Interrupt mit niedriger Priorität durch einen Interrupt mit hoher Priorität verdrängt werden. Die ISR-Routine des Interrupts mit niedriger Priorität wird gespeichert und mit hoher Priorität ausgeführt. Wenn beide die gleiche Priorität haben, wird der Interrupt mit der niedrigsten Unterpriorität ausgeführt. Wer vergibt diese Unterpriorität?

  8. Maskierbare Interrupts sind diejenigen, bei denen wir den Interrupt deaktivieren können, indem wir Anweisungen wie das Setzen des "Interrupt Enable"-Bits auf Null schreiben.

  9. Vectored Interrupts sind diejenigen, bei denen wir bereits die zu springende Adresse für den ISR kennen, wie die Interrupt-Vektortabelle mit Adresse und Priorität, zum Beispiel SPI, I2C, UART-Interrupt, Timer.

  10. Was sind nicht vektorisierte Interrupts? Ich weiß, dass wir keine vordefinierte Adresse haben, aber was soll das bedeuten? Kann jemand bitte ein Beispiel geben?

PIC16 uCs (zumindest die älteren) sind ein bekanntes Beispiel für Geräte mit nicht vektorisierten Interrupts. Alle Interrupts teilen sich denselben Vektor und landen somit in derselben ISR-Funktion. Die Software muss Flags abfragen, um festzustellen, welche Unterbrechung aufgetreten ist.
@ Tagli isch. Je nach PIC kann es je nach Priorität mehr als einen Vektor geben. Ich bin mir nicht sicher, ob der PIC16 dies hat, aber der PIC18 (zum Beispiel) tut es
Wenn Sie wollen, dass Ihr Gehirn in Knoten verdreht wird, sehen Sie sich die Methode DEC 21064 (Alpha) zur Behandlung von Interrupts an. Das passt nicht so gut zu deinen Beschreibungen. Während Befehle vor dem unterbrechenden beendet werden, werden die Zustandsänderungen, die durch Befehle nach dem unterbrochenen verursacht werden, nicht von der Hardware behandelt. Damit muss die Interrupt-Routine fertig werden. Es ist ein ernsthafter Schmerz, sich daran zu gewöhnen. Endeffekt? Es gibt so viele Arten, wie Interrupts in der Hardware verwaltet werden, dass es sehr schwierig ist, zu einer einheitlichen Definition zu gelangen.

Antworten (2)

Was Sie geschrieben haben, ist an sich richtig, aber ich bin mir nicht sicher, welchen Zweck es erfüllt.

Es ist zu niedrig, um zu verstehen, wann Sie Interrupts verwenden müssen oder was sie für Sie tun. Man sieht den Wald vor lauter Bäumen nicht.

Es ist jedoch zu hoch und nicht detailliert genug, um Interrupts auf einem bestimmten Computer zu implementieren, da sie unterschiedliche spezifische Adressen für ihre Vektoren oder Bitnummern für ihre Masken haben, sodass Sie in der detaillierten Dokumentation nachsehen müssen, um ein bestimmtes Ziel zu erreichen benutze sie. Es ist fast sinnlos, darüber zu sprechen, bis Sie versuchen, eine bestimmte Maschine zu programmieren

Auf der einfachsten Ebene ermöglichen Interrupts einem Computer oder Controller, in Echtzeit auf ein bestimmtes Ereignis zu reagieren.

Ohne Interrupts würde ein Computer die verschiedenen Eingaben abfragen, und je nachdem, wie schnell die Abfrageschleife war und wie lange es dauerte, ein anderes Ereignis zu bedienen, konnten Sie lange warten, bis Ihr Ereignis bedient wurde. Wenn alle Ihre Serviceroutinen kurz sind, wenn alle Ihre Ereignisse dieses Warten vor dem Service tolerieren, dann besteht keine Notwendigkeit für Interrupts.

Ein gängiges einfaches Modell, das ich häufig in Mikrocontrollern implementiere, besteht darin, sich zwei Maschinen vorzustellen, eine Echtzeitmaschine und eine Hintergrundmaschine, die sich einen Chip teilen. Ich habe dann alle 1 ms oder 10 us oder so einen schnellen (ish) Interrupt, der das tut, was jetzt getan werden muss , zum Beispiel ein Peripherieregister laden oder einen ADC lesen. Ich habe dann einen Hintergrundprozess, der komplizierte, aber langsamere Dinge wie das Analysieren eingehender Nachrichten oder das Schreiben von Dateien auf die SD-Karte erledigt.

Das ist ganz einfach. Für kompliziertere Systeme benötigen Sie eine feinere Steuerung. Ob Interrupts andere Interrupt-Routinen unterbrechen können, hängt von ihrer Wichtigkeit und Laufzeit ab, was eine anwendungsspezifische Sache ist. Die Maskenbits, ISR-Flags usw. sind nur Ressourcen, mit denen Sie steuern können, was was und wann unterbrechen kann. Ob Interrupts die Antwort in 10 oder 1000 Taktzyklen generieren müssen, wirkt sich darauf aus, ob Sie einen vektorisierten Interrupt verwenden müssen oder auf einen nicht vektorisierten Interrupt warten können, um herauszufinden, warum er aufgerufen wurde, und es ist wiederum sehr anwendungsspezifisch.

Das ist das gleiche Modell, das ich tendenziell verwende.
Ich bin nicht einverstanden. Die Erklärung des OP ist korrekt und nützlich und gibt einen Einblick, wie der Chip tatsächlich mit Dingen umgeht, was physikalisch vor sich geht.
Ihr Modell mag eine gültige Methode sein, um über Ihre Probleme auf Ihre Weise nachzudenken, aber es bietet keinerlei Einblick in die Funktionsweise. Sie könnten 27 Interrupts haben, die alle priorisiert sind und zusammen laufen, oder Sie könnten einfach eine MCU haben, die nichts tut, außer Code auf einem einzigen Interrupt auszuführen.

Ihr Verständnis ist im Allgemeinen richtig. Sie haben einige Dinge erwähnt, die bis zu einem gewissen Grad gerätespezifisch sind, z. B. das Schreiben von 1 und 0 zum Aktivieren und Deaktivieren von Interrupts, da einige Architekturen etwas anders funktionieren und nicht alle Prozessoren verschachtelte Interrupts zulassen.