#if OS_ARG_CHK_EN > 0
if (prio > OS_LOWEST_PRIO) { /* Make sure priority is within allowable range */
return (OS_ERR_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) { /* Make sure task doesn't already exist at this priority */
OSTCBPrioTbl[prio] = OS_TCB_RESERVED;/* Reserve the priority to prevent others from doing ... */
/* ... the same thing until task is created. */
//#define OS_TCB_RESERVED ((OS_TCB *)1) //ucos_ii.h
/*
OSTaskCreate()要确保在规定的优先级上还没有建立任务。在使用μC/OS-Ⅱ时,每个任务都有特定的优先级。如果某个优先级是空闲的,μC/OS-Ⅱ通过放置一个非空指针在OSTCBPrioTbl[]中来保留该优先级。这就使得OSTaskCreate()在设置任务数据结构的其他部分时能重新允许中断。OSTCBPrioTbl[prio] == 0代表该优先级没被别的任务用,置一个非空指针在OSTCBPrioTbl[]中因为本任务要用了,别的任务不能再用了,见OS_TCBInit 的 OSTCBPrioTbl[prio] = ptcb; //*/
OS_EXIT_CRITICAL();
psp = OSTaskStkInit(task, p_arg, ptos, 0); /* Initialize the task's stack */
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0);
if (err == OS_ERR_NONE) {
if (OSRunning == OS_TRUE) { /* Find highest priority task if multitasking has started */
OS_Sched();
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0;/* Make this priority available to others */
OS_EXIT_CRITICAL();
}
return (err);
}//
end if (OSTCBPrioTbl[prio] == (OS_TCB *)0)
OS_EXIT_CRITICAL();
return (OS_ERR_PRIO_EXIST);
}
#endif
1, 所有的任务控制块TCB都是存放在 任务控制块列表数组OSTCBTbl[] 中,系统通过任务控制块优先级表OSTCBPrioTbl[] ,查询到任务控制块的地址,任务控制块的相关数据定义。
2,任务控制块优先级表OSTCBPrioTbl[] 是以任务为索引,里面保存的是任务0到最大任务的任务控制块的首地址,据此可以通过任务优先级号快速找到当前任务在任务控制块中的首地址,而不必到任务控制块链表中去一步一步查找,加快了任务的切换时间,提高了操作系统的效率。