您的位置:首页 > 其它

UC/OS基础知识之任务的创建

2016-01-05 22:02 435 查看

任务的创建

1.创建任务函数

任务的创建实质上是创建一个任务控制块,并通过任务控制块把任务代码和任务堆栈关联起来形成一个完整的任务。UC/OS提供两个函数创建任务OSTaskCreate()和OSTaskCreateExt()。一般前者用的多,OSTaskCreate()如下所示:

INT8U  OSTaskCreate (void (*task)(void *p_arg), void *p_arg, OS_STK *ptos, INT8U prio)
{
OS_STK    *psp;
INT8U      err;
#if OS_CRITICAL_METHOD == 3
OS_CPU_SR  cpu_sr = 0;
#endif
#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { //检测任务的优先级是否合法
return (OS_PRIO_INVALID);
}
#endif
OS_ENTER_CRITICAL();
if (OSIntNesting > 0) {   /* Make sure we don't create the task from within an ISR  */
OS_EXIT_CRITICAL();
return (OS_ERR_TASK_CREATE_ISR);
}
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) {//确认优先级未被使用
OSTCBPrioTbl[prio] = (OS_TCB *)1;    //保留优先级

OS_EXIT_CRITICAL();
psp = OSTaskStkInit(task, p_arg, ptos, 0);//初始化堆栈
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);//初始化任务控制块
if (err == OS_NO_ERR) {
if (OSRunning == OS_TRUE) {      /* Find highest priority task if multitasking has started */
OS_Sched();//任务调度
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;//放弃任务
OS_EXIT_CRITICAL();
}
return (err);
}
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
#endif


2.创建任务的一般方法

一般说来,任务可在OSStart()启动任务调度之前来创建,也可在任务中创建,但是UC/OS有个规定:在调用OSStart()启动任务调度之前,必须创建了至少一个任务。因此一般习惯上,在OSStart()启动任务调度之前先创建一个任务,并赋予它最高的优先级,从而使它成为起始任务,然后在这个起始任务中再创建其他任务。如果要使用统计任务,则统计任务的初始化函数也必须在这个起始任务中来调用。

注意:

UC/OS不允许在中断服务程序中创建任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: