UCOS之OS_TCB控制块代码分析

OS_TCB结构体控制块

OS_TCB结构体,在正常使用情况下,被其他函数调用。
例如:

OS_TCB *ptcb;
ptcb为结构体指针,在函数中通常是某些任务函数的地址,通过将优先级列表的任务地址赋值给ptcb,那ptcb就成为了该任务的地址,进而可以通过ptcb操作该任务的OS_TCB 变量

参数:
OS_STK :typedef unsigned int OS_STK
INT32U :typedef unsigned int INT32U
INT16U :typedef unsigned short INT16U
INT8U :typedef unsigned char INT8U
struct os_tcb : 结构体的结构体,常用于链表的建立
OS_EVENT : OS_EVENT结构体
OS_FLAG_NODE: OS_FLAG_NODE结构体
OS_FLAGS : typedef INT16U OS_FLAGS
OS_PRIO : typedef INT8U OS_PRIO;

typedef struct os_tcb {
    OS_STK          *OSTCBStkPtr;           /* 定义一个无符号整型指向stk的栈顶指针                        */
#if OS_TASK_CREATE_EXT_EN > 0u  //如果延申创建标志位=1,那句创建一些延申参数
    void            *OSTCBExtPtr;           /* 用户自定义的数据指针                                     */
    OS_STK          *OSTCBStkBottom;        /* 指向栈底的站在这                                         */
    INT32U           OSTCBStkSize;          /* 栈大小   */
    INT16U           OSTCBOpt;              /*任务选项  */
    INT16U           OSTCBId;               /* 任务ID  */
#endif

    struct os_tcb   *OSTCBNext;             /* 结构体指针OSTCBNext:相对于OS_TCB{OSTCBNext{...}},结构体里的结构体,构成链表                 */
    struct os_tcb   *OSTCBPrev;             /*OS_TCB{OSTCBPrev{...}},结构体里的结构体,构成链表                      */

#if (OS_EVENT_EN)
    OS_EVENT        *OSTCBEventPtr;         /* 指向事件控制块的指针                */
#endif

#if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0u)
    OS_EVENT       **OSTCBEventMultiPtr;    /* 指向多事件控制块的指针               */
#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;         /* 指向事件flag的指针                             */
#endif
    OS_FLAGS         OSTCBFlagsRdy;         /* Event flags that made task ready to run                 */
#endif

    INT32U           OSTCBDly;              /* 任务延时时间片   */
    INT8U            OSTCBStat;             /* 任务状态                                             */
    INT8U            OSTCBStatPend;         /* Task PEND status                                        */
    INT8U            OSTCBPrio;             /* 任务的优先级                           */

    INT8U            OSTCBX;                /* 优先级位图法用到的结构    */
    INT8U            OSTCBY;                /* 优先级位图法用到的结构    */
    OS_PRIO          OSTCBBitX;             /* 优先级位图法用到的结构          */
    OS_PRIO          OSTCBBitY;             /* 优先级位图法用到的结构          */

#if OS_TASK_DEL_EN > 0u
    INT8U            OSTCBDelReq;           /*删除任务请求,是否需要删除自己       */
#endif

#if OS_TASK_PROFILE_EN > 0u
    INT32U           OSTCBCtxSwCtr;         /* 任务切换次数                 */
    INT32U           OSTCBCyclesTot;        /* 任务循环次数 */
    INT32U           OSTCBCyclesStart;      /* 任务运行的累计时间   */
    OS_STK          *OSTCBStkBase;          /* 堆栈的基地址              */
    INT32U           OSTCBStkUsed;          /* 堆栈的使用情况               */
#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;

你可能感兴趣的:(UCOS学习)