UC OS II任務管理(1)之任務控制塊

2021-07-05 02:15:34 字數 1637 閱讀 9028

任務狀態

ucosii任務狀態一共有睡眠、就緒、阻塞、執行、以及中斷掛起五種狀態。

睡眠態(dormant):任務已經在記憶體中裝入,但是還沒有進行任務執行的所需要的條件。

就緒態(ready):是任務已經做好執行的一切準備了,就只差排程程式排程,將cpu讓給執行。

阻塞態(waiting):當任務因為需要某些資源或條件,得不到滿足的時候,或者是任務需要等待一定的時間的時候,任務設定為阻塞態。知道條件滿足,或者等待時間耗盡,任務再轉換成就緒態。

執行態(runing): 任務正在cpu上執行

中斷掛起狀態(isr):當有中斷發生的時候,cpu就會轉去執行中斷程式。這個時候任務被剝奪cpu的使用權,處於掛起狀態。中斷返回之後,如果任務還是最高優先順序,就繼續執行。

任務轉換狀態執行如下:

任務控制塊

任務控制塊os_tcb記錄了相應的任務的狀態以及資訊。相當於linux系統的pcb程序控制塊。伴隨著任務的產生而產生,一點隨著任務的撤銷而撤銷。

下面解讀注釋一下任務os_tcb結構體,該資料結構定義在ucos_ii.h

typedef struct os_tcb os_tcb;

任務控制塊實體

任務控制塊的數目的生成在ucosii.h中,為乙個全域性變數陣列os_tcb     ostcbtbl[os_max_tasks + os_n_sys_tasks](ucos_ii.h);

os_max_tasks 巨集為使用者任務數目,在ucosii.h當中定義,可以根據自己系統執行的任務數目來配置,最大為62(有多少任務,配置多少,否則會造成記憶體資源的浪費)。

os_n_sys_tasks巨集為系統任務,一般為2,乙個為空閒任務,乙個為統計任務 。若是不需要統計任務,os_task_stat_en巨集配置為1,。則系統只有乙個乙個系統任務,該巨集在os_cfg中定義。

前面的的生成的任務控制塊,分別會掛在空閒鍊錶就緒鍊錶兩個鍊錶上。在系統初始化的時候(osinit),所有的任務控制塊都是在空閒鍊錶中。空閒鍊錶是單鏈表,而就緒鍊錶都是雙向鍊錶。指向兩個鍊錶的全域性指標變數都在ucosii.h中定義。

任務優先順序指標陣列

任務優先順序指標陣列os_tcb    *ostcbpriotbl[os_lowest_prio + 1u](ucos_ii.h),該全域性變數os_tcb指標陣列都指向下標相對應的優先順序的控制塊。根據優先順序查詢相對應的任務控制塊的時候,就根據這個陣列指標的下標來得到。

uC OSii之任務劃分

滿足以下幾個指標將會使軟體設計比較簡潔高效。裝置依賴性劃分 主要是對於一些輸入輸出裝置進行劃分,輸入輸出裝置分為主動型和被動性。主動型有乙個盡可能短的中斷服務程式和乙個與之關聯的任務組成 被動性任務由於不能主動觸發,必須有其他任務通過通訊機制向該裝置發出請求,啟用該裝置的相關任務。此類任務有鍵盤任務...

uC OS II就緒任務的管理

uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...

uC OS II就緒任務的管理

uc os ii就緒任務的管理 uc os ii總是在已就緒的任務中選擇乙個任務來執行。為了了解系統中的任務哪些是就緒任務,uc os ii在系統初始化時間裡了乙個供就緒任務登記的表,整個表就叫做就緒任務表。uc os ii的就緒任務表實質上是乙個型別為int8u的陣列osrdytbl 其中的每一位...