|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
:em23:
OSTaskCreate()
INT8U OSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)
{
void *psp;
INT8U err;
if (prio > OS_LOWEST_PRIO) { /*检测分配给任务的优先级是否有效*/
(1)
return (OS_PRIO_INVALID);
}
OS_ENTER_CRITICAL();
if (OSTCBPrioTbl[prio] == (OS_TCB *)0) { (2)
OSTCBPrioTbl[prio] = (OS_TCB *)1; (3)
OS_EXIT_CRITICAL(); (4)
psp = (void *)OSTaskStkInit(task, pdata, ptos, 0); /*建立堆栈*/
(5)
err = OSTCBInit(prio, psp, (void *)0, 0, 0, (void *)0, 0); /*从空闲的OS_TCB池中获得并初始化一个OS_TCB */ (6)
if (err == OS_NO_ERR) { (7)
OS_ENTER_CRITICAL();
OSTaskCtr++; /* 检验OSTCBInit()的返回代码,如果成功则增加OSTaskCtr, OSTaskCtr用于保存产生的任务数目*/ (8)
OSTaskCreateHook(OSTCBPrioTbl[prio]); /* OSTaskCreateHook()是用户自己定义的函数,用来扩展OSTaskCreate()的功能*/ (9)
OS_EXIT_CRITICAL();
if (OSRunning) { (10)
OSSched(); /*如果OSTaskCreate()函数是在某个任务的执行过程中被调用(即OSRunning置为True),则任务调度函数会被调用来判断是否新建立的任务比原来的任务有更高的优先级。如果新任务的优先级更高,内核会进行一次从旧任务到新任务的任务切换*/
(11)
}
} else {
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = (OS_TCB *)0; /*如果OSTCBInit()返回失败,就置OSTCBPrioTbl[prio]的入口为0以放弃该任务的优先级 */ (12)
OS_EXIT_CRITICAL();
}
return (err);
} else {
OS_EXIT_CRITICAL();
return (OS_PRIO_EXIST);
}
}
|
|