任務的創建和刪除實驗
uCOSIII是多任務系統,那么肯定要創建任務,創建任務就是將任務控制塊、任務堆棧、任務代碼等聯系在一起,并且初始化任務控制塊的相應字段。在UCOSIII中我們通過函數OSTaskCreate ();來創建任務,OSTaskCreate();函數原型如下(在os_task.c中有定義)。電泳OSTaskCreate ();創建一個任務之后,剛創建的任務就會進入就緒狀態,注意!不能夠在中斷服務程序中調用OSTaskCreate ();函數創建任務。
void OSTaskCreate (OS_TCB *p_tcb,CPU_CHAR *p_name,OS_TASK_PTR p_task,
void *p_arg,OS_PRIO prio,CPU_STK *p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,
void *p_ext,OS_OPT opt,OS_ERR *p_err)
{CPU_STK_SIZE i;
#if OS_CFG_TASK_REG_TBL_SIZE > 0uOS_REG_ID reg_nbr;
#endif
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)OS_TLS_ID id;
#endifCPU_STK *p_sp;CPU_STK *p_stk_limit;CPU_SR_ALLOC();
#ifdef OS_SAFETY_CRITICALif (p_err == (OS_ERR *)
0) {OS_SAFETY_CRITICAL_EXCEPTION();
return;}
#endif#ifdef OS_SAFETY_CRITICAL_IEC61508if (OSSafetyCriticalStartFlag == DEF_TRUE) {*p_err = OS_ERR_ILLEGAL_CREATE_RUN_TIME;
return;}
#endif#if OS_CFG_CALLED_FROM_ISR_CHK_EN > 0uif (OSIntNestingCtr > (OS_NESTING_CTR)
0) { *p_err = OS_ERR_TASK_CREATE_ISR;
return;}
#endif#if OS_CFG_ARG_CHK_EN > 0u /* ---------------- VALIDATE ARGUMENTS ------------------ */if (p_tcb == (OS_TCB *)
0) { *p_err = OS_ERR_TCB_INVALID;
return;}
if (p_task == (OS_TASK_PTR)
0) { *p_err = OS_ERR_TASK_INVALID;
return;}
if (p_stk_base == (CPU_STK *)
0) { *p_err = OS_ERR_STK_INVALID;
return;}
if (stk_size < OSCfg_StkSizeMin) { *p_err = OS_ERR_STK_SIZE_INVALID;
return;}
if (stk_limit >= stk_size) { *p_err = OS_ERR_STK_LIMIT_INVALID;
return;}
if (prio >= OS_CFG_PRIO_MAX) { *p_err = OS_ERR_PRIO_INVALID;
return;}
#endif#if OS_CFG_ISR_POST_DEFERRED_EN > 0uif (prio == (OS_PRIO)
0) {
if (p_tcb != &OSIntQTaskTCB) {*p_err = OS_ERR_PRIO_INVALID;
return;}}
#endifif (prio == (OS_CFG_PRIO_MAX -
1u)) {
if (p_tcb != &OSIdleTaskTCB) {*p_err = OS_ERR_PRIO_INVALID;
return;}}OS_TaskInitTCB(p_tcb); *p_err = OS_ERR_NONE;
if ((opt & OS_OPT_TASK_STK_CHK) != (OS_OPT)
0) {
if ((opt & OS_OPT_TASK_STK_CLR) != (OS_OPT)
0) { p_sp = p_stk_base;
for (i =
0u; i < stk_size; i++) { *p_sp = (CPU_STK)
0; p_sp++;}}}
#if (CPU_CFG_STK_GROWTH == CPU_STK_GROWTH_HI_TO_LO)p_stk_limit = p_stk_base + stk_limit;
#elsep_stk_limit = p_stk_base + (stk_size -
1u) - stk_limit;
#endifp_sp = OSTaskStkInit(p_task,p_arg,p_stk_base,p_stk_limit,stk_size,opt);p_tcb->TaskEntryAddr = p_task; p_tcb->TaskEntryArg = p_arg; p_tcb->NamePtr = p_name; p_tcb->Prio = prio; p_tcb->StkPtr = p_sp; p_tcb->StkLimitPtr = p_stk_limit; p_tcb->TimeQuanta = time_quanta;
#if OS_CFG_SCHED_ROUND_ROBIN_EN > 0uif (time_quanta == (OS_TICK)
0) {p_tcb->TimeQuantaCtr = OSSchedRoundRobinDfltTimeQuanta;}
else {p_tcb->TimeQuantaCtr = time_quanta;}
#endifp_tcb->ExtPtr = p_ext; p_tcb->StkBasePtr = p_stk_base; p_tcb->StkSize = stk_size; p_tcb->Opt = opt;
#if OS_CFG_TASK_REG_TBL_SIZE > 0ufor (reg_nbr =
0u; reg_nbr < OS_CFG_TASK_REG_TBL_SIZE; reg_nbr++) {p_tcb->RegTbl[reg_nbr] = (OS_REG)
0;}
#endif#if OS_CFG_TASK_Q_EN > 0uOS_MsgQInit(&p_tcb->MsgQ, q_size);
#else(
void)&q_size;
#endifOSTaskCreateHook(p_tcb);
#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)for (id =
0u; id < OS_CFG_TLS_TBL_SIZE; id++) {p_tcb->TLS_Tbl[id] = (OS_TLS)
0;}OS_TLS_TaskCreate(p_tcb);
#endifOS_CRITICAL_ENTER();OS_PrioInsert(p_tcb->Prio);OS_RdyListInsertTail(p_tcb);
#if OS_CFG_DBG_EN > 0uOS_TaskDbgListAdd(p_tcb);
#endifOSTaskQty++;
if (OSRunning != OS_STATE_OS_RUNNING) { OS_CRITICAL_EXIT();
return;}OS_CRITICAL_EXIT_NO_SCHED();OSSched();
}
**void OSTaskCreate (OS_TCB
*p_tcb,CPU_CHAR
*p_name,OS_TASK_PTR p_task,void
*p_arg,OS_PRIO prio,CPU_STK
*p_stk_base,CPU_STK_SIZE stk_limit,CPU_STK_SIZE stk_size,OS_MSG_QTY q_size,OS_TICK time_quanta,void
*p_ext,OS_OPT opt,OS_ERR
*p_err)
**
*p_tcb 指向任務的控制塊OS_TCB
*p_name 指向任務的名字,我們可以為每一個任務取一個名字
p_task 執行任務代碼,也就是任務函數的名字
*p_arg 傳遞給任務的參數
prio 任務優先級,數值越低優先級越高,用戶不能夠使用系統任務使用的那些優先級!
*p_stk_base 指向任務堆棧的基地址
stk_limit 任務堆棧深度,用來檢測和確保堆棧不溢出
stk_size 任務堆棧大小
q_size COSIII中每個任務都有一個可選的內部消息隊列,我們要定義OS_CFG_TASK_Q_EN>0,這時才能使用這個內部 消息隊列
time_quanta 在使能時間片輪轉調用時用來設置時間片長度,默認節拍為時鐘節拍除以10.
*p_ext 指向用戶補充的存儲區。
opt 包含任務的特定選項,有如下選項可以設置。
OS_OPT_TASK_NONE 表示沒有任何選項
OS_OPT_TASK_STK_CHK 指定是否允許檢測該任務的堆棧
OS_OPT_TASK_STK_CLR 指定是否清除該任務的堆棧
OS_OPT_TASK_SAVE_FP 指定是否存浮點寄存器,CPU需要浮點運算硬件并且有專用代碼保護浮點 寄存器
*p_err 用來保存調用該函數后返回的錯誤代碼。
總結
以上是生活随笔為你收集整理的UCOSIIIAPI函数接口OSTaskCreate();函数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。