uC/OS-II源码分析(二)

uC/OS-II任务管理

  uC/OS-II中任务是事件管理的基本单元,一个任务管理某一个特定事件。

  学习内容:任务的基本属性,一个任务所需要的基本资源(包括任务堆栈管理、任务控制块),优先级以及状态属性;任务管理有关的源代码分析。

  一.任务的基本属性:

    1.举例:C语言可执行代码结构由代码段、数据段、未初始化数据段(BSS)、栈段、堆段组成。分别存放CPU的机器指令、在程序中被明确初始化的全局变量以及静态变量和局部静态变量、全局未初始化变量、函数的参数值以及局部变量的值和任务切换时的上下文、动态内存分配。在uC/OS-II中的任务和Linux中的进程就相当于这样的一段可执行代码,拥有一本的数据段、代码段、BSS、栈段、堆段。

    2.uC/OS-II任务结构:一个uC/OS-II任务至少有可执行代码、栈和任务控制块(TCB)。另外可以选择性的使用内存分配。

       (1)任务栈:栈的实现就是一段连续的内存空间。uC/OS-II采用数组来实现。uC/OS-II在创建任务的时候必须指定该任务栈的栈顶位置,需要显示的声明一段全局空间作为该任务的栈。在不同的处理器中,栈的增长方式是不同的。有些处理器是由低到高增长,有的则相反。uC/OS-II通过全局变量OS_STK_GROWTH来标示栈的增长方向。

       (2)TCB:在uC/OS-II定义了其结构:由于管理TCB是通过双向链表来实现的,所以在其中有两个分别指向前后TCB的指针。

 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  指向用户自定义的扩展TCB,不必需*/
    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)     任务ID                                      */
#endif
    /*由于使用了双链表管理任务的TCB,因此定义了控制好指针*/
    struct os_tcb   *OSTCBNext;        /* Pointer to next     TCB in the TCB list 指向双向TCB链表的下一个TCB                     */
    struct os_tcb   *OSTCBPrev;        /* Pointer to previous TCB in the TCB list 指向双向TCB链表的前一个TCB                     */

#if OS_EVENT_EN     判断是否使用了事件
    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;         /*   标识当前任务是否在等待状态   不为0表示在等待状态   */
    INT8U            OSTCBStat;        /* Task status   标识当前任务状态                                               */
    BOOLEAN          OSTCBPendTO;      /* Flag indicating PEND timed out 标识任务是否处于阻塞状态          */
    INT8U            OSTCBPrio;        /* Task priority (0 == highest)   任务优先级                              */

    INT8U            OSTCBX;           /* Bit position in group  corresponding to task priority优先级在低3位        */
    INT8U            OSTCBY;           /* Index into ready table corresponding to task priority  优先级在高3位      */
#if OS_LOWEST_PRIO <= 63
    INT8U            OSTCBBitX;        /* Bit mask to access bit position in ready table 优先级在低3位掩码              */
    INT8U            OSTCBBitY;        /* Bit mask to access bit position in ready group  优先级在高3位掩码             */
#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[OS_TASK_NAME_SIZE];
#endif
} OS_TCB;

3.与任务有关的源代码分析,注释。需要者可以一起商讨。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值