uC/OS II 函数说明 之–OS_TCBInit()
来源:互联网 发布:手机文件解压软件 编辑:程序博客网 时间:2024/04/29 19:05
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 */ OSRdyGrp |= ptcb->OSTCBBitY; /* 任务加入就绪表,准备运行 */
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依然是队列的第一个元素 */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OS_EXIT_CRITICAL();
return (OS_NO_ERR);
}
OS_EXIT_CRITICAL();
return (OS_NO_MORE_TCB);
}
- uC/OS II 函数说明 之–OS_TCBInit()
- uC/OS-ii内核理解(六)初始化TCB-OS_TCBInit函数
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- uc/os-II之延时函数解析
- uC/OS-II 函数之OSInit()
- uC/OS-II之系统函数
- uC/OS II 函数说明之与信号量操作相关的六个函数
- uC/OS II 函数说明之与信号量操作相关的六个函数
- uC/OS-II 函数之任务相关函数
- uC/OS-II 函数之时间相关函数
- uC/OS-II 函数之信号量相关函数
- uC/OS-II 函数之消息队列相关函数
- uC/OS-II 函数之邮箱管理相关函数
- uC/OS-II 常用函数参考手册
- uC/OS-II 常用函数参考手册
- uC/OS-II 一些函数简介
- UC/OS-II的函数------OSTimeDly
- uC/OS-II感悟之JLink
- uC/OS II 函数说明 之–OSTaskCreate()与OSTaskCreateExt()
- 巴比伦塔-小强版
- uC/OS II事件控制块之-ECB数据结构
- 十四、Hibernate实体映射(每个具体类映射成一张表)
- 提高myeclipse启动速度(转)
- uC/OS II 函数说明 之–OS_TCBInit()
- iphone程序转换为ipad程序
- tomcat5无法打开欢迎界面的问题
- MOSS2007 WebPart 部署与发布
- sudo讲解
- uCOS任务堆栈的深入分析
- 用第三方软件显示硬件型号
- VisualStudio C++ 工程比较有用的配置
- [SQL Server] 主数据文件损坏(或丢失)情况下,如何备份尾部事务日志.