任务控制块的数据结构如下:
- typedef struct os_tcb {
- OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */
- #if OS_TASK_CREATE_EXT_EN > 0
- void *OSTCBExtPtr; /* Pointer to user definable data for TCB extension */
- OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */
- INT32U OSTCBStkSize; /* Size of task stack (in number of stack elements) */
- INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */
- INT16U OSTCBId; /* Task ID (0..65535) */
- #endif
- struct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */
- struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */
- #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
- OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */
- #endif
- #if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
- void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() */
- #endif
- #if (OS_VERSION >= 251) && (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
- #if OS_TASK_DEL_EN > 0
- OS_FLAG_NODE *OSTCBFlagNode; /* Pointer to event flag node */
- #endif
- OS_FLAGS OSTCBFlagsRdy; /* Event flags that made task ready to run */
- #endif
- INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event */
- INT8U OSTCBStat; /* Task status */
- INT8U OSTCBPrio; /* Task priority (0 == highest, 63 == lowest) */
- /* OSTCBX,OSTCBBitX,OSTCBY,OSTCBBitY 的作用是加快任务切换速度,对Prio进行了预处理 */
- INT8U OSTCBX; /* Bit position in group corresponding to task priority (0..7) */
- INT8U OSTCBY; /* Index into ready table corresponding to task priority */
- INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */
- INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */
- #if OS_TASK_DEL_EN > 0
- BOOLEAN OSTCBDelReq; /* Indicates whether a task needs to delete itself */
- #endif
- } OS_TCB;
任务控制块初始化函数
- INT8U OS_TCBInit(INT8U prio, OS_STK * ptos, OS_STK * pbos, INT16U id, INT32U stk_size, void * pext, INT16U opt){
- #if OS_CRITICAL_METHOD == 3 <span style="white-space:pre"> </span>/* Allocate storage for CPU status register <span style="white-space:pre"> </span>*/
- OS_CPU_SR cpu_sr;<span style="white-space:pre"> </span>/// typedef unsigned<span style="white-space:pre"> </span>int<span style="white-space:pre"> </span>OS_CPU_SR;
- #endif
- OS_TCB *ptcb;
- OS_ENTER_CRITICAL();<span style="white-space:pre"> </span>/* OS_TCB *OSTCBFreeList(原型)
- <span style="white-space:pre"> </span>初始化时 OSTCBFreeList= & <span style="font-family: Arial, Helvetica, sans-serif;">OSTCBTbl[0]<span style="white-space:pre"> </span>*/</span>
- ptcb = OSTCBFreeList; /* Get a free TCB from the free TCB list<span style="white-space:pre"> </span>*/
- if( ptcb != ( OS_TCB * ) 0 ){<span style="white-space:pre"> </span>///从缓冲池申请一个OS_TCB块
- OSTCBFreeList = ptcb->OSTCBNext; /* Update pointer to free TCB list */
- OS_EXIT_CRITICAL();<span style="white-space:pre"> </span>///链表的操作,以及对缓冲池的操作
- 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 ///若允许扩展则对下列变量初始化,否则赋给自身,防止编译器警告///
- 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; <span style="white-space:pre"> </span>/* Prevent compiler warning if not used */
- stk_size = stk_size;
- pbos = pbos;
- opt = opt
- id = id;
- #endif
- #if OS_TASK_DEL_EN > 0
- ptcb->OSTCBDelReq = OS_NO_ERR;
- #endif
- ///对prio进行预处理,
- ptcb->OSTCBY = prio >> 3; /* Pre-compute X,Y,BitX,and BitY */
- ptcb->OSTCBBitY = OSMapTbl[ptcb->OSTCBY];
- ptcb->OSTCBX = prio & 0x07;
- 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 || ( OS_Q_EN && ( OS_MAX_QS >=2 ) ))
- ptcb->OSTCBMsg = ( void * )0; /* No message received */
- #endif
- #if OS_VERSION > 204
- OSTaskCreateHooK(ptcb);
- #endif
- OSTaskCreateHook(ptcb); /* Call User defined hook */
- OS_ENTER_CRITICAL();
- OSTCBPrioTbl[prio] = ptcb;
- ptcb->OSTCBNext = OSTCBList;
- ptcb->OSTCBPrev = ( OS_TCB * ) 0;
- if( OSTCBList != ( OS_TCB * ) 0 ){
- OSTCBList->OSTCBPrev = ptcb;
- }
- OSTCBList = ptcb;
- OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
- OSRdyTbl[ptcb->OSTCBY] <span style="white-space:pre"> </span>|= ptcb->OSTCBBitX;
- OS_EXIT_CRITICAL();
- return ( OS_NO_ERR );
- }
- OS_EXIT_CRITICAL();
- return ( OS_NO_MORE_TCB );
- }