标题:
任务控制块及其链表
[打印本页]
作者:
yuyang911220
时间:
2016-8-8 09:30
标题:
任务控制块及其链表
ucos用来记录任务的堆栈指针,任务的当前状态,任务的优先级等一些与任务管理有关的属性的表就叫做任务控制块。 任务控制块相当于一个任务的身份证,系统就是通过任务控制块来感知管理任务,没有任务控制块的任务不能被系统承认和管理。
ucos把所有任务控制块链接为两条链表,并通过他们管理各个任务
1任务控制块
任务控制块是一个结构类型的数据,当用户应用程序调用OSTaskCreate()函数创建一个用户任务时,该函数就会对任务控制块中的所有成员赋予与任务相关的数据,并驻留在RAM中 见P52
2任务控制块链表
众所周知,人们在管理某种证件时,总是要按照预测的数目先印制一定数量的空白证,以后当有人申请该证件时,就可以及时拿到一个空白证并填上该申请人的信息,从而快速形成一个有效证件,其目的就是提高办事效率
同样,ucos在初始化时也要按照
配置文件所设定的任务数
事先定义一批空白的任务控制块,这样当创建一个任务需要一个任务控制块时,只要拿上一个空白块填上任务属性即可。也就是说,在任务管理上,ucos需要两条链表,一条空任务块链表(其中所有任务控制块还未分配给任务)和一条任务块链表(其中所有的任务控制块已经分配给任务)。具体做法为:系统在调用函数OSInit()对ucos进行初始化时,就现在RAM中建立一个OS_TCB结构类型的数组OSTCBTbl[],然后把各个元素连接成链表,从而形成一个空的任务块链表。
ucos 初始化时建立空任务链表的元素一共是OS_MAX_TASKS + OS_N_SYS_TASKS个,其中定义在文件OS_CFH.H中的常数OS_MAX_TASKS指明了用户任务的最大数目。而定义在文件UCOS_II.H中的常数OS_N_SYS_TASKS指明了系统任务的数目(在此图中是2,一个空闲任务,一个统计任务)。
以后每当应用程序调用系统函数OSTaskCreate()或者OSTaskCreateExt()创建一个任务时,系统就会将空任务控制块链表头指针OSTCBFreeList指向的任务控制块分配给该任务。再给任务控制块中的各成员赋值以后,就按任务控制块链表的头指针OSTCBList将其加入到任务控制块链表中
下图是在上图所示空任务控制块链表的基础上,应用程序创建了两个用户任务并使用了两个系统任务(空闲任务和统计任务)的情况时,空任务控制块链表和任务控制块链表的结构
操作系统设计过程中的好思想
为了加快对任务控制块的访问速度,除了任务控制块链表被创建成双向链表外,ucos在UCOS_II.H文件中还定义了一个数据类型为OS_TCB *的数组OSPrioTbl[]。该数组以任务
的优先级为顺序
在个元素中存放了各个任务控制块的指针
,这样在访问一个任务的任务控制块时,就可以不必遍历任务控制块链表了。
为了方便起见,人们把正在占有CPU而处于运行状态的任务所属的控制块叫做当前任务控制块。显然,当前任务控制块是ucos访问频度最高的控制块,为了方便,
ucos还专门定义了一个变量OSTCBCur来存放当前任务控制块指针。
上图是假设正在运行的任务优先级别是3时变量OSTCBCur的指向。
ucos还允许用户应用程序使用函数OSTaskDel()删除一个任务。删除一个任务,实质上就是把该任务从任务控制块链表中删除掉,并把它归还给空任务块控制链表。这样ucos对这个没有任务控制块的任务就不再理会了,因为与这个任务对应的任务控制块已经被吊销了。可见,任务的任务控制块就如同人的身份证一样重要。
没有身份证的人是黑户,公安局不理
3任务堆栈的初始化
给用户、任务分配任务控制块及对其进行初始化也是操作系统的责任。当应用程序调用函数OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。
该函数的任务:
1.为被创建任务从空任务控制块链表中获取一个任务控制块
2.用任务的属性对任务控制块各个成员进行赋值。
3.把这个任务控制块链入到任务控制块链表
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0