任务控制块 TCB
1.任务控制块是被uC/OS-III用于维护任务的一个结构体。每个任务都必须有自己的 TCB。 uC/OS-III 在 RAM 中分配 TCB。当调用uC/OS-III提供的与任务相关的函数(以OSTask???()形式命名)时,任务的TCB地址需会被提供给该函数。 TCB的结构定义于OS.H中,如列表 5-3所示(在 OS.H中代码是有注释的)。 TCB中的一些变量可以根据具体应用进行裁剪。
2.用户程序不应该访问这些变量(尤其不能更改它们)。换句话说,TCB中的变量只能被uC/OS-III访问。
.StrPtr:这个变量中包含了指向当前任务堆栈的指针。
.ExtPtr:这个变量中定义了指向用户用于扩展TCB(如果需要)
的指针。
.StkLimitPtr:这个变量中保存了堆栈增长时的限制地址,它是在调用OSTaskCreate()时传递的参数”stk_limit”。 有些处理器有硬件寄存器可以自动地检测并确保堆栈不发生溢出,如果处理器没有这些硬件设施, 堆栈检测可以用软件模拟。 然而, 软件模拟不如硬件可靠。 如果这个功能没有被用到,那么在调用 OSTaskCreate()时可以设置”stk_limit”为0。详见5-3。
.NextPtr和.PrevPtr:这些指针用于就绪队列中双向链表。双向链表可以让TCB在列表中能更快地被插入或者删除。
.TickNextPtr和.TickPrevPtr:这些指针用于挂起队列中双向链表。双向链表可以让TCB在列表中能更快地被插入或者删除。
.TickSpokePtr:这个指针用于表示时基轮转的轮辐。
.NamePtr:这个指针存放了任务的名字。有名字的任务非常有助于调试,因为这样能友好地显示每个任务对应的 TCB地址。该名字的字符串存于ROM(如果以常量命名)或者RAM。
.StkBasePtr:{任务堆栈是由高地址向低地址生长}这个指针指向了任务堆栈的基地址。
.TaskEntryAddr:这个变量中包含了任务代码的入口地址,正如前面提到的,任务
用如下方式申明,voidMyTask(void*p_arg);
.TaskEntryAtg:这个变量是当任务第一次运行时传递给任务的参数。正如上面提
到的,这个变量值会传给p_arg。
.PendDataTblPtr:uC/OS-III允许任务同时挂起多个信号量和消息队列。 这个指针指
向了包含这些被挂起对象的表。
.PendDataEntries:这个变量与.PendDataTblPtr一起工作,表示在同一时刻某任务等待的事件数。
.TS:这个变量存储了任务所等待事件出现的时间戳,当任务恢复执行时,时间戳会被返回给任务。
.MsgPtr:当有消息发送给任务时,这个变量保存了该消息的地址。
.MsgSize:当有消息发送给任务时,这个变量保存了消息的大小(以字节为单位)。这个变量仅出现在TCB中,如果消息队列服务(在OS_CFG.H中设置OS_CFG_Q_EN为1)或者任务队列服务(在OS_CFG.H中设置OS_CFG_TASK_Q_EN为1)编译时被使能的话。
.MsgQ:uC/OS-III允许任务或ISR直接发送消息给任务。
.MsgQPendTime:保存了消息从创建到被接收所需的时间。
.MsgQPendTimeMax:这个变量中保存了消息到达所用时间的最大值,它是.MsgQPendTime 的峰值。这个值可以被OSStatReset()复位。
.FlagsPend:当任务等待事件标志组,这个变量保存了任务所等待的标志位。
.FlagsOpt:当任务等待事件标志组,这个变量保存了任务所等待事件标志组
的类型。
.FlagsRdy:这个变量保存了已经被提交的事件标志组 ( 任务所等待的), 换句
话说, 它让任务知道是哪个事件标志组让任务就绪的。
.RegTbl[]:这个数组中包含了任务的”寄存器”, 不同于CPU寄存器。 任务寄
存器用于存储任务ID、软件错误等。
.SemCtr:这个变量保存了信号量的计数值。每个任务都有其的内建信号量。
ISR或其它任务可以通过信号量标记这个任务。
.SemPendTime:中保存着信号量从产生到被接收所用的时间。
.SemPendTimeMax:保存了信号量从产生到被接收所用时间的最大值。
.SuspendCtr:这个变量被OSTaskSuspend()和OSTaskResume()使用,用于记录任务被停止的次数。
.StkSize:这个变量中保存了堆栈的大小( 以CPU_STK为数据类型)。
.StkUsed和.StkFree:在运行时, uC/OS-III可以计算出堆栈的实际使用量和空余量, 这是通过调用OSTaskStkChk()实现的。堆栈使用量计算是假定堆栈在创建时被初始化的情况下的。
.Opt:当任务创建时传递给OSTaskCreate()的参数。它定义任务的附加功能。
.TickCtrPrev:当OSTimeDly()选择OS_OPT_TIME_PERIODIC形式时,该变量
为OSTickCtr的初值。
.TickCtrMatch:当任务被延时一段时间,或者因等待事件而设置时限。任务就会
被放到挂起队列中。
.TickRemain:这个变量中保存了任务到时的剩余时间值,它在OS_TickTask()
中被计算。调试时这个变量是很有用的。
.TimeQuanta和.TimeQuantaCtr:这两个变量用于时间切片,当多个就绪任务有相同的优先级时, .TimeQuanta决定了时间片长度(多少个时基)。 .TimeQuantaCtr中保存了当前时间片的剩余长度。在任务切换开始时将.TimeQuanta的值载入.TimeQuantaCtr。
.CPUUsage:保存了CPU的使用率( 0到100%), 它是被OS_StatTask()计算出
来的。
.CtxSwCtr:保存了该任务被执行的次数。
.CyclesDelta:这上下文切换时被计算,它保存了当前时间戳与CyclesStart的差
值。调试时可以通过它知道该任务的执行时间。
.CyclesStart:这个变量用于测量任务的执行时间, .CyclesStart在上下文切换时
被更新。它保存了任务切换时的时间戳(通过调用OS_TS_GET()获得)。
.CyclesTotal:这个变量是CyclesDelta的累加, 所以它包含了该任务被执行的总
时间。 这个变量被定义为64位防止溢出。
.IntDisTimeMax:这个变量中保存了该任务关中断的最大时间。
.SchedLockTimeMax:保存了该任务锁调度器的最大时间。
.PendOn:该变量的值取决于任务因何被挂起。
.PendStatus:这个变量保存了任务被挂起后的状态,包括4种状态。
.TaskState:这个变量保存了任务当前的状态,包括8种状态。
.Prio:它保存了任务的优先级, 该值介于0到OS_CFG_PRIO_MAX-1
之间。事实上,空闲任务需独占优先级OS_CFG_PRIO_MAX-1。
.DbgNextPtr:该变量是一个指针,在双向TCB列表中,它指向下一个TCB。通
过OSTaskCreate()函数uC/OS-III将TCB放入该列表中。
.DbgPrevPtr:该变量是一个指针,在双向TCB列表中,它指向上一个TCB。
.DbgNamePtr:该变量是一个指针,当任务在等待信号量、事件标志组、 mutex、
消息队列时,它指向目标对象的名字。
uC/OS-III-6.2-uC/OS-III内部任务管理(TCB)
最新推荐文章于 2022-10-04 22:29:38 发布