ucos ii的任務控制塊

2021-06-13 06:04:12 字數 2588 閱讀 9012

在作業系統初始化函式osinit執行之後,使用者可以呼叫ostaskcreate或者ostaskcreateext函式來建立使用者任務,因為這兩個函式是核心用來建立任務的,不允許使用者進行修改,因此被稱為系統服務。使用者任務的程式是以函式的形式遊使用者編寫,稱為使用者函式,和作業系統提供的服務劃分了界限,很明顯,必須將使用者函式的位址傳遞給建立任務的系統服務。在使用者任務中,同樣可以呼叫ostaskcreate或者ostaskcreateext函式來建立其他的任務,也可以呼叫ostaskdel來刪除其他任務或呼叫請求刪除任務的函式提交刪除任務的請求,還可以呼叫ostasksuspend來暫時取消任務或者其他任務的執行。

因為ucos-ii採用的是搶占式多任務排程演算法,因此任務的優先順序是至關重要的,是任務唯一的標誌,因此各個任務的優先順序必須不同。任務的優先順序和任務的其他資訊,如任務的堆疊位址、任務的狀態、任務的等待時間指標、任務的延時時間等資訊都儲存在乙個名為任務控制塊的資料結構中,不掌握任務控制塊(tcb)就無法研究和掌握任務管理。

除了任務控制塊外,ucos-ii中還設計了就緒組和就緒表來標誌就緒的任務。就緒的任務可能不止乙個,但有乙個上限----不能超過63個!。任務排程程式(時鐘中斷服務子程式)每隔一段時間會執行一次,具體的時間取決使用者對時鐘中斷的設定。如果設定為20ms,則每隔20ms就要進行一次任務排程。這就要從就緒組和就緒表中超找到優先順序最高的就緒任務了。因為是實時性很高的作業系統,不允許查詢最高優先順序的任務的時間太長,不能因為任務多了查詢起來就慢,任務少了查詢起來就快。實際上ucos-ii的任務排程的時間在乙個指定的嵌入式環境中是確定的。為了達到這一點,我們設計了巧妙的資料結構和演算法來實現這一過程。

為了根據優先順序這一任務的唯一標識來找到任務的各種屬性,從而執行不同的處理,設計了任務優先順序指標表ostcbpriotbl來快速找到任務的控制塊。為了迅速的得到當前任務的控制塊,有定義了任務快指標ostcbcur來指示當前的任務。

任務管理的資料結構包括了任務控制塊、任務空閒鍊錶和任務就緒鍊錶、任務優先順序指標表、任務堆疊等,是ucos核心的核心內容之一,離開這些資料結構,核心什麼功能也完成不了。

1任務控制塊的定義

任務控制塊是任務管理的核心資料結構,作業系統在啟動的時候,首先在記憶體中建立一定數量的任務控制塊。任務控制塊的數量等於作業系統能同時管理的最多的任務數。

ucos-ii將任務控制塊劃分為兩個鍊錶:就緒鍊錶和空閒鍊錶。建立乙個任務,就是從空閒鍊錶中取出乙個空閒的任務控制塊,將任務的各種屬性新增到控制塊中,並將該任務控制塊移到就緒表中,更改就緒表和據需組,任務就從睡眠態轉換到就緒態,當沒有更高優先順序的任務在執行時,任務就可以得到執行。相反,要結束乙個任務的執行,就要將該任務的任務控制塊從就緒鍊錶移到空閒鍊錶,然後修改就緒組和就緒表,取消任務的就緒標誌,任務就從就緒態轉換到其他態,而只有再回到就緒態才有可能得到執行。

在給出就緒鍊錶和空閒鍊錶之前,首先需要掌握任務控制塊的基本結構,該結構體在ucos_ii.h檔案中。

如下**給出了任務控制塊結構體的定義:

typedef struct os_tcb os_tcb;

對程式中的任務控制塊的說明如下:

(1)*ostcbstkptr是指向os_stk型別的指標,os_stk在os_cpu.h檔案中定義

typedef unsigned int os_stk;

因此,os_stk就是無符號整數,os_stk 是任務堆疊的每個資料項的型別,對於不同的硬體系統是不同的,在做移植的時候就需要進行修改。os_cpu.h定義了和cpu相關的資料結構和全域性變數

任務堆疊的操作是最底層的,要用組合語言來寫,因此該指標在整個結構體的第一句開始定義,那麼在定義結構體的實體後,控制塊的0位址就儲存了任務堆疊的棧頂位址,方便了組合語言的操作。換句話說,ostcbstkptr是指向任務堆疊棧頂的指標,每個任務都有自己的任務堆疊,任務堆疊是進行任務切換的關鍵資料結構,任務執行的cpu環境,包括任務的**的位址都儲存在了任務堆疊中。

(2)任務狀態ostcbstat。任務狀態的取值範圍和對應的巨集如下表所示,當任務的狀態取值為os_stat_rdy,即0x00時,處於就緒態,可以被排程執行。

巨集                      取值               含義

os_stat_rdy                 0x00               任務未等待事件且任務未掛起

os_stat_sem                 0x01               任務等待訊號量

os_stat_mbox                0x02               任務等待訊息郵箱

os_stat_q                   0x04               任務等待訊息佇列

os_stat_suspend             0x08               任務掛起

os_stat_mutex               0x10               任務等待互斥訊號量

os_stat_falg                0x20               任務等待事件標誌

(3)任務優先順序ostcbprio。每個任務都有唯一的優先順序,因此在ucos-ii以優先順序作為事件的標誌,作為任務管理的主鍵,任務的優先順序可以是0~63,但是優先順序62和63被統計任務和空閒任務占用,使用者可用的優先順序可以使0~61,數字越低,優先順序越高。

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

任務狀態 ucosii任務狀態一共有睡眠 就緒 阻塞 執行 以及中斷掛起五種狀態。睡眠態 dormant 任務已經在記憶體中裝入,但是還沒有進行任務執行的所需要的條件。就緒態 ready 是任務已經做好執行的一切準備了,就只差排程程式排程,將cpu讓給執行。阻塞態 waiting 當任務因為需要某些...

uC OS II時間控制塊1

任務或中斷服務程式可以通過事件控制塊 ecb 向另外的任務發訊號,這裡的訊號被看成是事件。1 中斷服務程式不能等待事件控制塊給它傳送訊號 2 處於等待狀態狀態的任務可以設定等待超時 3 多個任務同時等待一事件的發生,當事件發生時,只有優先順序最高的任務得到該事件並進入就緒狀態 ucosii通過uco...

uCOS II 之事件控制塊學習

1940 一.事件控制塊ecb資料結構 typedef struct os event 二 關鍵演算法 1 將乙個任務插入到等待事件的任務列表中 當呼叫函式os eventtaskwait 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表中。pevent oseven...