想让μC/OS-Ⅱ管理用户的任务,用户必须要先建立任务。用户可以通过传递任务地址和其它参数到以下两个函数之一来建立任务:OSTaskCreate() 或 OSTaskCreateExt()。OSTaskCreate()与μC/OS是向下兼容的,OSTaskCreateExt()是OSTaskCreate()的扩展版本,提供了一些附加的功能。用两个函数中的任何一个都可以建立任务。任务可以在多任务调度开始前建立,也可以在其它任务的执行过程中被建立。在开始多任务调度(即调用OSStart())前,用户必须建立至少一个任务。任务不能由中断服务程序(ISR)来建立。
函数 |
功能描述 |
OSTaskCreate() |
建立任务 |
OSTaskCreateExt() |
建立任务 |
函数名 | OSTaskCreate |
参数 |
task是任务代码的指针 pdata是当任务开始执行时传递给任务的参数的指针 ptos是分配给任务的堆栈的栈顶指针 prio是分配给任务的优先级 |
功能描述 | 建立任务 |
函数原型 |
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio) |
核 心 代 码 分 析 |
{ OS_ENTER_CRITICAL(); //进入临界期0 if (OSTCBPrioTbl[prio] == (OS_TCB *) 0) //判断该优先级是否已经存在 { OSTCBPrioTbl[prio] = (OS_TCB *) 1; //保留该优先级 OS_EXIT_CRITICAL(); //退出临界区0
psp = (OS_STK *) OSTaskStkInit(task, ppdata, ptos, 0); //初始化任务堆栈 err = OS_TCBInit(prio, psp, (OS_STK *) 0, 0, 0, (void *) 0, 0); //初始化任务控制块TCB if (err == OS_NO_ERR) //初始化TCB没有出错 { OS_ENTER_CRITICAL(); //进入临界区1 OSTaskCtr++; //任务数自加 OS_EXIT_CRITICAL(); //退出临界区1 if (OSRunning == TRUE) //如果系统已经运行(即在OS运行时创建任务) { OS_Sched(); //任务调度(该函数不再返回) } } else //初始化TCB出错 { OS_ENTER_CRITICAL(); //进入临界区2 OSTCBPrioTbl[prio] = (OS_TCB *) 0; //初始化TCB出错了, 释放TCB OS_EXIT_CRITICAL(); //退出临界区2 }
return (err); //返回初始化TCB出错信息 } OS_EXIT_CRITICAL();//退出临界区0
return (OS_PRIO_EXIST); //返回错误信息,该优先级已经存在 } |