2010-06-08 10 views
9

Möchten wissen, wie der Scheduler aufgerufen wird, damit er Aufgaben wechseln kann. Wie auch bei seiner vorbeugenden Planung oder Round-Robin-Planung - der Scheduler sollte in ein Bild kommen, um irgendeine Art von Aufgabenumschaltung durchzuführen. Angenommen, eine Aufgabe mit niedriger Priorität hat eine Endlosschleife - wann greift der Scheduler ein und wechselt zu einer Aufgabe mit höherer Priorität?Wie wird ein VxWorks Scheduler ausgeführt?

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

Vielen Dank im Voraus.

--Ashwin

+0

Während ich VxWorks nicht kenne, wird der Scheduler in anderen Betriebssystemen normalerweise von einem Timer-Interrupt aufgerufen, so dass er Aufgaben wechseln kann, selbst wenn gerade eine Task aktiv ist. – Rudi

Antwort

12

Die einfache Antwort ist, dass vxWorks die Kontrolle über einen Hardware-Interrupt vom System-Timer übernimmt, der bei laufendem System ständig in festen Intervallen auftritt.

Hier genauer:

Wenn vxWorks gestartet wird, konfiguriert die Hardware einen Timer interrupt alle n Millisekunden zu erzeugen, wobei n oft 10 ist aber völlig abhängig von Ihrer Hardware. Das Timer-Intervall wird in der Regel von vxWorks in Ihrer Board Support Package (BSP) beim Start eingerichtet.

Jedes Mal, wenn der Timer einen Interrupt auslöst, beginnt das System mit der Ausführung des Timers interrupt handler. Der Timer-Interrupt-Handler ist Teil von vxWorks, sodass vxWorks jetzt die Kontrolle hat. Als erstes wird der CPU-Status (z. B. Register) in der Task Control Block (TCB) der aktuell ausgeführten Task gespeichert.

Dann startet vxWorks schließlich den Scheduler, um festzustellen, wer als nächstes ausgeführt wird. Um eine Aufgabe auszuführen, kopiert vxWorks den Status der Aufgabe von seiner TCB in die Maschinenregister, und danach übernimmt die Aufgabe die Steuerung der CPU.

Bonus Info:

vxWorks bietet hooks in die Aufgabe Schaltlogik, so dass Sie eine Funktion aufgerufen haben können, wenn Ihre Aufgabe vorbelegt wird.

+0

Danke für die detaillierte Antwort ... – Ashwin

+0

Beachten Sie, dass dies nur gilt, wenn Sie Round-Robin-Scheduling aktivieren (durch Aufruf von kernelTimeSlice()), ist der Standardwert prioritätsbasierte vorbeugende Planung. – nos

+0

@nos: Der Timer-Interrupt wird immer ausgeführt, um Tick-Anzahl, Watchdog-Timer und Semaphor-Timeouts unabhängig von der Zeitplanungsrichtlinie zu verfolgen. Es passiert einfach, dass der vxWorks-Scheduler für die prioritätsbasierte präventive Zeitplanung keine neue Aufgabe auswählt, die ausgeführt werden soll, es sei denn, eine Zeitgeberoperation hat eine Aufgabe mit höherer Priorität in die Bereit-Warteschlange verschoben. Aber ein guter Punkt. Ich wollte diese Antwort immer aktualisieren, um genauer zu sein und Systemaufrufe einzubeziehen, die ich zu der Zeit völlig vergessen hatte. – indiv

0

Sofern Sie majorily angepasste Ziel Build wird der Planer durch den Timer-Interrupt aufgerufen. Details sind jedoch plattformspezifisch.

0

Der Scheduler wird auch aufgerufen, wenn der aktuelle Task abgeschlossen oder blockiert wird.

5

indiv bietet eine sehr gute Antwort, aber es ist nur teilweise genau.
Die eigentliche Arbeit des Systems ist etwas komplexer.

Der Scheduler kann entweder als Ergebnis von synchronen oder asynchronen Operationen ausgeführt werden.

Synchron bezieht sich auf Vorgänge, die als Ergebnis des Codes in der aktuell ausgeführten Aufgabe verursacht werden. Ein gutes Beispiel dafür wäre ein Semaphor (semTake).
Wenn der Semaphor nicht verfügbar ist, bleibt die aktuell ausgeführte Aufgabe hängen und ist nicht mehr zur Ausführung verfügbar. An diesem Punkt wird der Scheduler aufgerufen und bestimmt die nächste Task, die ausgeführt werden soll und führt einen Kontextwechsel durch.

Asynchrone Operationen beziehen sich im Wesentlichen auf Interrupts.Timer Interrupts wurden sehr gut von indiv beschrieben. Eine Reihe verschiedener Elemente könnte jedoch einen Interrupt auslösen: Netzwerkverkehr, Sensor, serielle Daten, usw.

Es ist auch gut daran zu denken, dass der Timer-Interrupt nicht unbedingt einen Kontextwechsel verursacht! Ja, der Interrupt wird auftreten, und die verzögerte Task und die Zeitscheibenzähler werden dekrementiert. Wenn die Zeitscheibe jedoch nicht abgelaufen ist oder keine vorrangige Aufgabe vom Übergabepunkt in den Bereitschaftszustand übergeht, wird der Scheduler nicht tatsächlich aufgerufen, und Sie kehren genau dort an die ursprüngliche Aufgabe zurück, wo Die Ausführung wurde unterbrochen.

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