一种嵌入式实时操作系统中任务多次激活的方法

文档序号:6338207阅读:369来源:国知局
专利名称:一种嵌入式实时操作系统中任务多次激活的方法
一种嵌入式实时操作系统中任务多次激活的方法技术领域
本发明属于汽车电子控制技术领域,更为具体地讲,涉及一种嵌入式实时操作系 统中任务多次激活的方法。
背景技术
1、OSEK标准中关于任务多次激活的要求
在汽车电子控制技术领域,某些汽车电子的控制器系统需要使用到嵌入式实时操 作系统,以提供多任务的应用软件运行环境。0SEK/VDX提出了有关汽车电子控制领域的嵌 入式实时操作系统规范,OSEK 艮口 Open Systemsand the Corresponding Interfaces For Automotive Electronics,是德国汽车工业界1993年联合推出的汽车电子的开放式系统 及接口软件规范,而VDX即Vehicle Distributed Executive,是法国汽车工业界提出的与 OSEK相似的规范,1994年和OSEK规范合并,从而形成0SEK/VDX规范体系。


图1是基本任务的状态转换图。
在0SEK/VDX规范的 Operating System Specification Version2. 2. 2, July 5th, 2004中,提出了在一个多任务的应用系统中,基本任务(以下简称任务)可以被多次激活的 概念。其具体含义是
(1)、在一个系统中的任务可以被多次激活。任务的状态有运行态、就绪态和挂起 态三种,如图1所示。
有关任务状态之间转换的原因如表1所示
就绪态运行态挂起态就绪态操作系统进行调度运行态被抢占终止挂起态激活
表 1
表1中,处于运行态的任务是正在CPU中运行的任务,处于就绪态的任务正在等待 CPU资源的分配,而处于挂起态的任务则不能参与CPU资源的分配。
(2)、任务从挂起态转变为就绪态的过程称为激活。激活任务是使用操作系统所提 供的ActivateTask或ChainTask功能调用完成的。
(3)、在配置允许的情况下,任务可以被多次激活。所谓多次激活,就是指当系统中 的某个任务已经处于被激活的状态之后,任务已经处于运行态或就绪态,被再次激活的情 况。这相当于该任务的代码在系统中又增加了一个可运行的实例,或者说系统中同时存在 多个具有相同功能的就绪任务对象,或称为任务实例。
(3)、只要未达到所配置的最大激活次数,新的激活行为是可行的。新激活的任务 实例需要在其配置的原始优先级队列中排队,并按激活的先后顺序,从队列尾部开始排队。
0)、新激活的任务实例在其第一次运行的时候,操作系统需要保证从其代码的第 一条指令开始执行。
(5)、任务的多个实例之间不是完全独立的,只有当其前面的实例运行完成(被终 止)后,后面的实例才能运行,即新的激活行为不会创建新的执行线程。
2、现有嵌入式实时操作系统任务管理机制的问题
现有的嵌入式实时操作系统通常采用就绪任务队列来对处于运行态、就绪态的任 务进行管理。就绪任务队列用于管理系统中的就绪任务,包括系统中唯一的运行任务,对相 同优先级上的就绪任务进行排队。系统中所有的就绪任务队列形成数组,数组的长度等于 系统的最大优先级数,每个数组元素就是一个就绪任务队列,并且对应一个优先级。
图2是现有嵌入式实时操作系统的就绪任务队列结构示意图
如图2所示,假定某个系统中一共有n+1个优先级,则就绪任务队列数组一共就有 n+1个元素,编号从0 n,编号同时也代表了任务的优先级。比如在0号队列中排队的所有 任务的优先级都是0,在1号队列中排队的所有任务的优先级都是1,以此类推。每个就绪 任务队列的形式是一个单向链表,比如图2中的TCBtltl TCBcix形成一个单向链表,TCB20 IX^y形成一个单向链表,等等。TCB是任务控制块(Task Control Block)的缩写,其下标, 如00 Ox、20 2y、n0 nz等是对TCB的二维编号,两个维度分别代表该TCB所处的优先 级和它在队列中的序号,比如TCBw表示任务的优先级为0,它在队列中的序号为0 ;而TCB” 表示任务的优先级为2,它在队列中的序号为y。由于各个优先级的就绪任务数量不一定相 同,因此每个队列的最大序号也不一定相同。比如图2所示的系统,编号即优先级为0的队 列中共有x+1个任务在排队,其最大序号为χ ;编号即优先级为2的队列中共有y+Ι个任务 在排队,其最大序号为1。每个队列有一个头指针和尾指针,分别指向队列的第一个任务控 制块和最后一个任务控制块。比如在编号为2的队列中,头指针Head2指向TCB2tl,尾指针 Tail2 指向 TC&y。
对就绪任务队列的操作包括加入就绪任务、获取最早的就绪任务、取下就绪任务 等。表2是任务状态变化矩阵,任务在就绪队列中放置或移动时的位置遵循下面的原则
插入新就绪的任务时,从队列尾部插入,因此就绪任务队列的头指针指向该优 先级中最早就绪的任务,尾指针指向该优先级中最迟就绪的任务。
操作系统进行任务调度时,需要获取当前优先级最高的就绪任务,这个任务一 定是某个优先级的就绪任务队列表头的任务。
当前运行任务优先级改变时,如运行任务释放资源时其优先级会降低,它被插 入到改变之后的优先级的任务队列的头部。
当任务状态发生变化时,任务在队列中的位置会发生变化,取下当前运行任务 或就绪任务时,一定是队列头部的任务。任务只有从运行态才能变为挂起态,因此要挂起 的任务一定是队列上的第一个任务,所以采用单向链表就可以满足就绪任务队列的操作要 求。
权利要求
1.一种嵌入式实时操作系统中任务多次激活的方法,其特征在于,包括以下步骤(1)、建立一个就绪任务队列数组用于管理就绪任务对相同优先级上的就绪任务进行排队,形成与优先级数量相同的多个就绪任务队列; 所有的就绪任务队列形成数组,数组的长度等于优先级数,每个数组元素为一个就绪任务 队列,并且对应一个优先级;就绪任务队列中的就绪任务用就绪块指示,每个就绪块中有两个元素,即指向下一个 就绪块的指针和指向对应任务控制块的指针,如果就绪块位于就绪任务队列最后一个位 置,则其指向下一个就绪块的指针为空;每个就绪任务队列有一个头指针和尾指针,分别指向就绪任务队列的第一个就绪块和 最后一个就绪块,头指针用于对应优先级的任务执行时,查找第一个的任务,尾指针用于新 的就绪块的插入时,查找尾部就绪块,如果就绪任务队列中没有就绪任务,则头指针和尾指 针为空;(2)、对任务控制块的数据结构进行了改进·2.1、任务控制块中包括以下元素 任务状态任务状态用于记录任务状态,其取值为运行、就绪、挂起和就绪及第一次运行; 当任务的状态值为就绪时,任务是通过恢复其上下文来运行的;当任务的状态为就绪 及第一次运行时,操作系统从任务代码入口地址开始执行; 眷任务当前激活次数任务当前激活次数用于记录任务当前的激活次数,每当任务增加一个激活实例,该元 素的值加1 ;每当任务的一个实例运行结束,该元素的值减1 ;当任务当前激活次数被减到0 时,该任务的状态变为挂起态; 眷任务当前优先级任务当前优先级,用于记录任务当前的优先级,其值代表了任务最早可能运行的那个 实例的优先级; 任务配置信息表指针任务配置信息表指针指向任务配置信息结构体,通过它可以获取任务的静态配置的信息; 任务上下文指针任务上下文指针指向操作系统存储的任务上下文信息,通过它可以获取任务的上下文 信息,当任务的状态值为就绪时,该任务是通过恢复其上下文信息来运行的;2. 2、任务配置信息结构体中的信息都是通过用户静态配置,在任务的运行过程中不改 变的,其相关元素如下 任务代码入口地址通过任务代码入口地址可以获取任务的第一条功能代码,当任务的状态为就绪及第一 次运行时,操作系统是从任务代码的入口地址处执行的; 任务的基本优先级每当任务被新激活一个实例时,该实例的就绪块是根据这个优先级被插入到相应的队 列尾部的;·3.任务的最大激活次数任务的最大激活次数记录该任务所允许的最大激活次数,每当试图激活一个任务时, 如果其当前激活次数小于配置的最大激活次数,则任务可以被成功激活,即增加一个可运 行任务实例,否则不能被激活;(3)、任务多次激活的操作.3. 1、增加任务的一个激活实例a、对该任务的任务控制块进行以下操作1)、首先判断任务控制块中的任务当前激活次数是否已经等于任务配置信息结构体中 的任务的最大激活次数;2)、如果任务当前激活次数等于任务的最大激活次数,不能再增加一个激活实例,程序 返回;3)、如果任务当前激活次数小于任务的最大激活次数,则获取一个空闲的就绪块,并设 置其指向对应任务控制块的指针指向任务控制块,将新的就绪块插入到任务的原始优先级 所对应的就绪任务队列的尾部该就绪任务队列原最后的就绪块的指向下一个就绪块的指 针指向新插入的就绪块,该就绪任务队列的尾指针指向新插入的就绪块;任务当前激活次 数加1;如果任务当前状态为挂起态,则修改任务控制块中任务状态为就绪及第一次运行;b、如果操作系统当前运行任务的优先级比新激活任务的优先级低,并且系统满足调度 程序的执行条件,则操作系统进行任务调度;如果调度的结果是新激活的任务运行,则通过 当前运行任务的任务控制块中的任务上下文指针,保存当前运行任务的上下文,并修改激 活任务的任务控制块的任务状态为就绪,跳转到激活任务的任务控制块的任务代码入口地 址处,开始激活任务的运行;.3. 2、结束任务的当前运行实例1)、将当前运行实例的就绪块归还给系统;2)、对任务控制块的任务当前激活次数减1;3)、判断任务当前激活次数的值是否为0,如果不为0,则将任务状态设置为就绪及第 一次运行;如果任务当前激活次数为0,则将任务状态置为挂起态;4)、调整任务当前优先级为任务配置信息结构体中的任务的基本优先级;5)如果系统满足调度程序的执行条件,则操作系统进行任务调度;对于新调度的需要 运行的任务就绪块,查看就绪块所指向的任务控制块的任务状态,如果为就绪,则直接通过 恢复其上下文来恢复任务的运行,如果为就绪和第一次运行,则修改任务状态为就绪,跳转 到任务代码入口地址处,开始任务的运行。
全文摘要
本发明公开了一种嵌入式实时操作系统中任务多次激活的方法,通过使用就绪块,每个就绪块中有两个元素,即指向下一个就绪块的指针(pointerToNextRB)和指向对应任务控制块的指针(pointerToTCB)。同时,对传统的任务控制块的数据结构进行了改进,在任务控制块中增加了记录任务当前激活次数的元素。这样,在就绪任务队列中排队的结构是就绪块,它只有两个元素,它对存储空间的占用少于直接用任务控制块排队的空间;系统中每一个任务始终只有一个控制块存在,只有在其前一个实例运行完成或被终止后,其后面的实例才能运行,即一个任务的多个实例之间不完全独立,任务的多次激活的行为不会创建新的线程。
文档编号G06F9/46GK102043668SQ20101058244
公开日2011年5月4日 申请日期2010年12月10日 优先权日2010年12月10日
发明者丁旭阳, 李允 , 陈丽蓉 申请人:成电汽车电子产业园(昆山)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1