UC/OS基础知识之任务控制块
1.任务控制块结构
用来记录任务的堆栈指针,任务的当前状态,任务的优先级别等一些与任务管理有关的属性的表就叫做任务控制块,没有任务控制块的任务不能被系统承认和管理
任务控制块是一个结构类型数据,当调用OSTaskCreate()创建任务时,该函数就会对任务控制块中的所有成员赋值,并驻留在RAM中。任务控制块结构的定义如下
typedef struct os_tcb {
OS_STK *OSTCBStkPtr; //当前TCB的栈顶指针
#if OS_TASK_CREATE_EXT_EN > 0 //允许生成OSTaskCreateExt()函数
void *OSTCBExtPtr; //指向用户定义的任务控制块(扩展指针)
OS_STK *OSTCBStkBottom; //指向任务堆栈栈底指针
INT32U OSTCBStkSize; //设定堆栈的容量
INT16U OSTCBOpt; //创建任务时的选择项
INT16U OSTCBId; //目前该域未被使用
#endif
struct os_tcb *OSTCBNext; //指向下一个任务控制块的指针
struct os_tcb *OSTCBPrev; //指向上一个任务控制块的指针
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
//当以上各种事件允许时
OS_EVENT *OSTCBEventPtr; //定义指向事件控制块的指针
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
void *OSTCBMsg; //满足以上条件,定义传递给任务的消息指针
#endif
INT16U OSTCBDly; //定义允许任务等待时的最多节拍数
INT8U OSTCBStat; //定义任务的状态字
INT8U OSTCBPrio; //定义任务的优先级
INT8U OSTCBX; //定义指向任务优先级的低3位, 即=priority&0x07
INT8U OSTCBY; //定义指向任务优先级的高3位, 即=priority>>3
INT8U OSTCBBitX; //定义低3位就绪表对应值( 0~ 7), 即= OSMapTbl[priority&0x07]
INT8U OSTCBBitY; //定义高3位就绪表对应值( 0~ 7), 即= OSMapTbl[priority>>3]
#if OS_TASK_DEL_EN > 0 //允许生成 OSTaskDel() 函数代码函数
BOOLEAN OSTCBDelReq; //请求删除任务时用到的标识
#endif
} OS_TCB;
2.任务控制块链表
任务控制块以链表的形式存在,任务控制块链表又分为已经给任务控制块分配任务的任务控制块链表和未给任务控制块分配任务的空任务控制块链表。UC/OS在初始化时建立的空任务控制块链表一共是OS_MAX_TASKS+OS_N_SYS_TASKS个,其中OS_MAX_TASKS在OS_CFG.H中定义指明用户任务的最大数目,OS_N_SYS_TASKS则在UCOS_II.H中定义表明系统任务的数目(值为2,空闲任务和统计任务),空任务控制块链表示意图如下图
每当应用程序调用系统函数OSTaskCreate()或者OSTaskCreateExt()创建一个任务时,系统就会将空任务控制块链表头指针OSTCBFreeList指向的任务控制块分配给该任务,再给任务控制块中的各成员赋值后,系统就按任务控制块链表的头指针OSTCBList将其加入到任务控制块链表中。下图是在空任务控制块的基础上创建了两个用户任务并使用了两个系统任务。
注意:空任务控制块链表是单向的,任务控制块链表是双向的
OSTCBPrioTbl[]数组以任务的优先级为顺序在各个元素里存放了指向各个任务控制块的指针,这样在访问一个任务的任务块时就不必遍历任务控制块链表了。
3.任务控制块的初始化
初始化任务控制块函数OSTCBInit()原型如下:
INT8U OS_TCBInit (
INT8U prio, //任务的优先级别,保存在OSTCBPrio中
OS_STK *ptos, //任务堆栈栈顶指针 保存在OSTCBStkPtr中
OS_STK *pbos, //任务堆栈栈底指针 保存在OSTCBStkBottom中
INT16U id, //任务的标识符,保存在OSTCBId中
INT32U stk_size, //任务堆栈的长度,保存在OSTCBStkSize中
void *pext, //任务控制快扩展指针,保存在OSTCBExtPtr中
INT16U opt)//任务控制块的选择项,保存在 OSTCBOpt中
该函数的任务主要有
1).为被创建任务从空任务控制块链表中获取一个任务控制块
2).把任务的属性填入获取的任务控制块中
3).把这个任务控制块链入到任务控制块链表中