UCOSII學習 二 任務管理

2021-08-24 17:50:38 字數 2408 閱讀 1034

uc/os-ii 中最多可以支援64 個任務,分別對應優先順序0~63,其中0 為最高優先順序。63為最低階,系統保留了4個最高優先順序的任務和4個最低優先順序的任務,所有使用者可以使用的任務數有56個。

uc/os-ii提供了任務管理的各種函式呼叫,包括建立任務,刪除任務,改變任務的優先順序,任務掛起和恢復等。

系統初始化時會自動產生兩個任務:乙個是空閒任務,它的優先順序最低,該任務僅給乙個整形變數做累加運算;另乙個是系統任務,它的優先順序為次低,該任務負責統計當前cpu的利用率。

在系統初始化完畢後啟動任務時必須建立乙份使用者任務。

1、建立任務ostaskcreat()/ostaskcreatext()

如果想讓ucos管理使用者的任務,必須先建立任務。可以通過將任務的位址和其他引數傳遞到以下兩個函式之一來建立任務。當呼叫ostaskcreat()時(ucos老版本使用),需要四個引數:
ostaskcreate(void( *task)(void *pd),  

void *pdata,

os_stk *ptos,

intu prio)

task:是指向任務**的指標;pdata:是任務開始執行時傳遞給任務的引數的指標,為(void*0時,表示傳遞乙個空指標給函式;ptos:是分配給任務的堆疊的棧頂指標,prio是分配給任務的優先順序。

也可以用ostaskcreatext(),不過該函式需要9個引數,前四個引數與ostaskcreat()一樣,例如:

int8u ostaskcreateext(void( *task)(void *pd),

void *pdata,

os_stk *ptos,

int16u id,

os_stk *pbos,

os_stk *pbos,

int16u opt)

id引數為要建立的任務建立乙個特殊的識別符號。pbos是指向任務的堆疊棧底的指標,用於堆疊的檢驗。stk_size用於指定堆疊成員數目的容量。pext是指向使用者附加的資料域的指標,用來擴充套件任務的os_tcb。opt用於設定ostaskcreateext()的選項,指定是否允許堆疊檢驗,是否將堆疊清零,任務是否要進行浮點操作等等。

2、任務堆疊os_stk()

每個任務都有自己的堆疊,堆疊必須申明為 os_stk型別,並且由連續的記憶體空間組成。可以靜態分配堆疊空間,也可以動態分配堆疊空間。

3、堆疊檢驗ostaskstkchk()

有時確定任務實際需要的堆疊空間的大小是很有必要的,因為這樣就可以避免為任務分配過多的堆疊空間,從而減少應用程式**所需的ram空間。

4、刪除任務ostaskdel()

有時需要刪除任務,刪除任務,是說任務返回並處於休眠態,並不是說任務的**被刪除了,只是任務的**不再被ucos呼叫。刪除任務前應保證所刪任務並非空閒任務。例如:ostaskdel(int8u prio),prio為任務優先順序。

5、請求刪除任務ostaskdelreq()

有時,任務會占用一些記憶體緩衝或訊號量一類的資源。這時,假如另乙個任務試圖刪除該任務,這些被占用的資源就會因為沒有被釋放而丟失。在這種情況下,需想辦法擁有這些資源的任務在使用完資源後先釋放資源,再刪除自己。

if(ostaskdelreq(int8u prio)==os_task_del_req)

ostaskdel(int8u prio);

ostaskdelreq()具體執行解釋執行如下:

//假設兩個任務task1和task2,task1優先順序高於task2,task1刪除task2

if() //task1**

}//被刪的任務task2是這樣寫的

if(ostaskdelreq(os_prio_self)==os_task_del_req)

else

6、改變任務的優先順序ostaskchangeprio()

在建立任務時,會分配給任務乙個優先順序。在程式執行期間,可以通過呼叫該函式改變任務的優先順序。也就是說,ucos允許動態的改變任務的優先順序。

int8u ostaskchangeprio (int8u oldprio, int8u newprio)。

7、掛起任務ostasksuspend()

任務掛起是乙個附加功能,也就是說,如果任務在被掛起的同時也在等待延遲時間到,那麼,需要對任務做取消掛起的操作,並且等待延遲時間到,任務才能轉讓就緒狀態。任務可以掛起自己或者其他任務。例子ostasksuspend(int8u prio)。

8、恢復任務ostaskresume()

掛起的任務只有通過該函式才能被恢復。例子ostaskresume(int8u prio),prio為優先順序。

9、獲得任務的資訊ostaskquery()

通過呼叫該函式,來獲得自身或其他應用任務的資訊。

(二)任務堆疊

任務堆疊的建立 1 為了方便定義任務堆疊,在檔案os cpu.h中定義了乙個資料型別os stk typedef unsigned int os stk 該型別長度為16位 2 在定義任務堆疊的棧區時,只要定義乙個os stk型別的陣列即可。例如 define task stk size 512 定...

FreeRTOS學習(二)任務基礎

2.任務基礎知識 在嵌入式開發中,有兩種常見的開發方式 前後臺系統和嵌入式作業系統。1.1 前後臺系統 前台 就是中斷,可以多級巢狀,處於處理一些實時性要求比較高的事件,比如按鍵的狀態獲取。後台 乙個無限迴圈,在迴圈中呼叫相關函式完成相應操作。這種程式設計方式的主要缺陷在於兩方面 1 複雜度方面 無...

實驗二任務一

1.掌握如何建立乙個activity 2.掌握如何在activity中新增控制項並進行事件處理 3.掌握如何通過intent啟動另外乙個 activity 4.掌握如何通過intent在多個 activity 之間傳遞資料 5.掌握activity的生命週期 裝有android開發環境的計算機 1....