任務的創建
1.創建任務函數
任務的創建實質上是創建一個任務控制塊,並通過任務控制塊把任務代碼和任務堆棧關聯起來形成一個完整的任務。UC/OS提供兩個函數創建任務OSTaskCreate()和OSTaskCreateExt()。一般前者用的多,OSTaskCreate()如下所示:
INT8U OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
{
OS_STK *psp;
INT8U err;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { //檢測任務的優先級是否合法
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting > 0) { /* Make sure we don't create the task from within an ISR */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_CREATE_ISR);
}
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {//確認優先級未被使用
OSTCBPrioTbl[prio] = (OS_TCB *)1; //保留優先級
OS_EXIT_CRITICAL();
psp = OSTaskStkInit(task, p_arg, ptos, 0);//初始化堆棧
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);//初始化任務控制塊
if (err == OS_NO_ERR) {
if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */
OS_Sched();//任務調度
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;//放棄任務
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
#endif
2.創建任務的一般方法
一般說來,任務可在OSStart()啓動任務調度之前來創建,也可在任務中創建,但是UC/OS有個規定:在調用OSStart()啓動任務調度之前,必須創建了至少一個任務。因此一般習慣上,在OSStart()啓動任務調度之前先創建一個任務,並賦予它最高的優先級,從而使它成爲起始任務,然後在這個起始任務中再創建其他任務。如果要使用統計任務,則統計任務的初始化函數也必須在這個起始任務中來調用。
注意:
UC/OS不允許在中斷服務程序中創建任務。