本文大部分內容摘自任哲——《嵌入式實時操作系統uC/OS-II原理及應用》一書。
1、UC/COS程序的開發,主要是任務的程序的編寫,其中任務從存儲結構上來看,主要由三個部分組成,即任務程序代碼、任務堆棧和任務控制塊,其中任務堆棧用來保存任務的相關環境,任務程序代碼是任務的執行部分,而任務控制塊保存相關任務的屬性,如狀態、優先級和指向堆棧和任務的指針等。通過任務控制塊構成一個雙向的指針。
2、任務的狀態:
睡眠(還沒有分配到控制塊,也就是說其只以代碼形式放在程序空間裏,還沒有交給操作系統);
就緒(已經交給了操作系統,分配了控制塊,但沒有得到CPU的使用權);
運行(正在運行的任務,佔用CPU)
等待(在運行中的任務,如果要等待一段時間或者某一個事件的發生,就會進入到等待狀態),從等待狀態不能直接進入到運行,如果時間到
或者說事件到了,就轉到就緒狀態;
中斷服務狀態(就是在運行的任務一旦響應中斷申請就會中止運行而去執行中斷服務程序)
3、OS-II中可以定義64個任務,其中包括二個系統任務(空閒任務和統計任務),每個任務都有一個唯一的優先級,用數字表示,數字越小的優先級越高,如0的優先級別最高。
4、
typedef unsigned int OS_STK; /* Each stack entry is 16-bit wide */
typedef unsigned int OS_CPU_SR; /* The CPU Status Word is 16-bit wide */
對於現在的PC機與系統而言,大部分爲32位了。
5、注意堆棧的增長方向,實際寫程序時,應該把二種方式的代碼均寫出,便如移植。由於各處理器的寄存器及對堆棧的操作方式不盡相同,因此對於OSTaskStkInit()這個堆棧初始化函數需要用戶在用UC/OS時重新編寫,該函數在創建任務函數OSTaskCreate()調用。
6、UC/OS-II管理多個任務,其把系統所有的任務的控制塊鏈接爲兩條鏈表,並通過兩條鏈表管理各任務控制塊,進而再通過任務控制塊來對任務進行相關的操作;一條是空任務鏈表,另一條爲任務塊鏈表。空任務鏈表再調用OSInit()函數時建立,其先在RAM中建立一個OS_TCB的數組OSTCBTbl[],這樣每個數組元素就是一個任務控制塊。而任務塊鏈表是在調用系統函數OSTaskCreate()或OSTaskCreateExt()時,系統就會將空任務控制塊鏈表頭指針OSTCBFreeList指向的任務控制塊分配給該任務。
爲了加快對任務控制塊的訪問速度,除了任務控制塊鏈表被創建爲雙向鏈表之外,還有一個數據類型爲OS_TCB*數組OSTCBPrioTbl[],其專門用來以任務優先級別爲順序在各個數組元素裏存放指向各個控制塊的指針;同時還有一個專門存放正在運行的任務的任務控制塊指針OS_TCB * OSTCBCur;
OSTaskDel()刪除一個任務,實質上是把該任務的任務從任務控制塊鏈表中刪掉,並把它歸還給空任務控制塊鏈表。