Frage

Ich würde gerne wissen, wie der Scheduler aufgerufen wird, damit er Aufgaben wechseln kann. Wie in selbst wenn seine präventive Zeitplanung oder Runde Robin -Planung - der Scheduler sollte sich vorstellen, um irgendeine Art von Aufgabenwechsel durchzuführen. Angenommen, eine Aufgabe mit niedriger Priorität hat eine unendliche Schleife - wann interveniert der Scheduler und wechselt zu einer Aufgabe mit höherer Priorität?

Abfrage ist: 1. Wer ruft den Scheduler an? [in vxWorks] 2. Wenn es in regelmäßigen Abständen aufgerufen wird - wie wird dieser Mechanismus implementiert?

Danke im Voraus.

--Ashwin

War es hilfreich?

Lösung

Die einfache Antwort lautet, dass VXWorks die Kontrolle über einen Hardware -Interrupt vom Systemtimer übernimmt, der während des Ausführens des Systems kontinuierlich in festen Intervallen auftritt.

Hier ist mehr Details:

Wenn VXWorks startet, konfiguriert es Ihre Hardware, um einen Timer zu generieren unterbrechen jeder n Millisekunden, wo n ist oft 10, hängt aber vollständig von Ihrer Hardware ab. Das Timer -Intervall wird im Allgemeinen von VXWorks in Ihrem eingerichtet Board Support Package (BSP) wenn es beginnt.

Jedes Mal, wenn der Timer einen Interrupt feuert, beginnt das System mit der Ausführung des Timers Interrupt Handler. Der Timer Interrupt -Handler ist Teil von VXWorks, daher hat VXWorks die Kontrolle. Das erste, was es tut, ist, den CPU -Zustand (wie z. B. Register) in die zu retten Aufgabensteuerungsblock (TCB) der aktuell laufenden Aufgabe.

Dann führt VXWorks den Scheduler aus, um festzustellen, wer als nächstes ausgeführt wird. Um eine Aufgabe auszuführen, kopiert VXWorks den Status der Aufgabe von ihrem TCB in die Maschinenregister, und nachdem die Aufgabe die Kontrolle über die CPU hat.

Bonus Info:

VXWorks bietet Haken In die Aufgabenschaltlogik, damit eine Funktion aufgerufen werden kann, wenn Ihre Aufgabe vorgegeben wird.

Andere Tipps

Indiv bietet eine sehr gute Antwort, ist aber nur teilweise genau.
Die tatsächliche Arbeit des Systems ist etwas komplexer.

Der Scheduler kann aufgrund synchroner oder asynchroner Operationen ausgeführt werden.

Synchron bezieht sich auf Operationen, die durch den Code in der aktuell ausführenden Aufgabe verursacht werden. Ein Paradebeispiel würde darin bestehen, ein Semaphor (Semtake) zu nehmen.
Wenn das Semaphor nicht verfügbar ist, wird die derzeit ausführende Aufgabe angehalten und nicht mehr zur Ausführung verfügbar. Zu diesem Zeitpunkt wird der Scheduler aufgerufen und die nächste Aufgabe ermittelt, die ausführen sollte, und einen Kontextschalter ausführen.

Asynchrone Operationen beziehen sich im Wesentlichen auf Interrupts. Timer -Interrupts wurden durch Indiv sehr gut beschrieben. Eine Reihe verschiedener Elemente kann jedoch dazu führen, dass ein Interrupt ausgeführt wird: Netzwerkverkehr, Sensor, serielle Daten usw.

Es ist auch gut zu beachten, dass der Timer -Interrupt nicht unbedingt einen Kontextschalter verursacht! Ja, der Interrupt tritt auf, und die verzögerte Aufgabe und die Zeitschnitte werden verringert. Wenn jedoch die Zeitscheibe nicht abgelaufen ist oder nein höher Priority Task wechselt vom vorangegangenen Zustand in den Ready -Status, dann wird der Scheduler nicht tatsächlich aufgerufen, und Sie kehren zu der ursprünglichen Aufgabe zurück, an dem genauen Punkt, an dem die Ausführung unterbrochen wurde.

Beachten Sie, dass der Scheduler keinen eigenen Kontext hat. Es ist keine Aufgabe. Es ist einfach Code, der in dem Kontext ausführt, aus dem er aufgerufen wird. Entweder aus dem Interrupt -Kontext (asynchron) oder aus dem aufgerufenen Aufgabenkontext (synchron).

Sofern Sie nicht einen wesentlich kundenspezifischen Zielbau haben, wird der Scheduler vom Timer-Interrupt aufgerufen. Details sind jedoch plattformspezifisch.

Der Scheduler wird außerdem aufgerufen, wenn die aktuelle Aufgabe abgeschlossen wird oder Blöcke.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top