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 while
oder- do while
Schleife 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.
quelle
Antworten:
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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".
quelle