Was bringt es, pegelbasierte Interrupts zu haben?


8

Wo immer ich nach der praktischen Implementierung des Level-basierten Interrupts gesucht habe, habe ich nur einen Vorschlag gefunden, den die Leute gegeben haben, dh den Interrupt zu deaktivieren, sobald er in den ISR eintritt, damit er nicht immer wieder ausgelöst wird.

Eine andere Sache, die ich gelesen habe, ist, dass es verwendet wird, um eine Schleife zu erstellen, dh solange ein Interrupt vorhanden ist, dienen Sie dem ISR, aber das könnte mit einer whileoder- do whileSchleife erreicht werden.

Und die Vorteile, die ein Level-Edge-Interrupt bieten würde, könnten der Luxus sein, eine Anweisung des Hauptprogramms zwischen dem Servieren der ISRs und der Latenz auszuführen. Ich vermute.

Fehlt mir also etwas, wenn es darum geht, den Level-Edge-Interrupt zu verstehen?

Eine gute Antwort wäre, mir eine praktische Verwendung von pegelbasierten Interrupts zu zeigen.


... Eine andere Sache, die ich gelesen habe, ist, dass sie verwendet wird, um eine Schleife zu erstellen, dh solange ein Interrupt vorhanden ist, dem ISR zu dienen, aber dies könnte mit einer Weile erreicht werden oder eine while-Schleife ausführen ... Die Tatsache, dass etwas sein kann Ein Weg erreicht bedeutet nicht, dass wir alle anderen Wege, dasselbe zu tun, eliminieren sollten.
Eugene Sh.

@ EugeneSh. Kein Zweifel, aber es muss einen soliden Vorteil geben, dasselbe auf die andere Weise zu tun. Ist es nicht? Ich bin mehr daran interessiert, diesen "Vorteil" zu kennen. Ich möchte nur wissen, welchen Unterschied es beim Schleifen mit Schleifenanweisungen und pegelbasierten Interrupts macht. Wenn Schleifen der einzige Zweck ist, der damit erreicht wird.
MaNyYaCk

2
Was ist, wenn auf einer Leitung mehrere Interrupts anstehen? zB verarbeitet jeder ISR-Trigger ein Datenpaket, aber das Gerät hat mehrere in der Warteschlange? Bei einem durch Flanken ausgelösten Interrupt muss der Interrupt-Controller wissen, wann der vorherige Interrupt behandelt wird und wann der nächste Interrupt gesendet werden muss. Auch für Anwendungsfälle, in denen mehrere Interrupts aktiviert sind, während der Host noch einen vorherigen verarbeitet, ist es schwierig, diese ohne Warteschlangenauslösung in die Warteschlange zu stellen und zu priorisieren.
user3528438

Antworten:


10

Pegelbasierte Interrupts können einfach und zuverlässig sicher gemeinsam genutzt und kaskadiert werden. Im Gegensatz dazu ist es oft schwierig und manchmal unmöglich, flankengetriggerte Interrupts zuverlässig zu teilen.

Bei der Verwendung von pegelbasierten Interrupts kann ein Interrupt-Handler einfach jede mögliche Interrupt-Quelle der Reihe nach "Benötigen Sie Aufmerksamkeit" fragen und diese gegebenenfalls warten. Sobald dies erledigt ist, kann der Handler zurückkehren. Wenn eine Interrupt-Quelle, die zu Beginn der Sequenz abgefragt wurde, entscheidet, dass sie Aufmerksamkeit benötigt, während eine spätere Quelle gewartet wird, bemerkt der Prozessor, dass der IRQ-Pin noch aktiv ist, und löst den Interrupt-Handler erneut aus, wodurch der spät ankommende Interrupt zugelassen wird gewartet werden.

