3 Stimmen

Wie geht vxWorks mit zwei Tasks mit der gleichen Priorität um?

Wir haben zwei Tasks (T1 und T2) in unserem eingebetteten vxWorks-System, die die gleiche Priorität (110) haben.
Wie geht der normale vxWorks-Scheduler damit um, wenn beide Tasks zur Ausführung bereit sind?
Welche Aufgabe wird zuerst ausgeführt?

5voto

unwieldy Punkte 197

Der Task, der zuerst ausgeführt wird, ist der Task, der als erster von der VxWorks-Scheduler-Task gestartet wird. VxWorks verwendet prioritätsbasierte Planung standardmäßig. Da in Ihrem Fall T1 und T2 die gleiche Priorität haben, wird derjenige, der die CPU zuerst erhält, unbegrenzt weiterlaufen, bis er explizit blockiert wird (mit taskSuspend o taskDelay ), woraufhin die andere READY-Aufgabe ausgeführt wird, bis sie blockiert wird, und so weiter. Dies sollte durch Semaphoren oder Mutexe (Mutices?) kontrolliert werden.

Das Hauptproblem der prioritätsbasierten Zeitplanung wird durch genau dieses Problem verdeutlicht. Wie wird festgelegt, wie lange diese Aufgaben laufen sollen? Die Tatsache, dass sie dieselbe Priorität haben, erschwert die Sache. Ein weiteres Problem ist, dass VxWorks-Tasks mit hoher Priorität (eine niedrigere Zahl bedeutet höhere Priorität) Ihrer Anwendung zuvorkommen können, worauf Sie in Ihrem Code vorbereitet sein müssen. Diese Probleme können gelöst werden durch die Verwendung von Round-Robin-Planung . Die zusätzlichen Probleme, die sich bei der Planung nach dem Round-Robin-Prinzip ergeben, und die Lösungen werden beschrieben aquí .

2voto

Benoit Punkte 36144

VxWorks hat 256 Prioritätsstufen (0 ist die höchste, 255 die niedrigste). Zu jedem Zeitpunkt wird die Aufgabe mit der höchsten Priorität auf der CPU ausgeführt. Jede Prioritätsstufe hat konzeptionell eine Warteschlange, in der mehrere Aufgaben zur Ausführung anstehen.

Wir haben 3 Tasks mit der gleichen Priorität A, B, C. Angenommen, A wird ausgeführt.
Wenn A blockiert (taskDelay, SemTake, msgQReceive), wird B mit der Ausführung beginnen.
Wenn A die Blockierung aufhebt, wird es an das Ende der Warteschlange gestellt. Wir haben jetzt B, C, A.
Wenn B blockiert, übernimmt C, usw...

Wenn die Round-Robin-Planung (Zeitscheibenplanung) aktiviert ist, gilt das gleiche Konzept, aber die Aufgabe wird an das Ende der Warteschlange gestellt, wenn ihre Zeitscheibe abgelaufen ist.

Beachten Sie, dass eine Aufgabe, die von einer Aufgabe mit höherer Priorität vorgezogen wird, NICHT die Reihenfolge in der Warteschlange beeinflusst. Wenn A läuft und von einer Aufgabe mit höherer Priorität verdrängt wird, wird sie weiter ausgeführt, wenn die Aufgabe mit höherer Priorität fertig ist. Sie wird nicht an das Ende der Warteschlange gestellt.

1voto

robert.berger Punkte 12431

Standardmäßig wird diejenige ausgeführt, die als erste gestartet wird, und solange sie die CPU nicht abgibt, wird die andere nicht ausgeführt.

Sie können explizit Round-Robin aktivieren, dann werden sie Timeslice.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X