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.
quelle
Antworten:
Der Hauptunterschied zwischen einer Funktion und einem Software-Interrupt ist der sogenannte Kontext .
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.
quelle
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.
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.
quelle
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.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.
quelle