首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

任务控制块及其链表

任务控制块及其链表

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.把这个任务控制块链入到任务控制块链表
继承事业,薪火相传
返回列表