http://blog.chinaunix.net/uid-23741326-id-84935.html
VxWorks的任務有優先級的概念,其任務調度也是基於優先級考慮的,是搶占式的,VxWorks的任務有256個等級,0—255,數目越小表示優先級越高。高優先級的任務可以打斷低優先級的任務而搶先執行,只有在高優先級的任務執行完后,低優先級的任務才可以執行。其調度算法有兩種:完全搶占式的和循環分配式的。完全搶占式的是除了高優先級任務可以打斷低優先級任務外,在相同優先級的任務之間,不可以相互打斷,並且同優先級任務不是同時執行的,只有等該任務執行完后,與其相同優先級的任務才可以執行;循環分配式除了具有搶占功能之外,相同優先級的任務是可以同時執行的,即系統時間片是在它們之間平均分配的,這樣,相同優先級的任務可以同時執行。可以調用kernelTimeSlice()函數來設定該調度方式,並且參數是相同優先級任務執行的時間片。
VxWorks中任務具有很多種狀態,如下表所示:
狀態 |
描述 |
READY |
此任務狀態在等待執行 |
PEND |
此任務狀態是由於一些資源不可用而被阻塞 |
DELAY |
此任務狀態是休眠一段時間 |
SUSPEND |
此任務狀態是掛起 |
BREAK |
此任務狀態是停止(暫停),通常是在任務中設置了斷點。 |
各種狀態的組合 |
詳細請見原文檔 |
為了防止任務被誤刪除,VxWorks還提供了taskSafe()函數和taskUnsafe()函數,調用taskSafe()的任務不能被刪除,應用在其它地方調用taskDelete()函數時會出錯。只有該任務在調用了taskUnsafe()后,任務才能被刪除。另外,VxWorks還可以對任務的優先級動態的修改,即可以在執行過程中,調用taskPrioritySet()函數對任務的優先級進行修改。對於任務的創建,VxWorks還提供了不同的方法,用戶可以調用taskSpawn()函數在創建完任務后立即執行它,或者調用taskCreate()和taskActivate()函數把創建任務和執行任務分成兩步來實行,即在調用taskCreate()后,任務只是被創建而沒有執行,所以用戶可以在需要的時候調用taskActivate()來恢復任務的執行。下面是VxWorks任務相關函數一覽表:
函數名 |
功能 |
kernelTimeSlice( ) |
控制輪詢式調度程序 |
taskLock( ) |
取消任務的再調度 |
taskUnlock( ) |
允許任務的再調度 |
taskSpawn( ) |
生成(創建和激活)一個新任務 |
taskCreate( ) |
創建一個新任務,但不激活它。 |
taskActivate( ) |
激活一個已經創建的任務 |
taskSuspend( ) |
掛起一個任務 |
taskResume( ) |
恢復掛起任務的執行 |
taskRestart( ) |
重新開始一個任務的執行(即從頭執行) |
taskDelay( ) |
延時任務,延時單位是時間片 |
taskIdSelf( ) |
得到調用任務的id(正在運行的) |
taskIdVerify( ) |
驗證一個指定任務是否存在 |
taskOptionsGet( ) |
獲得用戶自定義任務參數 |
taskOptionsSet( ) |
設置用戶自定義任務參數 |
taskIdListGet( ) |
將所有活動狀態的任務id填寫到個數組中 |
taskInfoGet( ) |
得到一個任務的信息 |
taskPriorityGet( ) |
獲得任務的優先級 |
taskPrioritySet( ) |
改變任務優先級 |
taskRegsSet( ) |
設置一個任務的寄存器(但是不能被當前任務使用) |
taskIsSuspended( ) |
檢查一個任務是否在懸掛狀態(suspended.) |
taskIsReady( ) |
檢查一個任務是否准備運行就緒 |
exit( ) |
結束正在運行任務,釋放內存* |
taskDelete( ) |
結束制定的任務,釋放內存* |
taskSafe() |
保護當前任務,防止被刪除 |
taskUnsafe( ) |
取消taskSafe( )操作,即能夠刪除當前任務 |
nanosleep( ) |
延時任務,延時單位是時間片 |
時間片
對於任務來講,只有相同優先級任務下的循環分配式才存在時間片的概念:時間片就是系統分配給各任務的時間,如果該時間內某任務未完成,CPU將被剝奪並分配給另外一個任務。