1. 程式人生 > >OSTaskCreate()函數(UCOSII與UCOSIII的對比)

OSTaskCreate()函數(UCOSII與UCOSIII的對比)

pan 傳遞參數 初始 產生 more \n 計算 技術 是否

UCOSII的用法

OSTaskCreate()
函數原型:INT8U OSTaskCreate(void(*task)(void *pd),void *pdata,OS_STK *ptos,INT8U prio)
調用者:任務或者是初始化代碼。
作用:建立一個新任務,任務的建立可以在多個任務環境啟動之前,也可以在正在運行的任務中建立,中斷處理程序中不能建立任務,一個任務必須為無限循環結構,且不能有返回點。無論用戶程序中是否產生中斷,在初始化任務堆棧時,堆棧的結構必須與處理器中斷後寄存器入棧的順序結構相同。

該函數返回一個8位的整形數,調用該函數需要四個參數:
a 第一個參數:task是一個指向任務代碼的指針,也就是用戶代碼的首地址,平常使用中我們把自己創建的任務的名字作為這個參數即可。

b 第二個參數:pdata指向一個數據結構,該結構用來在建立任務時向任務傳遞參數。
c 第三個參數:ptos是指向任務堆棧棧頂的指針,一般把創建的任務的堆棧數組首地址賦給它。
任務堆棧用來保存局部變量,函數參數,返回地址以及任務被中斷時處理器寄存器的內容,任務堆棧的大小決定於任務的需要以及預計的中斷嵌套層數。計算堆棧的大小需要知道任務的局部變量所占的空間,可能產生嵌套調用的函數,及中斷嵌套所需的空間,如果初始化常量OS_STK_GROWTH設為1,堆棧被設為從內存高地址向低地址增長,此時ptos應該指向任務堆棧空間的最高地址,反之,如果OS_STK_GROWTH設為0,堆棧將從內存的低地址向高地址增長。
d 第四個參數:prio是任務的優先級。每個任務必須有一個唯一的優先級作為標識,數字越小,優先級越高。

返回值:
OSTaskCreate()的返回值為下述之一:
# OS_NO_ERR: 函數調用成功。
# OS_PRIO_EXIST:具有該優先級的任務已經存在。
# OS_PRIO_INVALID: 參數指定的優先級大於OS_LOWEST_PRIO
# OS_NO_MORE_TCB: 系統中沒有OS_TCB可以分配給任務了。

註意:
1 任何堆棧必須聲明為OS_STK類型。
2 在任務中必須調用uCOS提供的下述過程之一:延時等待,任務掛起,等待事件發生(等待信號量,消息郵箱,消息隊列),以便其他任務能得到cpu。

3 程序中不能使用優先級0,1,2,3,以及OS_LOWEST_PRIO-3,OS_LOWEST_PRIO-2,OS_LOWEST_PRIO-1,

OS_LOWEST_PRIO,這些優先級系統保留,其余的56個優先級提供給應用程序。

範例:
本例中,傳遞給任務Task1()的參數pdata不使用,所以指針pdata被設為NULLL,註意到程序中設定堆棧向低地址增長,傳遞的棧頂指針為高地址&Task1[1023],如果在你的程序中設定堆棧向高地址增長,則傳遞的棧頂指針應該為&Task1Stk[0]。
OS_STK Task1Stk[1024];
void main(void)
{
NT8U err;
...
OSInit();//初始化uCOS-II
....
OSTaskCreate(Task1,(void *)0,&Task1Stk[1023],25);
...
OSStart();//啟動多任務環境
}

void Task1(void *pdata)
{
pdata=pdata;
for(;;)
{
...... //任務代碼
}

}

實例:

OSTaskCreate((void*)Rs485_Task,(void *)0,(void *)&TaskStk[RS485_Prio][TASK_STK_SIZE-1], RS485_Prio);

其中TASK_STK_SIZE=2048

void Rs485_Task()
{

do
{

printd("Task 485.\r\n");

RS485_PreProcess();

OSTimeDly(100);
} while(1);

}

UCOSIII的用法

技術分享圖片

OSTaskCreate()函數(UCOSII與UCOSIII的對比)