Bei Verwendung von nicht kaskadierten, durch Flanken ausgelösten Interrupts werden die Dinge komplizierter. Nachdem ein Interrupt-Handler alle durchlaufen und gewartet hat, muss er alle erneut abfragen, um herauszufinden, ob ein zuvor abgefragtes Gerät entschieden hat, dass es gewartet werden muss. Erst wenn jedes Gerät nacheinander gemeldet hat , dass es keinen Service benötigt, kann der Interrupt sicher zurückkehren. Beachten Sie, dass, wenn Geräte, die einen Service wünschen, die Anzeige "Service benötigen" aktiv bleiben, die Rückkehr von einem Interrupt-Handler zu einem Zeitpunkt, an dem ein Gerät einen Service benötigt, diesen Interrupt möglicherweise dauerhaft unbrauchbar macht.

Es kann nützlich sein, wenn ein E / A-Pin über eine Kantenerfassungslogik verfügt, die beim Eintreffen einer Flanke einen Latch setzt und eine "Need-Service" -Anzeige ausgibt, bis die Software sie löscht. So etwas könnte ganz vorne als kantensensitiver Interrupt erscheinen. An jedem Downstream-Punkt ist es jedoch besser, wenn die Interrupt-Logik verlangt, dass ein Interrupt jederzeit gewartet wird, wenn ein Upstream-Punkt nicht erfüllt ist.


Ich möchte mich entschuldigen, dass ich mir so viel Zeit genommen habe. Die Frage, die ich gestellt habe, war jedoch sehr spezifisch für die externen Interrupts des Controllers, und ich brauchte einige Zeit, um alle eingehenden Antworten zu verstehen, wenn man bedenkt, dass der Prozessor einen Interrupt-Controller hat. Vielen Dank für diese wertvolle Antwort.
MaNyYaCk

6

Eine offensichtliche Situation, in der pegelbasierte Interrupts nützlich sind, ist die Situation, in der sich das Signal bereits in diesem Zustand befindet, wenn der Code beginnt, das Signal zu überwachen.

Betrachten wir ein typisches Beispiel ...

Signal: "Case_Over_Temperature" Wird niedrig, wenn die Umgebung in der Box für den normalen Betrieb zu hoch ist.

Offensichtlich kann dieses Signal jederzeit niedrig werden, entweder weil wir zu viel Wärme erzeugen oder weil die Box an einem heißen Ort installiert ist.

Offensichtlich könnte sich diese Leitung beim Einschalten in einem der beiden Zustände befinden. Nehmen wir für den Moment an, dass der Einschaltcode nicht nur nachschaut, sondern sich stattdessen auf den Interrupt stützt. Wenn der Interrupt flankengetriggert ist und das Signal bereits niedrig ist, wird bei Aktivierung des Interrupts der entsprechende Code nicht ausgeführt. Pegelsensitive Interrupts wären hier umsichtig.

In ähnlicher Weise kann diese Leitung jederzeit niedrig werden, wenn der Prozessor in den Ruhezustand versetzt wird und nicht so eingestellt ist, dass er bei diesem Interrupt aufwacht. Wenn etwas anderes aufwacht, soll der Interrupt zu diesem Zeitpunkt ausgelöst werden.

In der Tat sind mit der Verbreitung von Prozessoren im Schlafmodus pegelbasierte Interrupts wohl nützlicher geworden.

Wie bei allem, was mit Code zu tun hat, gibt es jedoch immer mehr als einen Weg, eine Katze zu "häuten". Wenn Sie kein Level-basiertes verwenden, muss der Weckcode die Interrupt-Pins abfragen, wenn sie nicht automatisch vom Prozessor in die Warteschlange gestellt werden.

Offensichtlich hat das ausgelöste Level auch seine eigenen Probleme, da der Code mit dem Wissen umgehen muss, dass er die Bedingung usw. bereits behandelt hat.


2

Es ist etwas umgekehrt: Warum haben Sie unangenehme, durch Flanken ausgelöste Interrupts, wenn Sie die einfacheren Level-Trigger haben können?

