上面講解了空閒任務的創建過程,空閒任務是系統自動創建的,不管你是否須要它都必然會被創建。html
其實用戶任務的創建過程和空閒任務徹底同樣,一樣也是棧空間初始化,變量初始化,把任務信息與那幾個鏈表關聯起來。數組
如今舉一個例子,我要新建一個優先級爲10的啓動任務。函數
1 int main(void) 2 { 5 OSInit(); 6 OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],10); 7 OSStart(); 8 }
但咱們須要創建用戶任務的時候,調用的也是OSTaskCreate函數,這樣又回到了空閒任務的那個過程。spa
過程暫且不表,咱們直接看結果。操作系統
啓動任務創建以前,那幾個數組和鏈表的狀態以下:3d
數組OSTCBTbl的第0個位置和第1個位置都有任務(棧空間指向不爲空),第2個位置就沒有任務了(棧空間指向爲空),這個狀態代表如今咱們有兩個任務(空閒任務&統計任務)。指針
一樣在優先級數組:OSTCBPrioTbl中咱們也能夠看到這個狀況,這個數組是按照任務的優先級排序的,如今只有最後兩個位置非空,也就是說只有這兩個任務存在(仔細看數據的內容,能夠看到是和上面的任務數組徹底同樣的)調試
當咱們新建了那個優先級爲10的任務之後,這兩個數組的狀態變化以下:code
任務數組的第2個位置剛纔仍是空的,如今已經有數據了(這個數組裏面的的任務信息是按照創建順序來排序的)。htm
優先級數組的第10個位置剛纔仍是空的,如今也有數據了(這個數組裏面的的任務信息是按照優先級來排序的)。
這就說明,優先級爲10的任務已經被創建。
※題外話:你們有沒有以爲這個任務優先級管理數組長得有點像哈希表的鏈路法?只不過人家是橫着哈,這個表是豎着哈!哈哈哈!
任務創建之後,系統就要啓動,這是調用函數:
1 void OSStart (void) 2 { 3 if (OSRunning == OS_FALSE) { 4 OS_SchedNew(); /* Find highest priority's task priority number */ 5 OSPrioCur = OSPrioHighRdy; 6 OSTCBHighRdy = OSTCBPrioTbl[OSPrioHighRdy]; /* Point to highest priority task ready to run */ 7 OSTCBCur = OSTCBHighRdy; 8 OSStartHighRdy(); /* Execute target specific code to start task */ 9 } 10 }
其中OS_SchedNew的做用請參考(http://www.cnblogs.com/han-bing/p/8882375.html),它的做用就是找到當前系統中優先級最高的那個任務,除了優先級爲10的任務以外,當前咱們只創建了空閒任務和統計任務,這兩個任務的優先級是最低的,所以通過了這個函數的處理後,系統找出來的確定是優先級爲10的任務。
而後把這個任務的信息,裝載到相應的鏈表和變量中,最後調用OSStartHighRdy函數使PC指針跳進任務10中去執行。
這樣,UCOSII操做系統就開始啓動,接下來即是任務調度。
至於任務的刪除,掛起,變動優先級等等處理,各位能夠自行調試,原理都同樣,對任務數組和任務狀態的操做罷了!