Software-Interrupt gegen Funktion

10

Nach ungefähr 3 Jahren Arbeit mit MCUs weiß ich immer noch nicht, wozu Software-Interrupts gut sind. Ich habe mehrere Arbeiten mit STM32 ausgeführt und die Software-Interrupts nie verwendet. Dies ist in der Tat eine große Frage für mich:

Warum sollten wir einen Software-Interrupt verwenden, wenn wir eine einfache Funktion zum Ausführen einer Aufgabe verwenden können? Was sind die Unterschiede zwischen einem Software-Interrupt und einer Funktion?

Sie können jederzeit eine Funktion aufrufen (die Sie für Ihren Job geschrieben haben). Die Verwendung eines Software-Interrupts anstelle einer einfachen Funktion sollte einige Vorteile haben. Ich bin mir nicht sicher, aber ich denke, dass Software-Interrupts einen Vorteil haben: Sie können einem Software-Interrupt eine Priorität zuweisen und dann dem Software-Interrupt eine höhere Priorität zuweisen, um zu vermeiden, dass der Hardware-Interrupt Ihre Aufgabe unterbricht.

Roh
quelle
1
Ich denke, der Hauptzweck für die Verwendung von Interrupts besteht darin, dass Sie andere wichtige Aufgaben ausführen können, während Sie darauf warten, dass etwas anderes passiert, und wenn die Timings nicht immer konstant sind. Ich denke auch, dass es in den meisten Fällen etwas schneller ist als das Abrufen.
MrPhooky
1
@ MrPhooky Das sind Hardware-Interrupts, von denen Sie sprechen. Das OP spricht von Software-Interrupts.
Brhans

Antworten:

19

Der Hauptunterschied zwischen einer Funktion und einem Software-Interrupt ist der sogenannte Kontext .

  • Eine Funktion wird im Kontext Ihres Hauptprogramms ausgeführt.
  • Ein Interrupt wird im Kontext des Interrupt-Handlers ausgeführt.

Auf einem einfachen System ist dies möglicherweise kein wirklicher Unterschied, und Software-Interrupts können einfach als bequeme Möglichkeit zur Bereitstellung von im ROM fest codierten Bibliotheksroutinen verwendet werden. Sie müssen nicht die Adresse jeder Routine kennen, sondern nur den ID-Code und den Haupteinstiegspunkt. Dies macht Ihren Code portabler.

Auf komplexeren Systemen kann der Software-Interrupt jedoch in einer völlig anderen Umgebung ausgeführt werden, die als Kernel-Kontext bezeichnet wird . Normalerweise wird Ihre Anwendung in einem geschützten Benutzerkontext ausgeführt, der nur eingeschränkten Zugriff auf Ressourcen hat. Nur wenn Sie im Kernel-Kontext ausgeführt werden, können Sie die komplizierteren Aufgaben ausführen - tatsächlich beschränken einige Systeme sogar, welche Anweisungen ausgeführt werden können, sodass Sie einen Mechanismus zum Auslösen von Code im Kernel-Kontext benötigen - und dafür wird ein Interrupt verwendet.

Majenko
quelle
1
Außerdem können Interrupts den Fortschritt eines Programms willkürlich stoppen, sodass das System etwas anderes tun kann (z. B. Hardware-Interrupts). Ihre Programme müssen dies nicht berücksichtigen, da der Status der Funktion aus Sicht Ihres Programms gegenüber dem Zeitpunkt des Interrupts unverändert bleibt. Auf älteren Systemen simulierten TSR-Programme (Terminate / Stay Resident) auf diese Weise Multitasking, indem sie den Timer / Clock-Interrupt abkoppelten. Auch ohne IOPL-Level hatte es den Vorteil, beispielsweise die Systemuhr auf dem neuesten Stand zu halten.
Phyrfox
4
Beachten Sie möglicherweise auch, dass diese "Software-Interrupts" auch als "synchrone Interrupts" bezeichnet werden, da der Anwendungscode genau weiß, wann und warum ein solcher Interrupt auftritt, im Gegensatz zu "asynchronen Interrupts", die aus Sicht der Anwendung, grundsätzlich jederzeit in unaufgeforderter Weise erfolgen.
JimmyB
@HannoBinder: Ich denke, das OP spricht über das Posten von Interrupt-Anforderungen an den Cortex-M3-Vektor-Interrupt-Controller. Wenn der Code für einen Interrupt mit hoher Priorität einen Interrupt mit niedrigerer Priorität veröffentlicht, wird die Anforderung bis zu einem späteren Zeitpunkt zurückgestellt, wenn alle Interrupts mit höherer Priorität beendet sind.
Supercat
12

Software-Interrupts können verwendet werden, um eine Interrupt-Task mit einer niedrigeren Priorität abzuschließen. Zeitkritischer Code erhält häufig eine hohe Interrupt-Priorität, um zu viel Latenz zu vermeiden. Sobald der zeitkritische Teil fertig ist, kann es zusätzliche Aufgaben geben, die für die Hauptschleife zu zeitkritisch sind, aber nicht so kritisch sind, dass sie andere Interrupts mit hoher Priorität aufhalten. Dies kann durch Auslösen eines Software-Interrupts mit niedrigerer Priorität erreicht werden.