Flankengetriggerte Interrupts sind anfälliger für Rauschspitzen und schwerer zu filtern. Sie sind dann riskanter, Off-Board- oder Up-Kabel zu verlegen. Der Interrupt kann von der Quelle nicht zurückgezogen werden.

Pegelgetriggerte Interrupts bleiben eingeschaltet, bis die CPU die Quelle bestätigt. Es gibt also die solide Basis für volles Händeschütteln. Die CPU kann Rauschen aus dem Interrupt-Signal auf nahezu jede gewünschte Weise herausfiltern. Sie erhöht lediglich die Interrupt-Antwortzeit. Wenn die Anwendung gut gefilterte Signale erfordert und zulässt, kann die Pegelauslösung angepasst werden.

Ich habe zum ersten Mal flankengetriggerte Interrupts gesehen, die für NMIs auf CPUs wie Z80 und 6502 verwendet wurden, während maskierbare Interrupts pegelgetriggert wurden. Die NMIs verwendeten flankengetriggert, um einfach zu verhindern, dass ein festsitzender Pin oder eine feststeckende Treiberschaltung die CPU für immer daran hindert, wieder in den NMI-ISR einzutreten. Das NMI muss Aktivität zeigen, um eine andere zu erhalten.

Die Antwort ist natürlich, dass beide ihre Anwendungen haben. Aber Level-Triggered ist der Startpunkt und Edge-Triggered, weil es einen Sonderfall gibt.


1
Ich würde nicht sagen, dass die Z80 und 6502 flankengetriggerte Interrupts verwendeten, um Probleme mit "feststeckenden" Pins zu vermeiden. Stattdessen würde ich sagen, dass sie in der Lage sein müssen, jede Art von Interrupt zu maskieren, sobald die Wartung begonnen hat, und für NMI wird dies über einen speziellen "Mask NMI" -Latch erreicht, der gesetzt wird, wenn ein NMI gewartet wird, und gelöscht wird, wenn der NMI-Pin ist freigegeben.
Supercat

@supercat, Sie haben beschrieben, wie Sie es sehen, aber nicht, wie Z80 / 6502 funktioniert. Das NMI könnte wie INT / IRQ eben sein, wobei die Interruptquelle durch die Interrupt-Bestätigung hw oder sw entfernt wurde. Funktioniert einwandfrei. Was hat sie Ihrer Meinung nach dazu gebracht, NMI als flankengetriggert und INT / IRQ als Level zu entwerfen? Was sehen Sie als Vorteil?
TonyM

Der Begriff "flankengetriggert" wird verwendet, um Eingänge zu beschreiben, die eine Flankenerkennungsschaltung vor einem Synchronisierer platzieren, so dass ein Signal, das alle innerhalb eines einzelnen Zyklus kommt und geht, verarbeitet wird, aber ich habe auch gesehen, dass es zur Beschreibung von Eingängen verwendet wird die ein Signal an jedem Taktsignal speichern und nach einem Signal suchen, das in einem oder mehreren Zyklen fehlt und dann für einen oder mehrere Zyklen vorhanden ist. Wenn das NMI von der Software bestätigt werden müsste, würde ein Fehler beim Bestätigen des ersten Interrupts effektiv alle nachfolgenden maskieren.
Supercat

@supercat, so funktioniert Z80 / 6502 nicht und sie allein waren Gegenstand meines Beispiels, das Sie in Frage gestellt haben. Wenn Sie nach einer Diskussion über kantengetriggerte NMIs suchen, gehen Sie bitte zum Chat, um einen erweiterten Kommentaraustausch zu vermeiden. Ich bin mir jedoch nicht sicher, was ich hinzufügen kann. Vielen Dank.
TonyM

