uC/OS II 函式說明 之–OSTaskCreate()與OSTaskCreateExt()
阿新 • • 發佈:2019-02-02
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { /* 引數檢查,優先順序是否處於允許優先順序之內 */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL(); /* 關中斷 */
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 判斷任務的優先順序是否存在,如不存在,設定任 */
OSTCBPrioTbl[prio] = (OS_TCB *)1; /* 務優先順序為1設定優先順序後,就可以開中斷了, */
/* 不用擔心衝突,因為該優先順序已經被佔了 */
OS_EXIT_CRITICAL();
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);
/* 初始化堆疊,此函式與具體的硬體有關,OS_CPU_C.C */
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 詳見此函式的說明 */
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* 任務計數器加1,統計執行的任務數 */
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) { /* 如果是在任務執行過程中新建任務,需要進行 */
OS_Sched(); /* 任務排程,保證 優先順序最高的任務處於執行態 */
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 如果任務建立失敗,優先順序設定為0,放棄該 */
/* 任務的優先順序保證別的任務建立時可以使用 */
/* 此優先順序 */
OS_EXIT_CRITICAL();
}
return (err); /* 建立任務失敗,返回錯誤程式碼 */
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST); /* 返回OS_PRIO_EXIST,告知任務優先順序已經存在 */
}
#endif
if (prio > OS_LOWEST_PRIO) { /* 引數檢查,優先順序是否處於允許優先順序之內 */
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL(); /* 關中斷 */
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { /* 判斷任務的優先順序是否存在,如不存在,設定任 */
OSTCBPrioTbl[prio] = (OS_TCB *)1; /* 務優先順序為1設定優先順序後,就可以開中斷了, */
/* 不用擔心衝突,因為該優先順序已經被佔了 */
OS_EXIT_CRITICAL();
psp = (OS_STK *)OSTaskStkInit(task, pdata, ptos, 0);
/* 初始化堆疊,此函式與具體的硬體有關,OS_CPU_C.C */
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 詳見此函式的說明 */
if (err == OS_NO_ERR) {
OS_ENTER_CRITICAL();
OSTaskCtr++; /* 任務計數器加1,統計執行的任務數 */
OS_EXIT_CRITICAL();
if (OSRunning == TRUE) { /* 如果是在任務執行過程中新建任務,需要進行 */
OS_Sched(); /* 任務排程,保證 優先順序最高的任務處於執行態 */
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* 如果任務建立失敗,優先順序設定為0,放棄該 */
/* 任務的優先順序保證別的任務建立時可以使用 */
/* 此優先順序 */
OS_EXIT_CRITICAL();
}
return (err); /* 建立任務失敗,返回錯誤程式碼 */
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST); /* 返回OS_PRIO_EXIST,告知任務優先順序已經存在 */
}
#endif