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; //任务控制块列表
(图片转自新浪博客) 教学资料,一律帮顶。 把这个总结出来,算是搞明白了任务控制块是怎么回事了! 最好是看着任务建立代码,里面有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 */
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]