Angenommen, Sie haben mehrere Schrittmotoren mit jeweils einem eigenen Timer. Die Timer-Interrupts erhalten eine hohe Priorität, um Schrittjitter zu minimieren. Die zeitkritischste Aufgabe kann so einfach sein wie das Einstellen oder Löschen eines Schrittimpulses oder das Vorrücken der Phasenausgänge. Möglicherweise sind zusätzliche Funktionen erforderlich, z. B. die Berechnung von Beschleunigungsrampen, die Sensorverarbeitung usw. Da diese in jedem Schritt verarbeitet werden müssen, ist es möglicherweise nicht angebracht, diese von main () aus zu verarbeiten, da der Zeitpunkt der Hauptschleife möglicherweise zu lang ist. Diese zusätzlichen Aufgaben können von einem Software-Interrupt mit niedrigerer Priorität verarbeitet werden, um die Latenz der anderen Schrittkanäle mit hoher Priorität nicht zu erhöhen.

Was ist der Unterschied zwischen einem Software-Interrupt und einer Funktion?

Eine Funktion wird sofort von jedem Ort aus aufgerufen und ändert die aktuelle Interrupt-Prioritätsstufe nicht, wenn sie von einem Interrupt aufgerufen wird. Ein Software-Interrupt ist ein Interrupt-Trigger, der dazu führt, dass dieser Interrupt aufgerufen wird, wenn seine Priorität erreicht wird. Wenn ein Funktionsaufruf am Ende eines Interrupts mit hoher Priorität eingefügt würde, wäre die Funktion in diesem Interrupt mit hoher Priorität enthalten. Durch Auslösen des Software-Interrupts mit niedrigerer Priorität und anschließendes Zurückkehren vom Interrupt mit hoher Priorität wird die Funktionalität mit der neuen (niedrigeren) Priorität aufgerufen.

Tut
quelle
2
Ein anderes häufiges Muster kann sein, einen 100-kHz-Interrupt zu haben, um zeitkritische Dinge zu verarbeiten, und auch einen 1-kHz-Timer-Tick zu benötigen, aber nicht zwei separate Timer zur Verfügung zu haben. Es dauert nicht lange, bis eine 100-kHz-Interrupt-Routine sagt, dass if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; der andere Interrupt seine Aufgabe erfüllen kann, und bei kurz deaktivierten Interrupts 100 zu timer_count hinzufügen kann. Selbst wenn die 1-kHz-Routine mehr als 10 us benötigt, wird die 100-kHz-Routine nicht gestört.
Supercat
In ähnlicher Weise habe ich Software-Interrupts in einfachen Systemen (ohne vollständiges RTOS) als Pseudo-Scheduler verwendet, bei denen die Hardwareanforderungen von den ISRs behandelt werden, aber Rückruffunktionen und andere langwierige Aufgaben, die als Reaktion auf Änderungen in ausgeführt werden Der Hardwarestatus wird an den Software-Interrupt delegiert.
Evil Dog Pie
Sie haben im Grunde eine Variation der "unteren Hälfte" beschrieben. Haben Sie eine Referenz dafür, dass dies auch als "Software-Interrupt" bezeichnet wird? Es ist eine ganz andere Bedeutung als Majenkos Antwort, und die Frage ist mit ARM gekennzeichnet - die Architektur verfügt tatsächlich über die Anweisung SWI (Software Interrupt).
Domen
3
@domen Ich bin mir nicht sicher, welche Art von Referenz Sie benötigen. Es wird als "Software-Interrupt" bezeichnet, weil dies verwendet wird, um dies zu erreichen. Im Zusammenhang mit ARM verwies das OP speziell auf das STM32 und stellte einen Link zum RM0008-Referenzhandbuch bereit. Dies ist kein ARM-Kernreferenzhandbuch. Der einzige in RM0008 behandelte "Software-Interrupt" ist das EXTI_SWIER (Software-Interrupt-Ereignisregister), mit dem Software-Interrupts generiert werden können, unabhängig davon, ob die tatsächlichen Hardware-Pins für Interrupts verwendet werden oder nicht. Ich habe die SWI (SWC) -Anweisung nicht persönlich verwendet.
Tut
Vielen Dank! Es kann sinnvoll sein, einige dieser Informationen in die Antwort aufzunehmen, um zu verdeutlichen, um welchen "Software-Interrupt" es sich handelt.
Domen
7

Um die Antwort von Majenko ein wenig zu erweitern, werden Software-Interrupts verwendet, um Betriebssysteme zu implementieren, insbesondere die Systemaufrufschnittstelle. Dies bedeutet, dass Anwendungen nicht mit dem Betriebssystem verbunden sein müssen, um Funktionsaufrufe durchzuführen, und der Kontextwechsel ermöglicht es dem Betriebssystem, den Zugriff auf die Hardware zu beschränken und beispielsweise geschützten Speicher zu nutzen.

Wenn Sie kein Betriebssystem verwenden und den gesamten Code auf der MCU steuern, müssen Sie wahrscheinlich keine Software-Interrupts verwenden. (Obwohl, wie Tut erwähnte, sie andere Verwendungszwecke haben können.)

Die Linux- und MS-DOS- Systemaufrufschnittstellen auf x86 verwenden Software-Interrupts, daher werde ich als Beispiel auf diese verweisen.

Adam Haun
quelle
1
Und in vielen Fällen, in denen das Betriebssystem weiche Interrupts verwendet, sind diese in Funktionen eingebunden, um das Leben zu vereinfachen.
Hildred
1
Ich programmiere immer noch Dinge (auch brandneu) für DOS und bin mit den int 21-Handlern sehr vertraut. Fast alles, was ich für die E / A benötige, wird mit dem DOS ISR erledigt.
R Drast
Beachten Sie, dass die für Linux zitierte Seite von 1993-1996 stammt.
ein CVn
Ich habe den Link durch einen aktuelleren ersetzt.
Adam Haun