轉載地址:http://blog.csdn.net/blueoceanindream/article/details/7573818
1.任務隊列
vxworks維護4個隊列:
tick隊列
ready隊列
active隊列
pend隊列
一,tick隊列
當執行taskDelay時,任務會被延長一段時間執行,此時,任務就會被加入到tick隊列中,任務處於Delay狀態,無權競爭CPU;
二,ready隊列
有資格競爭CPU的隊列,按照任務的優先級進行排隊,隊列頭部是優先級最高的任務;
三,active隊列
所有任務無論狀態如何都會在這個隊列中,這個隊列維護着系統當前所有的任務;
四,pend隊列
當多個任務競爭一個資源時,如果資源不可得,任務就會被設置爲pend狀態,進入pend隊列中;
函數taskSpawn創建任務,新建任務會放到active隊列,此時還不能競爭CPU,taskSpawn最後一步就是把任務放到ready隊列中,就可以競爭CPU了。
2.任務優先級
Vxworks共有256個優先級(0~255),0表示優先級最高,255表示優先級最低。taskSpawn創建任務時指定任務優先級,taskPrioritySet可以再創建完成後修改任務優先級。
Vxworks對於應用層任務,推薦使用100~250之間的優先級;驅動層任務,推薦使用51~99之間的任務。
內核網絡任務“tNetTask”的任務爲50,要是有優先級低於這個,網絡收發包就可能受影響。
3.任務上下文
任務的數據結構包含以下內容:
1)CPU的所有寄存器值,還有任務內存映射空間、任務名稱、任務優先級、任務入口函數、信號量、隊列;
2)存放任務運行時的棧。棧的大小是由創建任務時確定的,此後不允許改變任務棧的大小,如果此任務有許多遞歸調用,就要申請大的棧空間,防止棧的溢出;
3)各種定時信息。系統時鐘是系統的脈搏,與高優先級的中斷聯繫。每個Tick,OS都會響應一次中斷,這個中斷可以作爲操作系統調度的觸發點;
4)信號處理函數,ctrl+c中斷當前前臺任務。
5)其他輔助信息,統計數據等
4.常用任務調度函數
1)kernelTimeSlice(int ticks) --------------RR調度使能函數
2)STATUS taskLock(void)和STATUS taskUnlock(void)-------------關閉/開啓任務調度,並不禁止中斷,是一種互斥機制
3)taskSpawn創建了任務之後就進入運行狀態,taskCreate創建了任務,還要通過taskActivate來激活,才能加入到ready隊列中。
5.任務棧
Vxworks的任務棧本質上是內核數據結構的簡單保護機制,僅有一個全局變量kernelState來表示是否在內核態。
Vxworks下任務棧即被應用程序使用,也被內核函數使用。
任務棧大小在任務創建時已經確定,在使用時不能修改。這樣會引起資源浪費,Vxworks官方文檔建議通過試驗法,通過checkStack(taskname or id)來查看任務棧的使用情況。