CN102043668B - 一种嵌入式实时操作***中任务多次激活的方法 - Google Patents
一种嵌入式实时操作***中任务多次激活的方法 Download PDFInfo
- Publication number
- CN102043668B CN102043668B CN 201010582446 CN201010582446A CN102043668B CN 102043668 B CN102043668 B CN 102043668B CN 201010582446 CN201010582446 CN 201010582446 CN 201010582446 A CN201010582446 A CN 201010582446A CN 102043668 B CN102043668 B CN 102043668B
- Authority
- CN
- China
- Prior art keywords
- task
- ready
- tcb
- priority
- control block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本发明公开了一种嵌入式实时操作***中任务多次激活的方法,通过使用就绪块,每个就绪块中有两个元素,即指向下一个就绪块的指针(pointerToNextRB)和指向对应任务控制块的指针(pointerToTCB)。同时,对传统的任务控制块的数据结构进行了改进,在任务控制块中增加了记录任务当前激活次数的元素。这样,在就绪任务队列中排队的结构是就绪块,它只有两个元素,它对存储空间的占用少于直接用任务控制块排队的空间;***中每一个任务始终只有一个控制块存在,只有在其前一个实例运行完成或被终止后,其后面的实例才能运行,即一个任务的多个实例之间不完全独立,任务的多次激活的行为不会创建新的线程。
Description
技术领域
本发明属于汽车电子控制技术领域,更为具体地讲,涉及一种嵌入式实时操作***中任务多次激活的方法。
背景技术
1、OSEK标准中关于任务多次激活的要求
在汽车电子控制技术领域,某些汽车电子的控制器***需要使用到嵌入式实时操作***,以提供多任务的应用软件运行环境。OSEK/VDX提出了有关汽车电子控制领域的嵌入式实时操作***规范,OSEK即Open Systemsand theCorresponding Interfaces For Automotive Electronics,是德国汽车工业界1993年联合推出的汽车电子的开放式***及接口软件规范,而VDX即VehicleDistributed Executive,是法国汽车工业界提出的与OSEK相似的规范,1994年和OSEK规范合并,从而形成OSEK/VDX规范体系。
图1是基本任务的状态转换图。
在OSEK/VDX规范的Operating System Specification Version2.2.2,July 5th,2004中,提出了在一个多任务的应用***中,基本任务(以下简称任务)可以被多次激活的概念。其具体含义是:
(1)、在一个***中的任务可以被多次激活。任务的状态有运行态、就绪态和挂起态三种,如图1所示。
有关任务状态之间转换的原因如表1所示:
就绪态 | 运行态 | 挂起态 | |
就绪态 | - | 操作***进行调度 | - |
运行态 | 被抢占 | - | 终止 |
挂起态 | 激活 | - | - |
表1
表1中,处于运行态的任务是正在CPU中运行的任务,处于就绪态的任务正在等待CPU资源的分配,而处于挂起态的任务则不能参与CPU资源的分配。
(2)、任务从挂起态转变为就绪态的过程称为激活。激活任务是使用操作***所提供的ActivateTask或ChainTask功能调用完成的。
(3)、在配置允许的情况下,任务可以被多次激活。所谓多次激活,就是指当***中的某个任务已经处于被激活的状态之后,任务已经处于运行态或就绪态,被再次激活的情况。这相当于该任务的代码在***中又增加了一个可运行的实例,或者说***中同时存在多个具有相同功能的就绪任务对象,或称为任务实例。
(3)、只要未达到所配置的最大激活次数,新的激活行为是可行的。新激活的任务实例需要在其配置的原始优先级队列中排队,并按激活的先后顺序,从队列尾部开始排队。
(4)、新激活的任务实例在其第一次运行的时候,操作***需要保证从其代码的第一条指令开始执行。
(5)、任务的多个实例之间不是完全独立的,只有当其前面的实例运行完成(被终止)后,后面的实例才能运行,即新的激活行为不会创建新的执行线程。
2、现有嵌入式实时操作***任务管理机制的问题
现有的嵌入式实时操作***通常采用就绪任务队列来对处于运行态、就绪态的任务进行管理。就绪任务队列用于管理***中的就绪任务,包括***中唯一的运行任务,对相同优先级上的就绪任务进行排队。***中所有的就绪任务队列形成数组,数组的长度等于***的最大优先级数,每个数组元素就是一个就绪任务队列,并且对应一个优先级。
图2是现有嵌入式实时操作***的就绪任务队列结构示意图
如图2所示,假定某个***中一共有n+1个优先级,则就绪任务队列数组一共就有n+1个元素,编号从0~n,编号同时也代表了任务的优先级。比如在0号队列中排队的所有任务的优先级都是0,在1号队列中排队的所有任务的优先级都是1,以此类推。每个就绪任务队列的形式是一个单向链表,比如图2中的TCB00~TCB0X形成一个单向链表,TCB20~TCB2y形成一个单向链表,等等。TCB是任务控制块(Task Control Block)的缩写,其下标,如00~0x、20~2y、n0~nz等是对TCB的二维编号,两个维度分别代表该TCB所处的优先级和它在队列中的序号,比如TCB00表示任务的优先级为0,它在队列中的序号为0;而TCB2y表示任务的优先级为2,它在队列中的序号为y。由于各个优先级的就绪任务数量不一定相同,因此每个队列的最大序号也不一定相同。比如图2所示的***,编号即优先级为0的队列中共有x+1个任务在排队,其最大序号为x;编号即优先级为2的队列中共有y+1个任务在排队,其最大序号为y。每个队列有一个头指针和尾指针,分别指向队列的第一个任务控制块和最后一个任务控制块。比如在编号为2的队列中,头指针Head2指向TCB20,尾指针Tail2指向TCB2y。
对就绪任务队列的操作包括加入就绪任务、获取最早的就绪任务、取下就绪任务等。表2是任务状态变化矩阵,任务在就绪队列中放置或移动时的位置遵循下面的原则:
●***新就绪的任务时,从队列尾部***,因此就绪任务队列的头指针指向该优先级中最早就绪的任务,尾指针指向该优先级中最迟就绪的任务。
●操作***进行任务调度时,需要获取当前优先级最高的就绪任务,这个任务一定是某个优先级的就绪任务队列表头的任务。
●当前运行任务优先级改变时,如运行任务释放资源时其优先级会降低,它被***到改变之后的优先级的任务队列的头部。
●当任务状态发生变化时,任务在队列中的位置会发生变化,取下当前运行任务或就绪任务时,一定是队列头部的任务。任务只有从运行态才能变为挂起态,因此要挂起的任务一定是队列上的第一个任务,所以采用单向链表就可以满足就绪任务队列的操作要求。
表2
采用现有的嵌入式实时操作***任务管理机制,不能满足OSEK/VDX规范对于任务多次激活的功能要求,因为它们在创建新的任务实例时,都为这个任务实例分配一个任务控制块,这会产生2方面的问题:
a)、任务控制块包含了任务运行的所有信息,存储空间占用比较大;
b)、每一个任务控制块代表了一个执行线程,如果为每个新的任务分配一个控制块,则它们之间是独立的,这不符合前面所分析的OSEK/VDX规范的要求:任务的多个实例之间不是完全独立的,只有当其前面的实例运行完成(被终止)后,后面的实例才能运行;新的激活行为不会创建新执行线程。
发明内容
本发明的目的在于克服现有技术的不足,提供一种嵌入式实时操作***中,任务的多个实例之间不是完全独立的、且新的激活行为不会创建新的执行线程的任务多次激活的方法,以解决传统嵌入式实时操作***任务管理机制的问题,满足OSEK/VDX规范对于汽车电子嵌入式操作***的功能要求。
为实现上述目的,本发明嵌入式实时操作***中任务多次激活的方法,其特征在于,包括以下步骤:
(1)、建立一个就绪任务队列数组用于管理就绪任务
对相同优先级上的就绪任务进行排队,形成与优先级数量相同的多个就绪任务队列;所有的就绪任务队列形成数组,数组的长度等于优先级数,每个数组元素为一个就绪任务队列,并且对应一个优先级;
就绪任务队列中的就绪任务用就绪块指示,每个就绪块中有两个元素,即指同下一个就绪块的指针和指向对应任务控制块的指针,如果就绪块位于就绪任务队列最后一个位置,则其指向下一个就绪块的指针为空;
每个就绪任务队列有一个头指针和尾指针,分别指向就绪任务队列的第一个就绪块和最后一个就绪块,头指针用于对应优先级的任务执行时,查找第一个的任务,尾指针用于新的就绪块的***时,查找尾部就绪块,如果就绪任务队列中没有就绪任务,则头指针和尾指针为空;
(2)、对任务控制块的数据结构进行了改进
2.1、任务控制块中包括以下元素:
●任务状态
任务状态用于记录任务状态,其取值为:运行、就绪、挂起和就绪及第一次运行;
当任务的状态值为就绪时,任务是通过恢复其上下文来运行的;当任务的状态为就绪及第一次运行时,操作***从任务代码入口地址开始执行;
●任务当前激活次数
任务当前激活次数用于记录任务当前的激活次数,每当任务增加一个激活实例,该元素的值加1;每当任务的一个实例运行结束,该元素的值减1;当任务当前激活次数被减到0时,该任务的状态变为挂起态;
●任务当前优先级
任务当前优先级,用于记录任务当前的优先级,其值代表了任务最早可能运行的那个实例的优先级;
●任务配置信息表指针
任务配置信息表指针指向任务配置信息结构体,通过它可以获取任务的静态配置的信息;
●任务上下文指针
任务上下文指针指向操作***存储的任务上下文信息,通过它可以获取任务的上下文信息,当任务的状态值为就绪时,该任务是通过恢复其上下文信息来运行的;
2.2、任务配置信息结构体中的信息都是通过用户静态配置,在任务的运行过程中不改变的,其相关元素如下:
●任务代码入口地址
通过任务代码入口地址可以获取任务的第一条功能代码,当任务的状态为就绪及第一次运行时,操作***是从任务代码的入口地址处执行的;
●任务的基本优先级
每当任务被新激活一个实例时,该实例的就绪块是根据这个优先级被***到相应的队列尾部的;
●任务的最大激活次数
任务的最大激活次数记录该任务所允许的最大激活次数,每当试图激活一个任务时,如果其当前激活次数小于配置的最大激活次数,则任务可以被成功激活,即增加一个可运行任务实例,否则不能被激活;
(3)、任务多次激活的操作
3.1、增加任务的一个激活实例
a、对该任务的任务控制块进行以下操作:
1)、首先判断任务控制块中的任务当前激活次数是否已经等于任务配置信息结构体中的任务的最大激活次数;
2)、如果任务当前激活次数等于任务的最大激活次数,不能再增加一个激活实例,程序返回;
3)、如果任务当前激活次数小于任务的最大激活次数,则获取一个空闲的就绪块,并设置其指向对应任务控制块的指针指向任务控制块,将新的就绪块***到任务的原始优先级所对应的就绪任务队列的尾部:将该就绪任务队列原最后的就绪块的指向下一个就绪块的指针指向新***的就绪块,该就绪任务队列的尾指针指向新***的就绪块;将任务当前激活次数加1;
如果任务当前状态为挂起态,则修改任务控制块中任务状态为就绪及第一次运行;
b、如果操作***当前运行任务的优先级比新激活任务的优先级低,并且***满足调度程序的执行条件,则操作***进行任务调度;如果调度的结果是新激活的任务运行,则通过当前运行任务的任务控制块中的任务上下文指针,保存当前运行任务的上下文,并修改激活任务的状态为就绪,跳转到激活任务的代码入口地址处,开始激活任务的运行;
3.2、结束任务的当前运行实例
1)、将当前运行实例的就绪块归还给***;
2)、对任务控制块的任务当前激活次数减1;
3)、判断任务当前激活次数的值是否为0,如果不为0,则将任务状态设置为就绪及第一次运行;如果任务当前激活次数为0,则将任务状态置为挂起态;
4)调整任务当前优先级为任务配置信息结构体中的任务的基本优先级;
5)、如果***满足调度程序的执行条件,则操作***进行任务调度;对于新调度的需要运行的任务就绪块,查看就绪块所指向的任务控制块的任务状态,如果为就绪,则直接通过恢复其上下文来恢复任务的运行,如果为就绪和第一次运行,则修改任务状态为就绪,跳转到任务代码入口地址处,开始任务的运行。
本发明的发明目的是这样实现的:
为了解决传统嵌入式实时操作***任务管理机制的问题,满足OSEK/VDX规范对于汽车电子嵌入式操作***的特殊功能要求,本发明设计实现了一种任务多次激活的方法,或者说对传统的任务管理机制进行了改进:
为了满足对任务多次激活的处理,不同于传统嵌入式实时操作***的实现方法,本发明没有直接使用任务控制块在就绪任务队列中排队,而是使用了一种专门用来排队的数据结构:就绪块,我们称之为ReadyBlock,缩写为RB,每个就绪块中有两个元素,即指向下一个就绪块的指针(pointerToNextRB)和指向对应任务控制块的指针(pointerToTCB)。指向下一个就绪块的指针用于将就绪块连接成链表形式的队列,而指向对应任务控制块的指针则用来访问任务控制块;同时,对传统的任务控制块的数据结构进行了改进,在任务控制块中增加了记录任务当前激活次数的元素。由于该操作***要求是完全静态配置的,因此在数据结构的设计上,将配置相关的信息独立出来,专门放在任务配置信息结构体中,在该结构体中记录任务所允许的最大激活次数。这样,在就绪任务队列中排队的结构是就绪块,它只有两个元素,它对存储空间的占用少于直接用任务控制块排队的空间;***中每一个任务始终只有一个控制块存在,只有在其前一个实例运行完成或被终止后,其后面的实例才能运行,即一个任务的多个实例之间不完全独立,任务的多次激活的行为不会创建新的线程。
附图说明
图1是基本任务的状态转换图;
图2是现有嵌入式实时操作***的就绪任务队列结构示意图;
图3是本发明改进的就绪任务队列结构示意图;
图4是本发明中任务控制块及配置信息结构体一种具体实施方式结构图;
图5是本发明一具体实施方式操作***运行过程中任务状态的变化示意图;
图6是图5所示t0时刻就绪任务队列结构示意图;
图7是图5所示t1时刻就绪任务队列结构示意图;
图8是图5所示t2时刻就绪任务队列结构示意图;
图9是图5所示t3时刻就绪任务队列结构示意图;
图10是图5所示t4时刻就绪任务队列结构示意图;
图11是图5所示t5时刻就绪任务队列结构示意图;
图12是图5所示t6~t9时刻就绪任务队列结构示意图;
图13是图5所示t10~t12时刻就绪任务队列结构示意图;
图14是图5所示t13时刻就绪任务队列结构示意图;
图15是图5所示t14时刻就绪任务队列结构示意图;
图16是图5所示t15时刻就绪任务队列结构示意图;
图17是图5所示t16时刻就绪任务队列结构示意图;
图18是图5所示t17时刻就绪任务队列结构示意图;
图19是图5所示t18时刻就绪任务队列结构示意图;
图20是图5所示t19时刻就绪任务队列结构示意图;
图21是图5所示t20时刻就绪任务队列结构示意图。
具体实施方式
下面结合附图对本发明的具体实施方式进行描述,以便本领域的技术人员更好地理解本发明。需要特别提醒注意的是,在以下的描述中,当已知功能和设计的详细描述也许会淡化本发明的主要内容时,这些描述在这里将被忽略。
实施例
图3是本发明改进的就绪任务队列结构示意图。
如图3所示,在本实施例中,任务控制块TCB的编号变为一维的了,其下标代表了任务的编号,比如任务控制块TCB1代表任务1的控制块,TCB2代表任务2的控制块,以此类推。就绪块RB替代了图2中任务控制块TCB的位置,就绪块RB的编号是二维的,两个维度分别代表该就绪块RB所处的优先级和它在队列中的序号,比如RB00表示任务的优先级为0,它在队列中的序号为0;而RB2y表示任务的优先级为2,它在队列中的序号为y。由于各个优先级的就绪任务数量不一定相同,因此每个队列的最大序号也不一定相同。比如图3所示的***,编号即优先级为0的队列中共有x+1个任务在排队,其最大序号为x;编号为2的队列中共有y+1个任务在排队,其最大序号为y。每个队列有一个头指针和尾指针,分别指向队列的第一个就绪块和最后一个就绪块。比如在编号为2的队列中,头指针Head2指向RB20,尾指针Tail2指向RB2y。
每个就绪块RB中有两个元素,即指向下一个就绪块的指针pointerToNextRB和指向对应任务控制块的指针pointerToTCB。pointerToNextRB用于将就绪块RB连接成链表形式的队列,而pointerToTCB则用来访问任务控制块TCB。指向同一个任务控制块TCB的就绪块RB可以是一个或多个,指向同一个任务控制块TCB的就绪块RB个数就等于任务当前被激活的次数或者说可运行的实例个数。比如在图3中,任务控制块TCB1所代表的任务被激活了2次,它有2个可运行的实例,一个位于优先级为2的队列中,由就绪块RB20表示;一个位于优先级为n的队列中,由就绪块RBn1表示。任务控制块TCB2所代表的任务也有2个被激活的可运行实例,均位于优先级为2的队列中,由就绪块RB21和RB2y表示。
需要注意的是,在本实施例中,新激活的任务都是以其原始优先级进入就绪队列的。虽然任务在使用资源的时候其优先级会发生变化,但只有该任务的当前运行实体,即最早被激活的那个任务实例才可能被改变优先级,因此指向相同任务控制块的就绪块最多存在于2个优先级的就绪任务队列中。
为了实现任务多次激活的要求,对传统的任务控制块的数据结构进行了改进,在任务控制块中增加了记录任务当前激活次数的元素。由于该操作***要求是完全静态配置的,因此在数据结构的设计上,将配置相关的信息独立出来,专门放在任务配置信息结构体中,在该结构体中记录任务所允许的最大激活次数。有关任务控制块及配置信息结构体的如图4所示。
图4是本发明中任务控制块及配置信息结构体一种具体实施方式结构图。
在本实施例中,如图4所示,任务控制块中包括以下元素:
●任务状态status
状态status用于记录任务状态,它的值可以是以下4种情况中的任何一种:
运行RUNNING,表示任务处于运行态;
就绪READY,表示任务处于就绪态;
挂起SUSPEND,表示任务处于挂起态;
就绪及第一次运行READY&FIRST_RUN,表示任务处于就绪态并且是第一次运行。
其中就绪及第一次运行READY&FIRST_RUN是为了支持任务的多次激活而专门设计的,是对传统操作***任务状态的扩展,目的是为了确保新激活的任务实例在其第一次运行的时候,操作***保证从其代码的第一条指令开始执行:当任务的状态值为READY时,任务是通过恢复其上下文来运行的;当任务的状态为READY&FIRST_RUN时,操作***从任务代码入口地址开始执行。
●任务当前激活次数curActiveNum
任务当前激活次数curActiveNum用于记录任务当前的激活次数,每当任务增加一个激活实例,该元素的值加1;每当任务的一个实例运行结束,该元素的值减1;当curActiveNum被减到0时,该任务的状态变为挂起态。
●任务当前优先级curPriority
任务当前优先级,用于记录任务当前的优先级,它代表了任务最早可能运行的那个实例的优先级,它会***作***的调度程序所使用;
●任务配置信息表指针configTable
任务配置信息表指针configTable指向任务配置信息结构体,通过它可以获取任务的一些静态配置的信息;
●任务上下文指针context
任务上下文指针context指向存储任务上下文信息的指针,通过它可以获取任务的上下文信息,因为当任务的状态值为READY时,它是通过恢复任务上下文来运行的。
在本实施例中,如图4所示,任务配置信息结构中的信息都是通过用户静态配置的,在任务的运行过程中是不会改变的。其相关元素的说明如下:
●任务代码入口地址entry
通过任务代码入口地址entry可以获取任务的第一条功能代码,当任务的状态为READY&FIRST_RUN时,操作***是从任务代码的入口地址处,即第一条功能代码开始执行的。
●任务的ID taskId
即任务在***中的编号。
●任务的基本优先级basePriority
每当任务被新激活一个实例时,该实例的就绪块是根据这个优先级被***到相应的队列尾部的。
●任务的最大激活次数maxActive
任务的最大激活次数maxActive记录该任务所允许的最大激活次数,每当试图激活一个任务时,如果其当前激活次数小于配置的最大激活次数,则任务可以被成功激活,即增加一个可运行任务实例,否则不能被激活。
由于***中可能有多个就绪块与同一个任务控制块对应,因此任务控制块中的内容只能反映当前正在运行的或者最早可能运行的那个实例的情况。每当新增任务的一个激活实例或者结束任务的当前运行实例时,为保障下一个实例能正确运行,需要对就绪块、任务控制块进行相关的操作,具体来说,需要完成以下操作:
A、增加任务的一个激活实例:
a、对该任务的任务控制块进行以下操作:
1)、首先判断任务控制块中的任务当前激活次数curActiveNum是否已经等于任务配置信息结构体中的任务的最大激活次数maxActive;
2)、如果任务当前激活次数curActiveNum等于任务的最大激活次数maxActive,则表明任务已经达到其最大激活次数,则不能再增加一个激活实例,程序返回;
3)、如果任务当前激活次数curActiveNum小于任务的最大激活次数maxActive,则获取一个空闲的就绪块,并设置其指向对应任务控制块的指针pointerToTCB指向任务控制块,并将新的就绪块***到任务的原始优先级所对应的就绪任务队列的尾部,将任务当前激活次数CurActiveNum加1;
如果任务当前状态为挂起态,则修改任务控制块中任务状态为就绪及第一次运行;
b、如果操作***当前运行任务的优先级比新激活任务的优先级低,并且***满足调度程序的执行条件,则操作***进行任务调度;如果调度的结果是新激活的任务运行,则通过当前运行任务的任务控制块中的任务上下文指针,保存当前运行任务的上下文,
并修改激活任务的状态为就绪,跳转到激活任务的代码入口地址处,开始激活任务的运行;
B、结束任务的当前运行实例
1)、将当前运行实例的就绪块归还给***;
2)、对任务控制块的任务当前激活次数CurActiveNum减1;
3)、判断任务当前激活次数CurActiveNum的值是否为0,如果不为0,则意味着尚有该任务的其他待运行实例存在,针对下一个运行实例而言是就绪及第一次运行的状态,则需要将任务状态设置为就绪和第一次运行READY& FIRST_RUN;如果任务当前激活次数CurActiveNum为0,则将任务状态置为挂起态;
4)、调整任务当前优先级为任务配置信息结构体中的任务的基本优先级;
5)、如果***满足调度程序的执行条件,则操作***进行任务调度;对于新调度的需要运行的任务就绪块,查看就绪块所指向的任务控制块的任务状态,如果为就绪,则直接通过恢复其上下文来恢复任务的运行,如果为就绪和第一次运行,则修改任务状态为就绪,跳转到任务代码入口地址处,开始任务的运行。
实例
经过上述的改进,实现了OSEK/VDX操作***对于任务多次激活的要求。下面是一个实际的例子,说明了在一个***中多个任务被多次激活的情况,以及在这个过程中各个优先级的任务队列中就绪块的变化情况。
在这个例子中,***中共有5个任务T1~T5,这5个任务的优先级从高到低依次是:T2优先级最高、T1优先级次之、T3、T4、T5的优先级相同且最低。图5展示了在***运行过程中所做的一些操作,以及T1、T2、T3、T4和T5任务的状态变化情况。
下面是对该***运行过程中,按时间顺序所发生的一些事件,以及各任务状态变化情况的说明:
1)t0时刻:
a)操作:***初始化;
b)就绪任务队列情况:如图6所示,T1的激活次数为1,因此T1的任务控制块TCB1只有1个RB与其相连;
c)任务状态:如图5所示,只有任务T1就绪,其他任务均为挂起态,操作***调度T1运行,T1为运行态;
2)t1时刻:
a)操作:T1激活T4;
b)就绪任务队列情况:如图7所示,T4激活次数为1,T4的任务控制块TCB4有1个RB与其相连;
c)任务状态:如图5所示,T4变为就绪态;
3)t2时刻:
a)操作:T1再次激活T4;
b)就绪任务队列情况:如图8所示,T4激活次数为2,T4的任务控制块TCB4有2个RB与其相连;
c)任务状态:如图5所示,T4仍然为就绪态;
4)t3时刻:
a)操作:T1激活T5;
b)就绪任务队列情况:如图9所示,T5激活次数为1,T5的任务控制块TCB5有1个RB与其相连;
c)任务状态:T5变为就绪态;
5)t4时刻:
a)操作:T1激活T3;
b)就绪任务队列情况:如图10所示,T3激活次数为1,T3的任务控制块TCB3有1个RB与其相连;
c)任务状态:如图5所示,T3变为就绪态;
6)t5时刻:
a)操作:T1激活T4;
b)就绪任务队列情况:如图11所示,T4激活次数为3,T4的任务控制块TCB4有3个RB与其相连;
c)任务状态:如图5所示,T4仍然为就绪态;
7)t6时刻:
a)操作:T1激活T5;
b)就绪任务队列情况:如图12所示,T5激活次数为2,T5的任务控制块TCB5有2个RB与其相连;
c)任务状态:如图5所示,T5仍然为就绪态;
8)t7时刻:
a)操作:T1激活T3;
b)就绪任务队列情况:如图12所示,由于T3已到达其配置的最大激活次数,此次激活失败,T3的任务控制块TCB3仍然只有1个RB与其相连;
c)任务状态:如图5所示,T3仍然为就绪态;
9)t8时刻:
a)操作:T1激活T4;
b)就绪任务队列情况:如图12所示,由于T4已到达其配置的最大激活次数,此次激活失败,T4的任务控制块TCB4仍然是3个RB与其相连;
c)任务状态:如图5所示,T4仍然为就绪态;
10)t9时刻:
a)操作:T1激活T5;
b)就绪任务队列情况:如图12所示,由于T5已到达其配置的最大激活次数,此次激活失败,T5的任务控制块TCB5仍然是2个RB与其相连;
c)任务状态:如图5所示,T5仍然为就绪态;
11)t10时刻:
a)操作:T1激活T2;
b)就绪任务队列情况:如图13所示,T2激活次数为1,T1和T2的任务控制块均是1个RB与其相连;
c)任务状态:如图5所示,T2变为就绪态,由于T2优先级高于T1,T2抢占T1,T2变为运行态,T1回到就绪态;
12)t11时刻:
a)操作:T2激活T2;
b)就绪任务队列情况:如图13所示,由于T2已到达其配置的最大激活次数,此次激活失败,T2的任务控制块TCB2仍然只有1个RB与其相连;
c)任务状态:如图5所示,T2仍然为运行态;
13)t12时刻:
a)操作:T2激活T3;
b)就绪任务队列情况:如图13所示,由于T3已到达其配置的最大激活次数,此次激活失败,T3的任务控制块TCB3仍然只有1个RB与其相连;
c)任务状态:如图5所示,T3仍然为就绪态;
14)t13时刻:
a)操作:T2终止T2;
b)就绪任务队列情况:如图14所示,由于T2激活次数由1变为0,***中将不再有与T2的任务控制块相连的RB;
c)任务状态:如图5所示,T2变为挂起态,***调度T1运行,T1为运行态;
15)t14时刻:
a)操作:T1终止T1;
b)就绪任务队列情况:如图15所示,由于T1激活次数由1变为0,***中将不再有与T1的任务控制块相连的RB;
c)任务状态:如图5所示,T1变为挂起态,操作***调度T4运行,T4为运行态;
16)t15时刻:
a)操作:T4链接T4,即T4尝试终止当前运行实例,并激活一个新的实例;
b)就绪任务队列情况:如图16所示,与TCB4相连的新的RB被***到队列尾部,而当前正在运行的与TCB4相连的RB从队列首部取下,操作***调度下一个RB相连的任务运行,这个任务仍然是T4,只不过T4是从第一条功能代码重新执行;经过这个环节,T4的任务控制块TCB4仍然有3个RB与其相连;
c)任务状态:如图5所示,任务T4仍然为运行态;
17)t16时刻:
a)操作:T4终止T4;
b)就绪任务队列情况:如图17所示,T4激活次数由3变为2,T4的任务控制块TCB4有2个RB与其相连;操作***重新调度,此时最高优先级的就绪任务队列中,第一个RB所对应的是T5的任务控制块TCB5,T5变为运行态;
c)任务状态:如图5所示,T4变为就绪态,T5变为运行态;
18)t17时刻:
a)操作:T5激活T4;
b)就绪任务队列情况:如图18所示,T4激活次数变为3,T4的任务控制块TCB4有3个RB与其相连;
c)任务状态:如图5所示,T4状态仍然为就绪态;
19)t18时刻:
a)操作:T5链接T5,即T5尝试终止当前运行实例,并激活一个新的实例;
b)就绪任务队列情况:如图19所示,新的与TCB5相连的RB被***到队列尾部,而当前正在运行的RB从队列首部被取下,与T5的任务控制块TCB5相连的RB为2个;操作***调度下一个RB所对应的任务即T3运行;
c)任务状态:如图5所示,T5的状态变为就绪态,T3为运行态;
20)t19时刻:
a)操作:T3链接T3,即T3尝试终止当前运行实例,并激活一个新的实例;
b)就绪任务队列情况:如图20所示,新的与TCB3相连的RB被***到队列尾部,而当前正在运行的RB从队列首部被取下,与T3的任务控制块TCB3相连的RB为1个;操作***调度下一个RB所对应的任务即T4运行;
c)任务状态:如图5所示,T3的状态变为就绪态,T4为运行态;
21)t20时刻:
a)操作:T4终止T4;
b)就绪任务队列情况:如图21所示,T4的激活次数由3变为2,其与T4的任务控制块TCB4相连的RB为2个;操作***调度下一个RB所对应的任务即T5运行……
c)任务状态:如图5所示,T4的状态变为就绪态,T5变为运行态;
通过跟踪上述***的运行情况,客观证明了本发明中所设计的方法满足了任务多次激活的要求,解决了现有技术中存在的2个问题,即:
1、在就绪任务队列中排队的结构是RB,它只有2个元素,它对存储空间的占用少于直接用任务控制块排队的空间;
2、***中每一个任务始终只有一个控制块存在,只有在其前一个实例运行完成(被终止)后,其后面的实例才能运行,即一个任务的多个实例之间不完全独立,多次激活的行为没有创建新的线程。
尽管上面对本发明说明性的具体实施方式进行了描述,以便于本技术领的技术人员理解本发明,但应该清楚,本发明不限于具体实施方式的范围,对本技术领域的普通技术人员来讲,只要各种变化在所附的权利要求限定和确定的本发明的精神和范围内,这些变化是显而易见的,一切利用本发明构思的发明创造均在保护之列。
Claims (1)
1.一种嵌入式实时操作***中任务多次激活的方法,其特征在于,包括以下步骤:
(1)、建立一个就绪任务队列数组用于管理就绪任务
对相同优先级的就绪任务进行排队,形成与优先级数量相同的多个就绪任务队列;所有的就绪任务队列形成数组,数组的长度等于优先级数,每个数组元素为一个就绪任务队列,并且对应一个优先级;
就绪任务队列中的就绪任务用就绪块指示,每个就绪块中有两个元素,即指向下一个就绪块的指针和指向对应任务控制块的指针,如果就绪块位于就绪任务队列最后一个位置,则其指向下一个就绪块的指针为空;
每个就绪任务队列有一个头指针和尾指针,分别指向就绪任务队列的第一个就绪块和最后一个就绪块,头指针用于对应优先级的任务执行时,查找该优先级对应的就绪任务队列中的第一个任务,尾指针用于新的就绪块***时,查找该新的就绪块的优先级对应的就绪任务队列尾部的就绪块,如果就绪任务队列中没有就绪任务,则头指针和尾指针为空;
(2)、对任务控制块的数据结构进行了改进
2.1、任务控制块中包括以下元素:
●任务状态
任务状态用于记录任务状态,其取值为:运行、就绪、挂起和就绪及第一次运行;
当任务的状态值为就绪时,任务是通过恢复其上下文来运行的;当任务的状态为就绪及第一次运行时,操作***从任务代码入口地址开始执行;
●任务当前激活次数
任务当前激活次数用于记录任务当前的激活次数,每当任务增加一个激活实例,任务当前激活次数的值加1;每当任务的一个实例运行结束,任务当前激活次数的值减1;当任务当前激活次数被减到0时,该任务的状态变为挂起态;
●任务当前优先级
任务当前优先级,用于记录任务当前的优先级,其值代表了任务最早可能运行的那个实例的优先级;
●任务配置信息表指针
任务配置信息表指针指向任务配置信息结构体,通过它可以获取任务的静态配置的信息;
●任务上下文指针
任务上下文指针指向操作***存储的任务上下文信息,通过它可以获取任务的上下文信息,当任务的状态值为就绪时,该任务是通过恢复其上下文信息来运行的;
2.2、任务配置信息结构体中的信息都是通过用户静态配置,在任务的运行过程中不改变的,其相关元素如下:
●任务代码入口地址
通过任务代码入口地址可以获取任务的第一条功能代码,当任务的状态为就绪及第一次运行时,操作***是从任务代码的入口地址处执行的;
●任务的基本优先级
每当任务被新激活一个实例时,该实例的就绪块是根据这个优先级被***到相应的队列尾部的;
●任务的最大激活次数
任务的最大激活次数记录该任务所允许的最大激活次数,每当试图激活一个任务时,如果其当前激活次数小于配置的最大激活次数,则任务可以被成功激活,即增加一个可运行任务实例,否则不能被激活;
(3)、任务多次激活的操作
3.1、增加任务的一个激活实例
a、对该任务的任务控制块进行以下操作:
1)、首先判断任务控制块中的任务当前激活次数是否已经等于任务配置信息结构体中的任务的最大激活次数;
2)、如果任务当前激活次数等于任务的最大激活次数,不能再增加一个激活实例,程序返回;
3)、如果任务当前激活次数小于任务的最大激活次数,则获取一个空闲的就绪块,并设置该空闲的就绪块指向对应任务控制块的指针指向任务控制块以形成新的就绪块,将新的就绪块***到任务的基本优先级所对应的就绪任务队列的尾部:该就绪任务队列原最后的就绪块的指向下一个就绪块的指针指向新***的就绪块,该就绪任务队列的尾指针指向新***的就绪块;任务当前激活次数加1;
如果任务当前状态为挂起态,则修改任务控制块中任务状态为就绪及第一次运行;
b、如果操作***当前运行任务的优先级比新激活任务的优先级低,并且***满足调度程序的执行条件,则操作***进行任务调度;如果调度的结果是新激活的任务运行,则通过当前运行任务的任务控制块中的任务上下文指针,保存当前运行任务的上下文,并修改激活任务的任务控制块的任务状态为就绪,跳转到激活任务的任务控制块的任务代码入口地址处,开始激活任务的运行;
3.2、结束任务的当前运行实例
1)、将当前运行实例的就绪块归还给***;
2)、对任务控制块的任务当前激活次数减1;
3)、判断任务当前激活次数的值是否为0,如果不为0,则将任务状态设置为就绪及第一次运行;如果任务当前激活次数为0,则将任务状态置为挂起态;
4)、调整任务当前优先级为任务配置信息结构体中的任务的基本优先级;
5)如果***满足调度程序的执行条件,则操作***进行任务调度;对于新调度的需要运行的任务就绪块,查看就绪块所指向的任务控制块的任务状态,如果为就绪,则直接通过恢复其上下文来恢复任务的运行,如果为就绪和第一次运行,则修改任务状态为就绪,跳转到任务代码入口地址处,开始任务的运行。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010582446 CN102043668B (zh) | 2010-12-10 | 2010-12-10 | 一种嵌入式实时操作***中任务多次激活的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 201010582446 CN102043668B (zh) | 2010-12-10 | 2010-12-10 | 一种嵌入式实时操作***中任务多次激活的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102043668A CN102043668A (zh) | 2011-05-04 |
CN102043668B true CN102043668B (zh) | 2013-05-22 |
Family
ID=43909824
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 201010582446 Expired - Fee Related CN102043668B (zh) | 2010-12-10 | 2010-12-10 | 一种嵌入式实时操作***中任务多次激活的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102043668B (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20130074088A1 (en) | 2011-09-19 | 2013-03-21 | Timothy John Purcell | Scheduling and management of compute tasks with different execution priority levels |
CN104239134B (zh) * | 2013-06-21 | 2018-03-09 | 华为技术有限公司 | 一种众核***的任务管理方法和装置 |
CN103729245B (zh) * | 2013-12-27 | 2017-03-08 | 普华基础软件股份有限公司 | 一种osek操作***内核动态过程静态化方法 |
CN106201695A (zh) * | 2016-07-15 | 2016-12-07 | 郑州飞机装备有限责任公司 | 适用于嵌入式软件***的多任务调度方法 |
CN108121911B (zh) * | 2016-11-30 | 2021-04-27 | ***通信有限公司研究院 | 一种软件检测方法及装置 |
CN107346263B (zh) * | 2017-06-29 | 2021-01-12 | 上海联影医疗科技股份有限公司 | 任务执行方法、存储介质以及计算机设备 |
CN111913790A (zh) * | 2020-07-03 | 2020-11-10 | 佛山市顺德区美的洗涤电器制造有限公司 | 任务调度方法、装置、家用电器和计算机可读存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6449614B1 (en) * | 1999-03-25 | 2002-09-10 | International Business Machines Corporation | Interface system and method for asynchronously updating a share resource with locking facility |
CN1490722A (zh) * | 2003-09-19 | 2004-04-21 | 清华大学 | 基于PowerPC处理器结构的分级任务切换方法 |
CN1655124A (zh) * | 2005-03-04 | 2005-08-17 | 清华大学 | 基于PowerPC处理器的车用操作***中断管理方法 |
CN1737764A (zh) * | 2005-09-12 | 2006-02-22 | 浙江大学 | 支持osek标准的嵌入式实时操作***的任务调度方法 |
-
2010
- 2010-12-10 CN CN 201010582446 patent/CN102043668B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6449614B1 (en) * | 1999-03-25 | 2002-09-10 | International Business Machines Corporation | Interface system and method for asynchronously updating a share resource with locking facility |
CN1490722A (zh) * | 2003-09-19 | 2004-04-21 | 清华大学 | 基于PowerPC处理器结构的分级任务切换方法 |
CN1655124A (zh) * | 2005-03-04 | 2005-08-17 | 清华大学 | 基于PowerPC处理器的车用操作***中断管理方法 |
CN1737764A (zh) * | 2005-09-12 | 2006-02-22 | 浙江大学 | 支持osek标准的嵌入式实时操作***的任务调度方法 |
Non-Patent Citations (1)
Title |
---|
陈二涛.OSEK OIL配置器研究与应用.《太原科技大学》.2009,第1页至第75页. * |
Also Published As
Publication number | Publication date |
---|---|
CN102043668A (zh) | 2011-05-04 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102043668B (zh) | 一种嵌入式实时操作***中任务多次激活的方法 | |
CN109144710B (zh) | 资源调度方法、装置及计算机可读存储介质 | |
US8683180B2 (en) | Intermediate register mapper | |
CN100530111C (zh) | 一种多线程访问间接寄存器的调度方法 | |
US20150254113A1 (en) | Lock Spin Wait Operation for Multi-Threaded Applications in a Multi-Core Computing Environment | |
KR102334511B1 (ko) | 작업 의존성 관리 | |
US10248463B2 (en) | Apparatus and method for managing a plurality of threads in an operating system | |
CN102541642B (zh) | 一种增强实时性能的任务管理方法 | |
US20070130569A1 (en) | Method, apparatus and program storage device for providing a no context switch attribute that allows a user mode thread to become a near interrupt disabled priority | |
CN107577539B (zh) | 用于内核态和用户态通讯的共享内存结构及其应用 | |
CN107391279B (zh) | 一种消息队列容器创建方法、装置及消息队列容器 | |
US20030233392A1 (en) | Method and system for managing the execution of threads and the processing of data | |
CN109308213B (zh) | 基于改进任务调度机制的多任务断点调试方法 | |
CN102681894A (zh) | 一种多任务并发调度方法及*** | |
CN104239134A (zh) | 一种众核***的任务管理方法和装置 | |
CN104932933A (zh) | 一种获取自旋锁的方法及装置 | |
CN102004664A (zh) | 一种空间飞行器嵌入式实时操作***调度方法 | |
US11397560B2 (en) | System and method for managing multi-core accesses to shared ports | |
CN106201695A (zh) | 适用于嵌入式软件***的多任务调度方法 | |
US20140052432A1 (en) | Method for a design evaluation of a system | |
Resmerita et al. | Applying real-time programming to legacy embedded control software | |
CN112948136A (zh) | 一种嵌入式操作***异步日志记录的实现方法 | |
Goyette | An analysis and description of the inner workings of the freertos kernel | |
KR102031853B1 (ko) | 다중 중요도 시스템 위한 작업별 중요도 모드 전환 방법 | |
US20120066481A1 (en) | Dynamic instruction splitting |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20130522 Termination date: 20151210 |
|
EXPY | Termination of patent right or utility model |