四.任务控制块及其链表
UCOSII用来记录任务的堆栈指针、任务的当前状态、任务的优先级等一些与任务滚哪里相关的属性的表就叫做任务控制块。任务控制块相当于任务的身份*,系统就是通过任务控制块来感知和管理任务的,没有任务控制块的任务不能被系统承认和管理。
//任务控制块初始化函数
INT8U OS_TCBInit (INT8U prio,
OS_STK *ptos,
OS_STK *pbos,
INT16U id,
INT32U stk_size,
void *pext,
INT16U opt)
{
...............................
}
//在任务创建函数中对任务控制块进行初始化
INT8U OSTaskCreate (void (*task)(void *p_arg),
void *p_arg,
OS_STK *ptos,
INT8U prio)
{
..................................
err = OS_TCBInit(prio, psp, (OS_STK *)0, 0u, 0u, (void *)0, 0u);//对任务控制块进行初始化
..................................
}
任务控制块链表:
UCOSII在任务控制块的管理上需要两条链表,一条空任务块链表(其中所有任务控制块还未分配给任务)和一条任务块链表(其中所有任务控制块已分配给任务)。具体做法是:系统在调用函数OSInit()对UCOSII系统进行初始化时,就先在RAM中建立一个OS_TCB结构类型的数组OSTCBTb1[],然后把各个元素链接成一个如下图所示的链接表,从而形成一个空任务块链表。
UCOSII允许用户使用函数OSTaskDel()来删除一个任务。删除一个任务实质上就是把该任务从任务控制链表(TCB)中删掉,并把它归还给空任务控制块链表。
|