新闻  |   论坛  |   博客  |   在线研讨会
任务控制块TCB
啸风 | 2013-06-10 16:30:55    阅读:49179   发布文章

    任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定数量的任务控制块。任务控制块的数量等于操作系统中能同时管理的做多任务数。

源码:ucos-II 2.91

/*

*********************************************************************************************************
*                                         任务控制块
*********************************************************************************************************
*/


typedef struct os_tcb {

    //typedef unsigned int  OS_STK; ------>OS_CPU.H文件中定义

    OS_STK          *OSTCBStkPtr;           /* Pointer to current top of stack   */


#if OS_TASK_CREATE_EXT_EN > 0u

    //如果OS_TASK_CREATE_EXT_EN > 0u,表示配置了任务创建扩展功能,以下几个定义语句才有效;

    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_EVENT_EN)
    OS_EVENT        *OSTCBEventPtr;    /* Pointer to  event control block   */
#endif


#if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0u)
    OS_EVENT       **OSTCBEventMultiPtr;    /* Pointer to multiple event control blocks  */
#endif


#if ((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u)
    void            *OSTCBMsg;              /* Message received from OSMboxPost() or OSQPost()         */
#endif


#if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u)
#if OS_TASK_DEL_EN > 0u
    OS_FLAG_NODE    *OSTCBFlagNode;         /* Pointer to event flag node                              */
#endif
    OS_FLAGS         OSTCBFlagsRdy;         /* Event flags that made task ready to run                 */
#endif


    INT32U            OSTCBDly;              /* Nbr ticks to delay task or, timeout waiting for event   */
    INT8U              OSTCBStat;             /* Task      status                                        */
    INT8U              OSTCBStatPend;      /* Task PEND status                                        */
    INT8U              OSTCBPrio;             /* Task priority (0 == highest)                            */


    INT8U              OSTCBX;                /* Bit position in group  corresponding to task priority   */
    INT8U              OSTCBY;                /* Index into ready table corresponding to task priority   */
    OS_PRIO          OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    OS_PRIO          OSTCBBitY;             /* Bit mask to access bit position in ready group          */


#if OS_TASK_DEL_EN > 0u
    INT8U            OSTCBDelReq;           /* Indicates whether a task needs to delete itself         */
#endif


#if OS_TASK_PROFILE_EN > 0u
    INT32U           OSTCBCtxSwCtr;         /* Number of time the task was switched in                 */
    INT32U           OSTCBCyclesTot;        /* Total number of clock cycles the task has been running  */
    INT32U           OSTCBCyclesStart;      /* Snapshot of cycle counter at start of task resumption   */
    OS_STK          *OSTCBStkBase;          /* Pointer to the beginning of the task stack              */
    INT32U           OSTCBStkUsed;          /* Number of bytes used from the stack                     */
#endif


#if OS_TASK_NAME_EN > 0u
    INT8U           *OSTCBTaskName;
#endif


#if OS_TASK_REG_TBL_SIZE > 0u
    INT32U           OSTCBRegTbl[OS_TASK_REG_TBL_SIZE];
#endif
} OS_TCB;

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
堂主家的芯食堂开张了,欢迎各位客官进来品尝~
推荐文章
最近访客