jzhang123 发表于 2013-10-25 14:40:27

ucos-II学习笔记 -任务控制块

本帖最后由 jzhang123 于 2013-10-25 16:15 编辑

任务控制块链表:
    在μC/OS-II中存在两条管理任务的链表,一条是空任务块链表,另一条是任务块链表. 分别由OSTCBFreeList,
OSTCBList两个指针指向头节点.
    空任务块链表是在系统初始化时创建的,链表中节点的个数为OS_MAX_TASKS + OS_N_SYS_TASKS,其中
OS_N_SYS_TASKS为系统任务数.建立任务时会从空任务块链表中截取一个任务块,填充任务属性后再将其加
入控制块链表.为了加快对任务控制块的访问速度,除了任务控制块链表被创建为双向之外,系统中还定义有一个
类型为OS_TCB*的数组OSTCBTbl[]按优先级存放任务块地址,使系统在访问一个任务的任务控制块时不必遍历
任务控制块链表.另外系统中还定义有一个OS_TCB*类型的变量OSTCBCur指向当前正在运行的任务块.

任务的建立:
当应用程序调用OSTaskCreate()或OSTaskCreateExt()创建任务时, OSTCBFreeList所指的任务控制块将被分配
给该任务(任务初始化过程见下文),此节点会从OSTCBFreeList所指链表中剔除,加入OSTCBList所指链表,并根据
任务的优先级别将此任务块的地址放入OSTCBTbl[]相应位置.如果该任务被立即执行, OSTCBCur会指向该任务
控制块,至此一个任务创建完成.

任务删除:
    而程序调用OSTaskDel()删除一个任务时,其实际操作就是创建的反向操作.将该任务控制块的任务属性置空,
从OSTCBTbl[],OSTCBList中剔除该任务控制块,在OSTCBFreeList加入该任务控制块.

任务控制块的相关数据:
OSTCB *OSTCBCur;         //指向当前运行任务的控制块指针
OSTCB *OSTCBFreeList;   //“空任务控制块”链表的表头指针,TCB链表中空闲的任务控制TCB的第一个。
OSTCB *OSTCBHighRdy;    //指向最高优先级就绪任务控制块的指针
OSTCB *OSTCBList;          //指向任务控制块列表首地址,“已使用任务控制块”链表的表头指针;
OSTCB *OSTCBPrioTbl;   //定义任务控制块优先级表
OSTCB OSTCBTbl;         //任务控制块列表


(图片转自新浪博客)

stely 发表于 2013-10-25 16:03:17

教学资料,一律帮顶。

jzhang123 发表于 2013-10-25 16:20:35

把这个总结出来,算是搞明白了任务控制块是怎么回事了!

jzhang123 发表于 2013-10-25 16:21:54

最好是看着任务建立代码,里面有TCB模块的初始化,结合这个文字说明和图片,就很清晰明了的明白了这个恶过程。

jzhang123 发表于 2013-11-29 14:12:00

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_EVENT_EN) || (OS_FLAG_EN > 0)   //定义指向事件控制块的指针
    OS_EVENT      *OSTCBEventPtr;         /* Pointer to          event control block               */
#endif

#if (OS_EVENT_EN) && (OS_EVENT_MULTI_EN > 0)//
    OS_EVENT       **OSTCBEventMultiPtr;    /* Pointer to multiple event control blocks                */
#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_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            OSTCBStatPend;         /* Task PEND status                                        */
    INT8U            OSTCBPrio;             /* Task priority (0 == highest)                            */

    INT8U            OSTCBX;                /* Bit position in groupcorresponding to task priority   */
    INT8U            OSTCBY;                /* Index into ready table corresponding to task priority   */
#if OS_LOWEST_PRIO <= 63
    INT8U            OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT8U            OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#else
    INT16U         OSTCBBitX;             /* Bit mask to access bit position in ready table          */
    INT16U         OSTCBBitY;             /* Bit mask to access bit position in ready group          */
#endif

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

#if OS_TASK_PROFILE_EN > 0
    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_SIZE > 1
    INT8U            OSTCBTaskName;
#endif
} OS_TCB;
页: [1]
查看完整版本: ucos-II学习笔记 -任务控制块