1、任务控制器块是什么:
UC/OS-II用来记录任务的堆栈指针、任务的当前状态、任务的优先级等这些与任务管理相关的属性的表
——就是任务控制块;
UC/OS-II通过把系统所有任务的控制块链接为两条链表,并且是通过这两条链表来管理各个任务的;
2、任务控制块链表
为了便于后面需要,UC/OS-II在初始化时也要按照配置文件所设定的任务数(在OS_CFG.H中设定)事先定义一批空白任务控制块,如此,当你需要创建一个任务时肯定需要一个任务控制块,那么我直接把手中事先创建好的空白的一个给你,让你填上任务的属性即可使用。
如前所述,UC/OS-II需要两条链表来管理任务:
(1)空任务块链表(所谓空:就是所有任务控制块都还没分配给任务);
(2)任务块链表(其中所有任务都已经分配给任务);
——为了更快的访问任务控制块,UC/OS-II在uCOS_H.h 文件中,定义了一个数组OSPrioTbl[],数据类型为OS_TCB,这个数组的一生使命就是以任务的优先级别为顺序存放了指向各个任务控制块的指针,如此,便可以通过这个数组来找到一个任务的指针了。
——明显,当前任务控制块是访问频率最高的,因而,UC/OS-II 专门定义了一个变量OSTCBur来存放当前任务控制块指针。
3、任务控制块的初始化
当用户调用OSTaskCreate()创建一个任务时,这个函数本身自己会调用系统函数OSTCBInit()来为任务控制块进行初始化。
该初始化函数主要配置七个数据:
4、任务就绪表
在当前任务执行结束后对所就绪的任务进行调度,选择优先级最高的就绪好的任务执行。明显,为了方便有效地运行,系统需要一个表,登记所有已经就绪的任务。这个表就叫任务就绪表。实际上这个表是一个数组,类型INT8U ,名字叫做OSRdyTbl[],这数组的一个元素是一个字节,8位,每一位以1或0 来表示任务的就绪状态(1则为就绪,0为不就绪),可以表达8个任务的就绪状态。为了管理更多的任务,UC/OS-II还定义了一个数据类型为INT8U的变量OSRdyGrp,并使该变量的每一位对应了上述的OSRdyTbl[]的一个元素,如此,一OSRdyGrp可以管理8*8=64个任务。
由上可知,对就绪任务表的操作主要有三个:
(1)登记:在就绪表中将该任务的对应位置置1;
(2)注销:在就绪表中将该任务的对应位置置0;
(3)查找最高优先级的就绪任务;
5、任务挂起与恢复
(1)任务挂起:通过函数OSTaskSupend() ;
(2)任务恢复:通过函数OSTaskResume() ;
在任务被挂起后,只能通过恢复函数OSTaskResume()使其恢复为就绪状态。
用户593939 2013-1-18 23:09
用户424277 2012-10-11 15:01