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.与任务有关的源代码分析,注释。需要者可以一起商讨。