OSTaskCreate()
函數(shù)原型:INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
調(diào)用者:任務(wù)或者是初始化代碼。
作用:建立一個新任務(wù),任務(wù)的建立可以在多個任務(wù)環(huán)境啟動之前,也可以在正在運(yùn)行的任務(wù)中建立,中斷處理程序中不能建立任務(wù),一個任務(wù)必須為無限循環(huán)結(jié)構(gòu),且不能有返回點(diǎn)。無論用戶程序中是否產(chǎn)生中斷,在初始化任務(wù)堆棧時,堆棧的結(jié)構(gòu)必須與處理器中斷后寄存器入棧的順序結(jié)構(gòu)相同。
該函數(shù)返回一個8位的整形數(shù),調(diào)用該函數(shù)需要四個參數(shù):
a 第一個參數(shù):task是一個指向任務(wù)代碼的指針,也就是用戶代碼的首地址,平常使用中我們把自己創(chuàng)建的任務(wù)的名字作為這個參數(shù)即可。
b 第二個參數(shù):pdata指向一個數(shù)據(jù)結(jié)構(gòu),該結(jié)構(gòu)用來在建立任務(wù)時向任務(wù)傳遞參數(shù)。
c 第三個參數(shù):ptos是指向任務(wù)堆棧棧頂?shù)闹羔?,一般把?chuàng)建的任務(wù)的堆棧數(shù)組首地址賦給它。
任務(wù)堆棧用來保存局部變量,函數(shù)參數(shù),返回地址以及任務(wù)被中斷時處理器寄存器的內(nèi)容,任務(wù)堆棧的大小決定于任務(wù)的需要以及預(yù)計的中斷嵌套層數(shù)。計算堆棧的大小需要知道任務(wù)的局部變量所占的空間,可能產(chǎn)生嵌套調(diào)用的函數(shù),及中斷嵌套所需的空間,如果初始化常量OS_STK_GROWTH設(shè)為1,堆棧被設(shè)為從內(nèi)存高地址向低地址增長,此時ptos應(yīng)該指向任務(wù)堆棧空間的最高地址,反之,如果OS_STK_GROWTH設(shè)為0,堆棧將從內(nèi)存的低地址向高地址增長。
d 第四個參數(shù):prio是任務(wù)的優(yōu)先級。每個任務(wù)必須有一個唯一的優(yōu)先級作為標(biāo)識,數(shù)字越小,優(yōu)先級越高。
返回值:
OSTaskCreate()的返回值為下述之一:
# OS_NO_ERR: 函數(shù)調(diào)用成功。
# OS_PRIO_EXIST:具有該優(yōu)先級的任務(wù)已經(jīng)存在。
# OS_PRIO_INVALID: 參數(shù)指定的優(yōu)先級大于OS_LOWEST_PRIO
# OS_NO_MORE_TCB: 系統(tǒng)中沒有OS_TCB可以分配給任務(wù)了。
注意:
1 任何堆棧必須聲明為OS_STK類型。
2 在任務(wù)中必須調(diào)用uCOS提供的下述過程之一:延時等待,任務(wù)掛起,等待事件發(fā)生(等待信號量,消息郵箱,消息隊列),以便其他任務(wù)能得到cpu。
3 程序中不能使用優(yōu)先級0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,
OS_LOWEST_PRIO,這些優(yōu)先級系統(tǒng)保留,其余的56個優(yōu)先級提供給應(yīng)用程序。
范例:
本例中,傳遞給任務(wù)Task1()的參數(shù)pdata不使用,所以指針pdata被設(shè)為NULLL,注意到程序中設(shè)定堆棧向低地址增長,傳遞的棧頂指針為高地址&Task1[1023],如果在你的程序中設(shè)定堆棧向高地址增長,則傳遞的棧頂指針應(yīng)該為&Task1Stk[0]。
OS_STK Task1Stk[1024];
void main(void)
{
NT8U err;
...
OSInit();//初始化uCOS-II
....
OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);
...
OSStart();//啟動多任務(wù)環(huán)境
}
void Task1(void *pdata)
{
pdata=pdata;
for(;;)
{
...... //任務(wù)代碼
}
}