Ich habe mir die Details der Funktionsweise des Z80 nicht angesehen, aber laut 6502-Datenblatt wird NMI einmal auf jeder Phi2-Uhr abgetastet. Das Datenblatt enthält keine Angaben zu den Abtast- / Haltezeiten, aber nach dem, was ich an anderer Stelle gelesen habe, werden NMI-Impulse, die während mindestens drei aufeinanderfolgender Abtastungen nicht vorhanden sind, nicht immer verarbeitet.
Superkatze

1

Levelbasierte ISRs unterstützen Ack / Nak, was nützlich ist, wenn Sie viele Quellen haben.

Wenn Sie viele ISRs und viele Prioritätsränge sowohl in SW als auch in externen HW mit Rangprioritäten haben.

Wenn alle Quellen Edge OR wären, müssten Sie immer noch jede abfragen, um herauszufinden, welche Quelle eingestellt ist, und dann den Interrupt löschen.

Daher haben sowohl Kante als auch Ebene Vorteile in unterschiedlichen Architekturen.

Um zu vermeiden, dass ein Edge-IRQ fehlt, muss er aktiviert und unmittelbar nach dem Ende des ISR getestet werden.

Einige Level-IRQs können länger als der ISR dauern und bei Bedarf erkannt werden.


1

Wenn eine "Party Line" zusammen mit Open-Drain oder Open-Collector verwendet wird, ist der Level-Betriebsmodus sinnvoller.

In diesem Fall aktiviert jede "Partei" in der Leitung ihre Ausgabe, wenn sie "Service" benötigt. Wenn die Interrupt-Bearbeitungssoftware ausgeht und nacheinander jedes Gerät auf der Party-Leitung abfragt (und dann verarbeitet), geben diese Geräte ihren Halt frei und werden inaktiv. Schließlich sind keine (Level-) Interrupts mehr vorhanden, die Interrupt-Leitung selbst wird inaktiv und die Software-Interrupts werden wieder "ruhig".


1
es ist wichtig. Was ist, wenn der Host eine weitere Kante auf einer anderen Leitung empfängt, wenn er bereits einen Interrupt verarbeitet? Einige Möglichkeiten: 1) Ignorieren Sie den eingehenden Interrupt. 2) Warteschlange in der Hardware; 3) Unterbrechen Sie den aktuellen Interrupt-Handler und behandeln Sie den neuen, entweder vollständig oder in der Warteschlange für später. Mit dem Level-Trigger lassen Sie es einfach dort und es wird immer noch für Sie da sein, nachdem Sie mit dem aktuellen ISR fertig sind.
user3528438

@ user3528438 Ich spreche die Frage nach dem "Warum-Level" an. Also werde ich diesen Teil einfach entfernen und Debatten vermeiden.
Jonk

1
Selbst wenn dedizierte Interrupts verwendet werden, würde ich vorschlagen, dass durch Flanken ausgelöste Interrupts nur dann besser sind, wenn man daran interessiert sein könnte, auf ein Ereignis zu reagieren, das zu dem Zeitpunkt, an dem es gewartet werden kann, ein- und ausgegangen ist, und sogar dort mithilfe einer Ereignisverriegelung Ein Gerät zum Ansteuern eines pegelsensitiven Interrupts kann genauso nützlich sein wie die Verwendung eines flankensensitiven Interrupts. Ein flankengetriggerter Interrupt speichert möglicherweise eine Anweisung, die andernfalls zum Löschen des Latch erforderlich wäre, aber dies ist im Allgemeinen keine sinnvolle Kosten oder Einsparung.
Supercat

@supercat Ich habe meine Antwort neu ausgerichtet, um die Frage mit dem Titel direkt zu beantworten, um zu vermeiden, dass ich mich auf ein langes, schmutziges Kapitel und einen langen Vers einlasse. Viel einfacher. (Ja, ich verwende seit ... 1974 alle Arten von Interrupt-Methoden, also habe ich alle Gründe gesehen, denke ich. Ich möchte sie heute einfach nicht diskutieren.)
jonk
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.