Ich bin ein Embedded-Entwickler. Ich habe nicht mit RTOS/Linux gearbeitet. Ich ging RTOS-Konzepte durch, als ich über „Kontextwechsel“ stolperte. Ich verstehe, dass beim Kontextwechsel alle Register zusammen mit PC (Programmzähler) im Stapel gespeichert werden, bevor ein anderer Thread in den Prozessor geladen wird. Geschieht nicht etwas Ähnliches, wenn ein Interrupt auftritt (in einem Controller, der kein Betriebssystem verwendet)?
Wie unterschiedlich sind diese beiden Begriffe?
Es gibt keinen grundlegenden Unterschied, es ist eher eine Frage des Grades – der Menge an Kontext, die gespeichert werden muss.
Wenn ein RTOS-Thread-Kontextwechsel auftritt, muss der gesamte CPU-Zustand, den ein Thread verwenden könnte, gespeichert werden. Dies umfasst normalerweise alle CPU-Register, einschließlich Flag- oder Statusregister, sodass der Thread nach ihrer Wiederherstellung fortgesetzt wird, als ob nie etwas passiert wäre.
Wenn ein Interrupt auftritt, gibt es immer noch einen Kontextwechsel, aber nur der Kontext, den der Interrupt-Handler tatsächlich verwenden muss, muss gespeichert und anschließend wiederhergestellt werden. Wenn Sie Ihren Interrupt-Handler in einer Hochsprache schreiben, entspricht dies ziemlich genau einem vollständigen Thread-Kontextwechsel, da es keine Einschränkungen dafür gibt, welche Ressourcen ein solcher Interrupt-Handler berühren könnte. Wenn Sie Ihren Interrupt-Handler jedoch in Assemblersprache schreiben, können Sie genau verfolgen, welche Register er berührt, und nur diese speichern. Dadurch kann die Ausführung des Interrupt-Handlers extrem schnell erfolgen, was seine Auswirkungen auf den Rest des Systems verringert und/oder ihm ermöglicht, Interrupts mit einer höheren Rate zu verarbeiten.
Sowohl Interrupts als auch Kontextwechsel sind Interrupts. Der Hauptunterschied besteht darin, was nach dem Interrupt oder Kontextwechsel passiert.
Bei einem Interrupt wird der aktuelle Zustand (oder Kontext) in einem temporären Bereich (normalerweise, aber nicht immer, dem Stack) gespeichert. Die ISR erledigt dann ihre Aufgabe, und der Zustand wird dann wiederhergestellt und die Interrupt-Routine kehrt zurück. Das Entscheidende dabei ist, dass die ISR genau dort ansetzt, wo sie im selben Thread aufgehört hat .
Ein Kontextwechsel sieht genauso aus wie ein Interrupt. Der Zustand wird wie gewohnt im Stack gespeichert. Der Speicherort dieses Stacks und alle zusätzlichen Zustandsinformationen werden jedoch an anderer Stelle (im Thread ) gespeichert . Ein neuer Datensatz von einem anderen Thread wird dann durch die aktuellen Daten ersetzt und die ISR kehrt zurück. Hier kehrt die ISR jedoch nicht dorthin zurück, wo sie aufgehört hat, sondern dorthin zurück, wo der neu eingeschaltete Thread unterbrochen wurde, als während seiner Ausführung das letzte Mal ein Kontextwechsel stattfand.
Es ist diese Änderung des Rückkehrortes und der Daten, die, abgesehen davon, was der Inhalt der ISR sein kann, eine ISR von einem Kontextwechsel unterscheidet.
m.Alin
Paul A. Clayton
KyranF
seetharaman