您的位置:首页 > 其它

uC/OS II 函数说明 之–OS_TCBInit()

2011-05-26 14:38 330 查看
TCB初始化函数,被OSTaskCreate()与OSTaskCreateExt()调用,需要注意的是,这个函数是对内的,即此函数可以被uC/OS II调用,用户应用程序不可以直接调用此函数。OSTcbInit()函数的参数是与OSTaskCreateExt()的参数对应的,对于OSTaskCreate(),部分参数被设置为0。
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0, 0, (void *)0, 0); /* 对应OSTaskCreate() */
err = OS_TCBInit(prio, psp, pbos, id, stk_size, pext, opt); /* 对应OSTaskCreateExt() */

函数源码如下:

INT8U OS_TCBInit (INT8U prio, /* 优先级 */
OS_STK *ptos, /* 指向堆栈顶部 */
OS_STK *pbos, /* 指向堆栈底部 */
INT16U id,
INT32U stk_size, /* 堆栈大小 */
void *pext, /* 扩展指针 */
INT16U opt) /* 存放与任务操作相关的信息,详见uCOS-II.H */
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
OS_TCB *ptcb;

OS_ENTER_CRITICAL();
ptcb = OSTCBFreeList; /* 从空链表中获取一个TCB */
if (ptcb != (OS_TCB *)0) { /* 空链表存在 */
OSTCBFreeList = ptcb->OSTCBNext; /* 指向下一个链接位置,此位置已被占用 */
OS_EXIT_CRITICAL();
ptcb->OSTCBStkPtr = ptos; /* Load Stack pointer in TCB */
ptcb->OSTCBPrio = (INT8U)prio; /* Load task priority into TCB */
ptcb->OSTCBStat = OS_STAT_RDY; /* Task is ready to run */
ptcb->OSTCBDly = 0; /* Task is not delayed */

#if OS_TASK_CREATE_EXT_EN > 0 /* 如果是OSTaskCreateExt()创建,附加下列参数*/
ptcb->OSTCBExtPtr = pext; /* Store pointer to TCB extension */
ptcb->OSTCBStkSize = stk_size; /* Store stack size */
ptcb->OSTCBStkBottom = pbos; /* Store pointer to bottom of stack */
ptcb->OSTCBOpt = opt; /* Store task options */
ptcb->OSTCBId = id; /* Store task ID */
#else
pext = pext; /* 避免编译器警告或报错 */
stk_size = stk_size;
pbos = pbos;
opt = opt;
id = id;
#endif

#if OS_TASK_DEL_EN > 0
ptcb->OSTCBDelReq = OS_NO_ERR;
#endif

ptcb->OSTCBY = prio >> 3; /* 提前计算X, Y, BitX and BitY,用于查表 */
ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY]; /* 详见任务就绪表 */
ptcb->OSTCBX = prio & 0×07;
ptcb->OSTCBBitX = OSMapTbl[ptcb->OSTCBX];

#if OS_EVENT_EN > 0
ptcb->OSTCBEventPtr = (OS_EVENT *)0; /* Task is not pending on an event */
#endif

#if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0) && (OS_TASK_DEL_EN > 0)
ptcb->OSTCBFlagNode = (OS_FLAG_NODE *)0; /* Task is not pending on an event flag */
#endif

#if (OS_MBOX_EN > 0) || ((OS_Q_EN > 0) && (OS_MAX_QS > 0))
ptcb->OSTCBMsg = (void *)0; /* No message received */
#endif

#if OS_VERSION >= 204
OSTCBInitHook(ptcb);
#endif

OSTaskCreateHook(ptcb); /* Call user defined hook */
OS_ENTER_CRITICAL();
OSTCBPrioTbl[prio] = ptcb; /* TCB指针按照优先级放入OSTCBPrioTbl[]对应位置*/
ptcb->OSTCBNext = OSTCBList; /* OSTCBList总是指向队列头位置,ptcb插入其前面*/
ptcb->OSTCBPrev = (OS_TCB *)0; /* 由于ptcb在最前面,它的OSTCBPrev为空 */
if (OSTCBList != (OS_TCB *)0) { /* 判断是否为第一个任务,如不是,则链接前后 */
OSTCBList->OSTCBPrev = ptcb; /* 任务,形成任务链 */
}
OSTCBList = ptcb; /* OSTCBList依然是队列的第一个元素 */
OSRdyGrp |= ptcb->OSTCBBitY; /* 任务加入就绪表,准备运行 */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_NO_MORE_TCB);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: