μC/OS-II的任务管理
要调用OSTaskQuery(),如程序清单L4.18中所示的那样,用户的应用程序必须要为OS_TCB分配存储空间。这个OS_TCB与μC/OS-Ⅱ分配的OS_TCB是完全不同的数据空间。在调用了OSTaskQuery()后,这个OS_TCB包含了对应任务的OS_TCB的副本。用户必须十分小心地处理OS_TCB中指向其它OS_TCB的指针(即OSTCBNext与OSTCBPrev);用户不要试图去改变这些指针! 一般来说, 本函数只用来了解任务正在干什么——本函数是有用的调试工具。
程序清单 L4.18 得到任务的信息
OS_TCBMyTaskData;
voidMyTask(void*pdata)
{
pdata=pdata;
for(;;){
/* 用户代码 */
err=OSTaskQuery(10,MyTaskData);
/*Examineerrorcode..*/
/* 用户代码 */
}
}
OSTaskQuery()的代码如程序清单L4.19所示。注意,笔者允许用户查询所有的任务,包括空闲任务[L4.19(1)]。 用户尤其需要注意的是不要改变OSTCBNext与OSTCBPrev的指向。
通常,OSTaskQuery()需要检验用户是否想知道当前任务的有关信息[L4.19(2)]以及该任务是否已经建立了[L4.19(3)]。 所有的域是通过赋值语句一次性复制的而不是一个域一个域地复制的[L4.19(4)]。这样复制会比较快一点,因为编译器大多都能够产生内存拷贝指令。
程序清单 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);
}
评论