UCOSII通过任务控制块来管理任务,创建任务的工作实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。
还要使刚创建的任务进入就绪态,并接着引发一次任务调度。
创建任务函数 OSTaskCreate()、OSTaskCreateExt(),OSTaskCreateExt()是OSTaskCreate()的扩展,提供了一些附加功能。
INT8U OSTaskCreate(
void (* task)(void * pd) 指向任务的指针
void * pdata, 传递给任务的参数
OS_STK * ptos, 指向任务堆栈栈顶的指针
INT8U prio 任务的优先级
)
{
#if OS_CRITICAL_METHOD == 3u
OS_CPU_SR cpu_sr = 0u
#endif
void * psp;
INT8U err;
if(prio>OS_LOWEST_PRIO)
{
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if(OSTCBPrioTbl[prio]==(OS_TCB *)0)确认优先级未被使用过
{
OSTCBPrioTbl[prio]==(OS_TCB *)1;保留优先级
OS_EXIT_CRITICAL();
psp=(void*)OSTaskStkInit(//初始化任务堆栈
task,
pdata,
ptos,
0
);
err=OSTCBInit(//获得初始化任务控制块
prio,
psp,
(void *)0,0,0,
(void *)0,0
);
if(err==OS_NO_ERR)
{
OS_ENTER_CRITICAL();
OSTaskCtr++;//任务计数器加1
OS_EXIT_CRITICAL();
if(OSRunnig)
{
OSSched();//任务调度
}
}
else
{
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio]=(OS_TCB)0;//放弃任务
OS_EXIT_CRITICAL();
}
return(err);
}
else
{
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}