2008-09-17 82 views

回答

5

首先運行的任務是由VxWorks調度程序任務實現的首先產生的任務。 VxWorks默認使用基於優先級的調度。因此,在你的情況下,由於T1和T2具有相同的優先級,無論哪一個首先得到CPU,都將繼續無限期地運行,直到明確阻塞(使用taskSuspendtaskDelay),此時將執行另一個READY任務直到它被阻止,等等。這應該由信號量或互斥體(突變體?)控制

基於優先級的調度的主要問題是由這個確切的問題來說明的。我們如何確定讓這些任務運行多久?事實上,他們具有相同的優先事項使事情複雜化。另一個問題是具有高優先級(較低數字意味着較高優先級)的VxWorks任務可以搶佔您的代碼中必須準備好的應用程序。這些問題可以通過使用循環調度來解決。由循環調度和解決方案帶來的其他問題全部被描述爲here

2

VxWorks有256個優先級(0最高,255最低)。在任何時候,最高優先級的任務都在CPU上運行。每個優先級概念上都有一個隊列,其中有多個任務排隊等待執行。

我們有3個任務在相同的優先級A,B,C。假設A正在執行。
當A塊(taskDelay,SemTake,msgQReceive),B將開始執行。
當A解鎖時,它放在隊列的末尾。我們現在有B,C,A。
當B塊,C接管等...

如果啓用了輪循調度(時間分片),同樣的概念適用,但任務被放到時間片結束時隊列結束。

請注意,被較高優先級任務預佔的任務不會影響隊列的順序。如果A正在運行並被搶佔,那麼當更高優先級的任務完成時,它將繼續執行。它不會放在隊列的末尾。

1

默認情況下,首先產生的那個將被執行,除非它放棄了CPU,另一個將永遠不會運行。

你可以明確地啓用循環,比他們將timeslice。