μC/OS-II的任務(wù)管理
要調(diào)用OSTaskQuery(),如程序清單L4.18中所示的那樣,用戶的應(yīng)用程序必須要為OS_TCB分配存儲空間。這個OS_TCB與μC/OS-Ⅱ分配的OS_TCB是完全不同的數(shù)據(jù)空間。在調(diào)用了OSTaskQuery()后,這個OS_TCB包含了對應(yīng)任務(wù)的OS_TCB的副本。用戶必須十分小心地處理OS_TCB中指向其它OS_TCB的指針(即OSTCBNext與OSTCBPrev);用戶不要試圖去改變這些指針! 一般來說, 本函數(shù)只用來了解任務(wù)正在干什么——本函數(shù)是有用的調(diào)試工具。
程序清單 L4.18 得到任務(wù)的信息
OS_TCBMyTaskData;
voidMyTask(void*pdata)
{
pdata=pdata;
for(;;){
/* 用戶代碼 */
err=OSTaskQuery(10,MyTaskData);
/*Examineerrorcode..*/
/* 用戶代碼 */
}
}
OSTaskQuery()的代碼如程序清單L4.19所示。注意,筆者允許用戶查詢所有的任務(wù),包括空閑任務(wù)[L4.19(1)]。 用戶尤其需要注意的是不要改變OSTCBNext與OSTCBPrev的指向。
通常,OSTaskQuery()需要檢驗(yàn)用戶是否想知道當(dāng)前任務(wù)的有關(guān)信息[L4.19(2)]以及該任務(wù)是否已經(jīng)建立了[L4.19(3)]。 所有的域是通過賦值語句一次性復(fù)制的而不是一個域一個域地復(fù)制的[L4.19(4)]。這樣復(fù)制會比較快一點(diǎn),因?yàn)榫幾g器大多都能夠產(chǎn)生內(nèi)存拷貝指令。
程序清單 L4.19 OSTaskQuery().
INT8UOSTaskQuery(INT8Uprio,OS_TCB*pdata)
{
OS_TCB*ptcb;
if(prio>OS_LOWEST_PRIOprio!=OS_PRIO_SELF){(1)
return(OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if(prio==OS_PRIO_SELF){(2)
prio=OSTCBCur->OSTCBPrio;
}
if((ptcb=OSTCBPrioTbl[prio])==(OS_TCB*)0){(3)
OS_EXIT_CRITICAL();
return(OS_PRIO_ERR);
}
*pdata=*ptcb;(4)
OS_EXIT_CRITICAL();
return(OS_NO_ERR);
}
評論