具体实施方式
不仅是用于如个人计算机等通用设备的OS,就连如用于移动电话等的专用设备的OS中也逐渐需要高级功能。特别是能够用一个中央处理器(CPU)执行多个任务的OS(以下将这种类型的OS称作“多任务OS”)现已经被配置在很多的电子装置中。
多任务OS将CPU的处理时间分割为单位时间(时间片),并为多个任务顺序分配时间片。每个任务只有当从OS获得时间片时才能够使用CPU。在一个时间片中执行一个任务。由于时间片是非常短的时间,对于用户而言,多个任务看似是同时执行的。根据这种处理方法,通过在任务A到达等待输入的状态因而不需要用到CPU的处理能力时,将执行权交给其它任务B,能够有效利用CPU的处理能力。这里所说的执行权等同于使用CPU的权利。
多任务OS进行的执行权转移被称作“任务切换”。任务切换是在时间片已经届满或任务执行规定命令时发生。当到达任务切换的执行时刻时,多任务OS将执行中的任务的上下文信息保存到TCB(Task Control Block:任务控制块)中。上下文信息是指任务执行时存储在CPU的寄存器中的数据或与任务执行状态有关的数据。TCB是指存储只有任务才有的信息而在存储器中预留的区域。多任务OS将执行中的任务的上下文信息保存到TCB中后,选择将给予执行权的任务,从TCB中读出上下文信息,并将该信息加载到CPU寄存器中。由此,各任务以时间片为单位一点点地执行自身的处理。
多任务OS具有能够高效地执行多个任务的优点,但是也具有产生与上下文信息保存/加载相对应的开销的缺点。通常多任务OS的优点远远大于与任务切换有关的开销。
近年来,严格要求在规定时间内完成处理的实时OS(以下称作“RTOS(Real-Time Operating System)”)被特别广泛地应用于嵌入式系统(EmbeddedSystem)中。在这种时间要求严格的RTOS中,存在任务切换时的开销大大影响系统整体性能的情况。本发明实施例的任务处理器100是由电子电路来实现多任务OS的任务调度。另外,以硬件逻辑来实现与FIFO和LIFO两者都相容的双输入型队列算法,从而提高多任务OS的处理效率。
由电子电路来实现多任务OS的任务调度的根据本发明实施例的任务处理器100被描述为“基本实施方式”。于是,通过安装双输入型算法来实现与普通软件的多任务OS相当的任务调度的任务处理器100被描述为“改进实施方式”。以下,提及“本发明实施例”时,原则上是表示“基本实施方式”以及“改进实施方式”两者。
[基本实施方式]
本发明实施例所示的任务处理器100由电子电路来实现多任务OS的任务调度功能。在详细说明任务处理器100之前,首先参照图1说明任务的状态转移。这里虽然是对通用多任务OS中的任务状态转移进行说明,但是这些说明对于任务处理器100中的任务状态转移同样适用。另外,还对在任务处理器100中执行的系统调用进行概述。在参照图2和图3描述通用多任务OS的设计思想的基础上,参照图4至图10详细描述本发明实施例中的任务处理器100的处理方法。并且,对于与信号量或互斥量(Mutex)、事件等有关的处理,也适当通过与一般技术进行比较来说明任务处理器100的特征。
[任务的状态转移]
图1是任务的状态转移图。在多任务处理中,各任务都具有“状态(State)”。各任务在多个状态之间转换,通常是处于某一个状态。状态转移由“系统调用的执行”和“检测出中断请求信号”来触发。系统调用是各任务执行的命令中的特殊命令。中断请求信号是在按下键盘或点击鼠标、接收通信数据等从外围设备接收规定数据时发生的信号。当然,当分配给各任务的时间片耗尽时也发生状态转移。
任务大致分为“常规任务”和“特殊任务”。常规任务是响应系统调用而执行的非特殊任务。特殊任务是响应检测出中断请求信号而执行的任务,即所谓的中断处理程序。首先描述各个任务状态,然后说明各种系统调用命令。
(1)STOP状态(休眠状态)
表示任务处于休眠状态。常规任务和特殊任务都能够处于STOP状态。以下将处于STOP状态的任务称作“STOP-任务”。
1-1.常规任务
当其它任务执行指示启动另一项任务的系统调用(以下称作“启动系统调用”)时,处于STOP状态的常规任务转换到后述的READY状态。
1-2.特殊任务
特殊任务通常处于STOP状态。当通过后述的任务切换电路210检测出中断请求信号时,特殊任务从STOP状态转换到后述的RUN状态。此时原来处于RUN状态的任务转换到READY状态。
(2)RUN状态(执行状态)
表示任务正在执行中,即任务被分配了时间片,获得了CPU的使用权的状态。常规任务和特殊任务都能够处于RUN状态。以下将处于RUN状态的任务称作“RUN-任务”。多个任务中处于RUN状态的任务始终只能有一个,而不能有两个任务同时处于RUN状态。
2-1.常规任务
当执行规定的系统调用时,处于RUN状态的常规任务从RUN状态转换到READY状态或者后述的WAIT状态。处于RUN状态的常规任务在耗尽时间片时,也转换到READY状态。在任意一种情况下,原来处于READY状态的常规任务转换到RUN状态,来替代原来处于RUN状态的常规任务。当检测出中断请求信号时,RUN-任务转换到READY状态。此时,原先处于STOP状态的特殊任务转换到RUN状态。
当RUN-任务执行使自身结束的系统调用(以下称作“结束系统调用”)时,该RUN-任务转换到STOP状态。
2-2.特殊任务
当根据中断请求信号从STOP状态转换到RUN状态的特殊任务完成自身处理时,返回到STOP状态。特殊任务只能够处于STOP状态和RUN状态。
(3)READY状态(可执行状态)
表示任务处于可被执行的状态。如果处于READY状态的任务从OS得到执行权,则随时都能够转换到RUN状态。只有常规任务可以处于READY状态。以下将处于READY状态的任务称作“READY-任务”。
当原先处于RUN状态的常规任务由于系统调用的执行而转换到RUN状态以外的状态时,或者当处于RUN状态的特殊任务完成自身处理而转换到STOP状态时,READY-任务进而转换到RUN状态。常规任务只能从READY状态来转换到RUN状态。当有多个处于READY状态的任务时,根据作为上下文信息的一部分的任务优先级,使某一个READY-任务转换到RUN状态。当有多个任务优先级相同的READY-任务时,最先转换到READY状态的任务转换到RUN状态。
(4)WAIT状态(待机状态)
表示等待规定的WAIT解除条件满足的状态。当WAIT解除条件满足时,处于WAIT状态的任务转换到READY状态。只有常规任务能够处于WAIT状态。以下将处于WAIT状态的任务称作“WAIT-任务”。关于WAIT解除条件将在后面详述。
综上所述,只有当任务处于RUN状态时,才能够使用CPU来执行其处理。RTOS一边管理多个任务的状态一边适当切换RUN-任务。由此,实现CPU总是执行某个任务的处理方式。
系统调用
下面附带说明一下系统调用。系统调用大致分为“启动系列”、“WAIT系列”和“SET系列”三种。
(1)启动系列系统调用
启动系列系统调用是与在STOP状态和READY状态之间进行的转换相关联的系统调用。
1-1.启动系统调用
启动系统调用是作为RUN-任务的任务A使另一项常规任务B启动的系统调用。此时,处于STOP状态的常规任务B转换到READY状态。
1-2.结束系统调用
执行该系统调用的任务结束自身处理,并从RUN状态转换到STOP状态。结束系统调用也可以是某项任务使另一项任务结束的命令。
(2)WAIT系列系统调用
WAIT系列系统调用是与在RUN状态和WAIT状态之间进行的转换相关联的系统调用。
2-1.等待信号量系统调用
等待信号量系统调用是请求获得信号量(后述)的系统调用。
2-2.等待互斥量系统调用
等待互斥量系统调用是请求获得互斥量(后述)的系统调用。
2-3.等待事件系统调用
等待事件系统调用是等待建立事件(后述)的系统调用。为了执行,等待事件系统调用接收事件ID、等待标记模式(后述)和标记条件(后述)作为参数。
在任何一种情况下,WAIT系列系统调用都设定各种WAIT解除条件。如果在执行WAIT系列系统调用时已经满足WAIT解除条件,已执行所述系统调用的RUN-任务转换到READY状态。同时,当不满足WAIT解除条件时,RUN-任务转换到等待满足WAIT解除条件的WAIT状态。
(3)SET系列系统调用
SET系列系统调用是与在WAIT状态和READY状态之间进行的转换相关联的系统调用。SET系列系统调用的执行触发WAIT解除条件的建立。
3-1.释放(release)信号量系统调用
其是释放信号量的系统调用。
3-2.释放互斥量系统调用
其是释放互斥量的系统调用。
3-3.设定事件(Set Event)系统调用
其是建立事件的当前标记模式(后述)的系统调用。
3-4.清除标记系统调用
其是用于将当前标记模式清零的系统调用。
在对本发明实施例进行说明时,假设采用了以上9种系统调用。除此之外,当然还能够实现其他的各种系统调用。
通用RTOS的设计思想
图2是通用RTOS的概念图。
图示的RTOS是多任务OS。通用RTOS是以软件实现的。下面以从任务A向任务B切换RUN-任务的情况为例进行说明。由于任务A占用着CPU,因此RTOS向CPU申请中断,以从任务A取得CPU的使用权。在此基础上,RTOS将任务A的上下文信息保存到TCB中。RTOS选择任务B作为下一个RUN-任务,并将上下文信息从任务B的TCB加载到CPU的寄存器中。当加载完成时,RTOS将CPU的使用权移交给任务B。由此,通过暂时获取CPU的使用权,RTOS执行从任务A向任务B的任务切换。对于特殊任务的执行也是相同的,这种情况下,也是通过将RUN-任务的上下文信息保存到TCB中后,将CPU的使用权移交给特殊任务来实现任务切换。
因为RTOS是以软件实现的,因此为了执行自身处理,RTOS需要CPU的使用权。换句话说,RTOS和任务在CPU的使用权上是竞争关系。以下将这样通过软件实现的RTOS称作“软件RTOS”。
图3是执行软件RTOS的通用CPU的电路图。
CPU 84包括:执行控制电路90,用于总体地控制存储器访问、命令执行等;处理寄存器组92,用于存储如任务的上下文信息等的各种数据;以及运算电路94,用于执行运算。处理寄存器组92是多种寄存器的组合,大致分为特殊寄存器88和通用寄存器86。特殊寄存器88是存储程序计数器、堆栈指针以及标记等的寄存器。通用寄存器86是存储作业用数据的寄存器,包括R0~R15共16个寄存器。特殊寄存器88存在用户用和系统用两面,但是通用寄存器86只有一面。以下将存储在处理寄存器组92中的数据称作“处理数据”。
执行控制电路90利用指示输出选择器98的控制信号(CTRL),将处理寄存器组92中所期望的寄存器的处理数据输出到运算电路94中。运算电路94按照该处理数据,即命令和变量,来执行运算。运算结果向输入选择器96输出。执行控制电路90利用指示输入选择器96的控制信号(CTRL),向处理寄存器组92中所期望的寄存器输入运算结果。
另外,执行控制电路90通过CPU数据总线从存储器中读出数据,并通过输入选择器96将该数据适时加载到处理寄存器组92中。执行控制电路90同样通过该CPU数据总线将处理数据适时记录到存储器中。执行控制电路90一边更新特殊寄存器88中的程序计数器,一边执行任务。
当发生任务切换时,执行控制电路90将处理数据保存到存储器中预留的区域即TCB中。如果任务A执行系统调用,则认为发生了从任务A到任务B的任务切换。系统调用的执行触发RTOS获取CPU的使用权,因此CPU 84将暂时按照RTOS的程序来运行,其处理过程如下:
<任务A的上下文信息的保存>
1.执行控制电路90将特殊寄存器88从用户用切换到系统用。向系统用特殊寄存器88中加载RTOS处理用的处理数据。
2.执行控制电路90将通用寄存器86中的数据保存到堆栈(未示出)中。
3.执行控制电路90将用于RTOS的处理数据从记录介质(未示出)中,例如其它寄存器中,加载到通用寄存器86中。在该阶段,处理寄存器组92中的处理数据被完全替换为RTOS用的处理数据。
4.RTOS从存储器中识别出任务A的TCB,并将保存在堆栈中的处理数据写入该TCB中。另外,用户用特殊寄存器88中的处理数据也作为上下文信息的一部分写入该TCB中。由此,任务A的处理数据被保存到该TCB中。RTOS将任务A已从“RUN”状态转换到“READY(或者WAIT)”状态的情况记录在任务A的TCB中。
<任务B的上下文信息的加载>
1.RTOS从存储器中识别出任务B的TCB,并将该TCB中的上下文信息写入堆栈和用户用特殊寄存器88中。RTOS将任务B已从“READY”状态转换到“RUN”状态的情况记录在任务B的TCB中。
2.RTOS将RTOS处理用数据从通用寄存器86保存到记录介质(未示出)中。
3.执行控制电路90将堆栈中的上下文信息加载到通用寄存器86中。执行控制电路90将特殊寄存器88从系统用切换到用户用。由此,任务B的处理数据被加载到处理寄存器组92中。
经过如上所述的处理过程,实现了任务切换。通常通用寄存器86是一面结构,因此为了切换任务用的处理数据和RTOS用的处理数据而使用堆栈。如果通用寄存器86也是两面,则将无需通过堆栈来保存/加载数据,因此能够实现更高速的任务切换。
在本发明实施例中,还通过为每个任务设置保存寄存器110,来实现更高速的任务切换。使用保存寄存器110的任务切换,将参照图5进行详述。在参照图3说明的CPU 84和普通软件RTOS中,在进行任务切换时频繁地访问TCB。在上述例子中,是以从任务A向任务B进行任务切换为例进行的说明,但是实际上,RTOS为了选择下面应执行的任务B也需要执行很多命令。此时,RTOS将频繁地访问存储器。通过采用后述的专门用于任务选择的任务控制电路200,本发明实施例中的任务处理器100实现了更高速的任务切换。
根据任务处理器100的RTOS硬件实现
图4是本发明实施例中的RTOS的概念图。
与普通软件RTOS不同,本发明实施例中的RTOS主要是以与CPU分离的硬件来实现的。以下将由硬件实现的RTOS称作“硬件RTOS”。由于本发明实施例的RTOS主要是与CPU分离的硬件,因此为了执行自身处理,则实质上基本不需要CPU的使用权。换句话说,RTOS和任务在CPU的使用权上基本不是竞争关系。在图2所示的普通软件RTOS中,CPU既是任务执行用电路,还是RTOS执行用电路。相反地,在本发明实施例的硬件RTOS中,CPU明确为任务执行电路。任务调度功能主要由后述的保存电路120和任务控制电路200来实现。
图5是本发明实施例中的任务处理器100的电路图。
除了CPU 150之外,任务处理器100还包括保存电路120和任务控制电路200。CPU 150是任务的执行主体。保存电路120和任务控制电路200是起到图4所示的RTOS的作用的电路。任务调度处理是由任务控制电路200来主导的。
CPU 150包括执行控制电路152、处理寄存器组154以及运算电路160。CPU150可以是参照图3说明的通用CPU。但是,本发明实施例中的CPU 150的信号线连接方式与图3所示的CPU 84的信号线连接方式不同。对于具体的电路结构,将参照下面的图6进行详述。
任务控制电路200包括任务切换电路210、信号量表212、事件表214、任务选择电路230以及状态存储单元220。对于信号量表212和事件表214,将参照图13及其后图进行详述。状态存储单元220是与每个任务相对应的单元。以下将与任务A对应的状态存储单元220表示为“状态存储单元220_A”。各状态存储单元220存储对应任务的状态数据。状态数据是指上下文信息中的特别是任务优先级或任务状态等表示任务属性的信息。对于具体的数据内容,将在后面参照图10进行说明。全部任务的全部状态数据从各状态存储单元220中不断地输出到任务选择电路230中。任务选择电路230是根据各任务的状态数据进行如RUN-任务选择等的各种任务选择的电路。对于任务选择电路230,将参照图10及其后图进行详述。当检测出从执行控制电路152接收的系统调用信号(SC)或来自外部设备的中断请求信号(INTR)时,任务切换电路210执行任务切换。
执行控制电路152在执行系统调用时,将系统调用信号(SC)发送到任务切换电路210。另外,当任务切换电路210检测出中断请求信号(INTR)时,任务切换电路210向执行控制电路152申请停止请求信号(HR)。当CPU 150的操作停止时,执行控制电路152向任务切换电路210申请停止完成信号(HC)。通过这三种信号,CPU 150和任务控制电路200将能够进行配合操作。
保存电路120包括加载选择电路112以及多个保存寄存器110。保存寄存器110也是与每个任务相对应的单元,是用于保存处理寄存器组154中的处理数据的寄存器组。因而,保存寄存器110具有与处理寄存器组154相等以上的数据容量。以下将与任务A对应的保存寄存器110表示为“保存寄存器110_A”。加载选择电路112接受任务切换电路210的指示,将某个保存寄存器110中的数据(以下将保存寄存器110所存储的数据称作“保存数据”)加载到处理寄存器组154中。
各保存寄存器110不断地将各自的保存数据输出到加载选择电路112中。当任务切换电路210向加载选择电路112输入用于指定任务ID的任务选择信号(TS)时,加载选择电路112将与所指定任务对应的保存寄存器110中的保存数据输出到处理寄存器组154中。并且,当任务切换电路210向处理寄存器组154输入写入信号(WT)时,该保存数据实际上被加载到处理寄存器组154中。
另一方面,处理寄存器组154中的全部处理数据也不断地被输出到全部的保存寄存器110中。当任务切换电路210确认向期望的保存寄存器110发送了写入信号(WT)时,处理数据被保存到该保存寄存器110中。这里,连接处理寄存器组154和各保存寄存器110的总线能够一次传输的位数设定为能够并行传输处理数据。因此,任务切换电路210通过向保存寄存器110仅发送一次写入信号,就能够将处理数据一次写入保存寄存器110中。另外,连接保存寄存器110和加载选择电路112的总线以及连接加载选择电路112和CPU 150的总线的位数也同样地设定。
下面分别对系统调用和中断请求信号引起的任务切换的执行方法进行描述。
[1]系统调用的执行
当CPU 150的执行控制电路152执行系统调用时,执行控制电路152使CPU150的时钟(以下称作“CPU时钟(CLK)”)停止。对于具体的停止方法,将参照图7等在后面详述。执行控制电路152将表示系统调用的执行的系统调用信号(SC)发送给任务控制电路200的任务切换电路210。另外,当CLK的停止完成时,执行控制电路152向任务切换电路210申请停止完成信号(HC)。
在CPU 150和任务切换电路210之间,为了系统调用信号的传输而连接有9根信号线。这9根信号线与所述9种系统调用相对应。执行控制电路152根据所执行的系统调用种类,用对应的某根系统信号线传输数字脉冲。任务切换电路210通过判断是从9根系统信号线中的哪根信号线中检测出数字脉冲,来立即检测出所执行的系统调用种类。任务切换电路210根据系统调用种类,从任务选择电路230输出的数据中选择所需数据,执行由系统调用所指定的处理。该处理是以申请HC为条件来执行的。对于任务切换电路210和任务选择电路230之间的关系,将参照图10进行详述。此外,该系统调用的参数和返回值写入处理寄存器组154中规定的通用寄存器158中。任务切换电路210能够对通用寄存器158执行参数的读出和返回值的写入。这里,假设作为RUN-任务的任务A执行等待信号量系统调用。因而,首先需要将任务A的处理数据保存。
<任务A的上下文信息的保存>
执行控制电路152将表示等待信号量系统调用的SC信号输入到任务切换电路210中。执行控制电路152使CLK停止,当停止完成时申请HC。任务切换电路210在向内置于任务选择电路230的各种选择电路中后述的信号量选择电路234输出成为待机对象的信号量的信号量ID后,选择下一个应执行的任务B。任务切换电路210向状态存储单元220_A写入规定数据。例如,作为任务A的状态,从“RUN”更新为“READY”或“WAIT”。更具体地说,任务切换电路210在将表示任务状态“WAIT”的状态数据输出到全部状态存储单元220的基础上,只向状态存储单元220_A输入写入信号(WT_A)。由此,任务A的状态被更新。
接着,任务切换电路210向保存寄存器110_A输出写入信号(WT)。由于处理寄存器组154中的处理数据不断地被输出到各保存寄存器110中,因此该写入信号(WT)使得任务A的处理数据被保存到任务A的保存寄存器110_A中。
<任务B的上下文信息的加载>
当任务A的状态数据更新、处理数据保存完成时,任务切换电路210将指定任务B的任务选择信号(TS_B)输出到加载选择电路112中。由此,保存寄存器110_B中保存的数据被输出到处理寄存器组154中。当任务切换电路210向处理寄存器组154输出写入信号(WT)时,任务B的保存数据被加载到处理寄存器组154中。另外,任务切换电路210还向任务B的状态存储单元220中写入规定数据。例如,任务B的状态从“READY”更新为“RUN”。当以上处理完成时,执行控制电路152使CPU时钟恢复。CPU 150根据所恢复的CPU时钟来开始执行任务B。关于该处理方法的更具体细节,将在后面参照图8(b)进行描述。
[2]中断请求信号的产生
任务切换电路210检测来自外围设备的中断请求信号(INTR)。更具体地说,中断请求信号(INTR)从中断控制器(未示出)发送到任务切换电路210。表示中断请求信号(INTR)等级的参数被记录在内置于该中断控制器的寄存器中。任务切换电路210向执行控制电路152申请停止请求信号(HR)后,执行控制电路152使CPU时钟停止。与系统调用执行时相同,任务切换电路210将RUN-任务的处理数据保存到保存寄存器110中。接着,任务切换电路210启动特殊任务。与中断请求信号的参数无关而启动的特殊任务只有1种。该特殊任务从中断控制器的内置寄存器中读出INTR的参数,并执行与该参数相应的处理。该特殊任务所执行的处理,可以是设定事件系统调用或设定信号量系统调用的执行,可以是常规任务的启动。根据该参数,该特殊任务可以不执行任何特别处理就结束。根据INTR的参数执行何种处理,是由特殊任务的实现方式来决定的。当该特殊任务的执行结束时,从READY-任务中选择出下一个RUN-任务。
任务切换电路210将与该特殊任务对应的保存寄存器110中的处理数据加载到CPU 150中。这种从常规任务切换到特殊任务所需的时间,能够根据任务控制电路200的工作时钟来预先估计。当向执行控制电路152申请HR后,任务切换电路210的工作时钟经过规定的时间时,任务切换电路210为了解除CPU时钟的停止而取消(negate)HR。当HR被取消时,执行控制电路152使CPU时钟恢复。此时,任务切换电路210完成了从常规任务到特殊任务的任务切换。关于该处理方法的具体细节,将在后面参照图8(a)进行描述。
在任何情况下,任务切换的核心处理,即(A)处理数据的保存/加载,以及(B)任务状态转移和RUN-任务的选择,都是通过硬件来实现的。在(A)和(B)中,无需访问存储器上的TCB,这对任务切换的高速化也有利。任务处理器100的CPU 150中所要求的只是追加使CPU时钟停止和恢复的功能。此外,这些功能全部由硬件来实现,这并非是要限定本发明的范围。例如,本领域技术人员可以理解,(A)或者(B)的主要功能可以由硬件来实现,而为了辅助硬件功能,RTOS的一部分功能可以由软件来实现。
图6是图5所示的CPU 150的电路图。
与图3所示的CPU 84不同,处理寄存器组154的特殊寄存器156和通用寄存器158都是一面的结构。处理寄存器组154中分别引入了来自加载选择电路112的输入总线、到保存寄存器110的输出总线、以及来自任务切换电路210的写入信号(WT)用信号线。执行控制电路152根据对输出选择器164的控制信号(CTRL),将处理寄存器组92中所期望的寄存器中的数据输入到运算电路160中。运算结果成为输入选择器162的输入。执行控制电路152根据对输入选择器162的控制信号(CTRL),向处理寄存器组154中所期望的寄存器输入运算结果。执行控制电路152一边更新特殊寄存器156中的程序计数器,一边执行任务。
处理数据保存到保存寄存器110中而不是存储器上的TCB中。处理寄存器组154不断地向各保存寄存器110输出处理数据。实际上,如前所述,何时将处理数据保存到保存寄存器110中,是由任务切换电路210来控制的。
保存数据是从保存寄存器110而不是从存储器上的TCB加载到处理寄存器组154中的。实际上,如前所述,加载哪个保存寄存器110中的处理数据以及何时加载,是由任务切换电路210来控制的。
连接处理寄存器组154和加载选择电路112、以及处理寄存器组154和保存寄存器110的总线能够传输的位数,设定为能够在一次处理中并行传输处理数据。因此,根据任务切换电路210发送的写入信号(WT),能够实现一次读出或写入数据。普通软件RTOS在任务切换时,需要暂时占用处理寄存器组154。与此相反,本实施例中的硬件RTOS没有必要将用于任务切换处理的特殊处理数据加载到处理寄存器组154中。当从任务A切换到任务B时,只需要将任务A的处理数据保存,然后加载任务B的处理数据,因此,处理寄存器组154无需配置系统用和用户用两面及通过堆栈执行数据替换处理。
图7是执行控制电路152使CPU时钟停止的构造的电路图。
第二AND门174的输入是原始时钟(CLK0)和第一AND门172的输出,第一AND门172的输出被反相。第一AND门172的输出是停止完成信号(HC)。由于停止完成信号(HC)通常是0,因此第二AND门174直接输出所输入的原始时钟(CLK0)作为CPU时钟(CLK)。CPU 150接收到第二AND门174所输出的CPU时钟时进行操作。当第一AND门172的输出是“1”时,换句话说,当停止完成信号(HC)=1时,第二AND门174的输出固定为零,以使CPU时钟(CLK)停止。
第一AND门172的输入是OR门176的输出和CPU忙信号(CBUSY),该CPU忙信号是负逻辑。CBUSY是从产生CPU 150内部循环的已知状态机中输出的信号。当CPU 150处于可停止状态时,CBUSY变成“1”。例如,当运算电路94执行了单个命令或者被锁定的多个命令的最后命令从而CPU处于可停止状态时,或者当已经停止提供CPU时钟时,CBUSY变成“0”。
OR门176的输入是命令解码器170的输出(SC_DETECT)和来自任务切换电路210的停止请求信号(HR)。命令解码器170内置有保持SC_DETECT的锁存电路。命令解码器170接收从CPU 150提取(fetch)的数据(FD)。当FD是系统调用命令时,命令解码器170输出SC_DETECT=1。通过内置锁存电路,即使在这之后FD变化,命令解码器170也继续输出SC_DETECT=1。命令解码器170中,还输入任务切换电路210发送给处理寄存器组154的写入信号(WT)。如前所述,当WT从0变为1时,保存数据被加载到处理寄存器组154中。该WT是在规定时间后从1返回到0的脉冲信号。当WT从1变为0时,命令解码器170的锁存电路被复位,命令解码器170取消SC_DETECT。SC_DETECT和写入信号(WT)之间的关系,将参照图8(b)进行详述。本实施例中的命令解码器170,是为了判定执行对象命令是否是系统调用而专门设置在执行控制电路152中的装置。作为变型例,命令解码器170可以与负责CPU 150的解码阶段的CPU解码器共用。这种情况下,可通过向CPU解码器追加当被解码的数据是系统调用命令时输出SC_DETECT=1的功能来实现命令解码器170。
当中断请求信号(INTR)发生时,任务切换电路210向执行控制电路152申请停止请求信号(HR),即当执行系统调用、或当申请停止请求信号(HR)时,OR门176的输出变成“1”。
综上所述,当执行系统调用或发生中断请求信号、且当CPU忙信号变成“0”时,第一AND门172的输出变成“1”,且第二AND门174不输出CPU时钟。
图8(a)是表示中断请求信号发生时各种信号之间的关系的时序图。
在图8(a)中,首先,在时刻t0,任务切换电路210检测出来自外部的中断请求信号(INTR)。任务切换电路210为了执行特殊任务,向执行控制电路152申请停止请求信号(HR)。输入时刻t1与检测时刻t0几乎是同时的。在时刻t1,CPU 150的状态机处于“任务执行中”,CBUSY=1。由于HR=1,所以OR门176输出“1”。但是由于CBUSY=1,因此CPU 150不停止。因此,即使输入HR=1,CPU时钟(CLK)也暂且与原始时钟(CLK0)同步输出。
经过一定时间,在时刻t2处,CBUSY=0。由于已经是HR=1,所以第一AND门172输出HC=1,从第二AND门174输出的CPU时钟维持为0。另一方面,任务切换电路210以申请HC为契机,开始从常规任务到特殊任务的任务切换。细节将在后面描述。任务切换所需时间是任务控制电路200的工作时钟的数倍。在申请HC后,任务控制电路200的工作时钟变化了规定次数(时刻t3)的条件下,任务控制电路200取消停止请求信号(HR)。由于HR=0,因此执行控制电路152恢复CPU时钟(CLK)。当CPU 150恢复处理时,CPU 150使CBUSY从0变为1(时刻t4)。由此,在CPU时钟停止的时刻t2至时刻t3期间,执行从常规任务到特殊任务的任务切换。
作为另一种处理方法,代替以任务控制电路200的工作时钟变化了规定次数为条件,而以任务控制电路200已完成任务切换为条件来取消HR。而且,执行控制电路152可以以取消HR为条件来取消HC。当HC=0时,执行控制电路152恢复CPU时钟(CLK)。由此,可以恢复任务的执行。
图8(b)是表示执行系统调用时各种信号之间的关系的时序图。
在图8(b)中,首先,在时刻t0,命令解码器170检测出系统调用,并使SC_DETECT从0变为1。在时刻t0,CPU 150的状态机处于“任务执行中”,CBUSY=1。由于SC_DETECT=1,所以OR门176输出“1”。但是由于CBUSY=1,因此CPU 150不停止。因此,即使输出SC_DETECT=1,CPU时钟(CLK)也暂且与原始时钟(CLK0)同步输出。
经过一定时间,在时刻t1,CBUSY=0。由于SC_DETECT=1、且CBUSY=1,因此取消HC,并停止CPU时钟。当输入HC=0时,任务切换电路210开始任务切换处理,并将写入信号(WT)输出到CPU 150。在WT从0变为1的时刻t2,保存数据被加载到处理寄存器组154中。由于写入信号(WT)是脉冲信号,因此在经过规定时间后的时刻t3,变成WT=0。根据检测出的WT:1→0的下降沿,锁存在命令解码器170中的SC_DETECT被复位(时刻t4)。此时,CBUSY从0变为1。由于CBUSY=1,因此HC=0,从而恢复CPU时钟。在CPU时钟停止的时刻t1至时刻t4期间,执行任务切换。
此外,作为其它处理方法,代替以检测出WT:1→0的下降沿为条件,而以任务控制电路200完成任务切换并取消HR为条件,执行控制电路152取消HC。而且,以HC=0为条件,复位SC_DETECT。执行控制电路152恢复CPU时钟(CLK),CBUSY从0变为1。
在任何情况下,CPU 150都无需知道在CPU时钟停止期间进行RUN-任务切换的情况。任务切换电路210在CPU时钟停止而使CPU 150处于冻结期间进行任务切换处理,因此CPU 150的处理和任务控制电路200的处理在事件序列中是分离的。
图9是用于说明流水线处理中CPU时钟停止时刻的示意图。
CPU 150通过从存储器中顺序读出多个命令到处理寄存器组154中并执行这些命令,来执行任务。作为任务执行单位的命令,分解为如下四个阶段(phase)。
1.F(提取(fetch)):从存储器中提取命令。
2.D(解码(decode)):解释命令。
3.E(执行(execution)):执行命令。
4.WB(回写(write back)):将执行结果写入存储器中。
当一个任务顺次执行命令1至命令5时,可以是命令1被执行完从F到WB阶段后,才执行命令2的F阶段。但是,为了更高效地执行,大多是在命令1的执行过程中就开始执行命令2。这种处理方法被称作流水线处理。例如,当命令1到达D阶段时,就开始命令2的F阶段。当命令1到达E阶段时,就执行命令2的D阶段和命令3的F阶段。由此,通过增加单位时间内执行的命令数,能够减少每个任务的执行时间。
并且,各阶段可以进一步细分为两个阶段。例如,F阶段可以分为F1和F2两个阶段。当命令1到达F2阶段时,开始命令2的F1阶段。当命令1到达D1阶段时,执行命令2的F2阶段和命令3的F1阶段。通过细分阶段,能够进一步有效利用CPU 150的计算资源。在图9中,说明了在将各阶段细分为两个阶段来执行的流水线处理中发生系统调用时的CPU时钟停止时刻。
在图9中,命令1在CPU时钟为“0”的时刻开始处理。在CPU时钟为“4”的时刻,命令1的解码完成。假设命令1为系统调用。命令解码器170使SC_DETECT从0变为1。接着,SC_DETECT从1返回到0的条件是:从任务切换电路210到处理寄存器组154的写入信号(WT)从1变为0。即使输出的是SC_DETECT=1,由于命令2~5已经在执行中或者执行启动完,因此还是CBUSY=1。因此,第二AND门174继续输出CPU时钟。但是,当SC_DETECT=1时,执行控制电路152暂时停止程序计数器的更新,使得新的命令不被提取。因而,命令6及其后续命令不会从存储器中被提取。
在CPU时钟为“8”的时刻,命令1执行完成,但是命令2~5正在执行中,因此CPU忙信号还是“1”。当到达CPU时钟为“12”的时刻时,命令5执行完成。此时,CPU忙信号变成“0”。之后,按照参照图8(b)所述的流程,停止提供CPU时钟。任务切换电路210将直到命令5的执行结束为止产生的处理数据保存到保存寄存器110中。根据这种停止方法,任务切换能够以不浪费执行系统调用后的命令执行结果的方式实现。当任务切换完成时,CPU忙信号再次设为“1”,命令解码器170的处理也得到恢复。由此,将再次提供CPU时钟。
作为另一种处理方法,也可以在系统调用命令执行完成的时刻,将CPU忙信号设为“0”,以停止提供CPU时钟。这种情况下,与系统调用命令同时执行的其它命令在执行过程中停止。中途停止的命令的中间处理结果记录在处理寄存器组154中后,保存到保存寄存器110中。当下次该任务变成RUN-任务时,接着执行中途停止的命令。例如,当某个命令在读取结束阶段被中途停止时,将从存储器中读出的命令和操作数保存到保存寄存器110中。当该任务恢复时,保存寄存器110中的数据被加载到处理寄存器组154中,以执行解码阶段及后续阶段。
图10是表示状态存储单元220和任务切换电路210之间的关系的电路图。
状态存储单元220包括状态寄存器250和定时器252。状态存储单元220存储任务的状态数据。另外,定时器252是在任务转换到READY状态或者WAIT状态时开始的定时器。任务转换到READY状态后所经过的时间称作“READY占用时间”,任务转换到WAIT状态后所经过的时间称作“WAIT占用时间”。定时器252以TIM信号方式不断地输出占用时间的值。在任务切换时,当任务转换到READY状态或者WAIT状态时,任务切换电路210驱动该任务的定时器252来开始测量时间。
状态存储单元220是如下所述的寄存器组。
(A)任务ID寄存器254:用于存储任务ID。任务ID寄存器254不断地向任务选择电路230输出表示任务ID的ID信号。以下将任务A的任务ID寄存器254向任务选择电路230输出的ID信号表示为“ID_A信号”。从状态存储单元220输出的所有其它信号也采用同样的表示方法。
(B)任务优先级寄存器256:用于存储任务优先级。任务优先级寄存器256不断地输出表示任务优先级的PR信号。“0”表示最高优先级,值越大表示任务优先级越低。
(C)任务状态寄存器258:用于存储任务状态。任务状态寄存器258不断地输出表示STOP、READY、RUN、WAIT、IDLE中的某一个的ST信号。此外,IDLE是指任务初始化之前的状态。
(D)任务启动地址寄存器260:用于存储存储器中的任务的TCB地址。任务启动地址寄存器输出AD信号。
(E)待机理由寄存器262:用于在任务处于WAIT状态时,存储构成WAIT解除条件的待机理由。待机理由是“信号量等待”、“事件等待”和“互斥量等待”中的某一个。待机理由寄存器262输出WR信号。
(F)信号量ID寄存器264:用于在任务以信号量等待为理由处于WAIT状态时,存储等待对象的信号量(以下简称为“待机信号量”)的信号量ID。信号量ID寄存器264输出SID信号。
(G)互斥量ID寄存器265:用于在任务以互斥量等待为理由处于WAIT状态时,存储等待对象的互斥量(以下简称为“待机互斥量”)的互斥量ID。互斥量ID输出MID信号。
(H)事件ID寄存器266:用于在任务以事件等待为理由处于WAIT状态时,存储等待对象的事件(以下简称为“待机事件”)的事件ID。事件ID寄存器266输出EID信号。
(I)待机标记寄存器268:用于在任务以事件等待为理由处于WAIT状态时,存储待机标记模式。待机标记寄存器268输出FL信号。
(J)标记条件寄存器270:用于在任务以事件等待为理由处于WAIT状态时,存储标记条件。标记条件寄存器270输出FLC信号。待机标记模式和标记条件将在后面详述。
(K)标记初始化寄存器272:用于存储表示是否有待机标记模式的数据。标记初始化寄存器272输出FLI信号。
(L)超时计数器274:超时值是在WAIT系列系统调用中指定的变量。超时计数器274存储超时值。任务切换电路210定期对各超时计数器274的超时值进行递减。超时计数器274输出TO信号。代替任务切换电路210对超时值进行递减,也可以是超时计数器274本身定期对其超时值自动地进行递减。
任务选择电路230根据各状态存储单元220输出的各种信号来选择任务。任务选择电路230包括以下电路。
(A)执行选择电路232:用于在任务切换时,选择下一个RUN-任务。执行选择电路232通常根据状态存储单元220不断输出的状态数据,来选择某一个任务作为RUN-任务。执行选择电路232的输入信号有ID、ST、PR和TIM四种。执行选择电路232输出下一个RUN-任务的任务ID。关于详细的电路结构,将参照图12进行详述。
(B)信号量选择电路234:用于通过释放信号量系统调用的执行,选择应该从WAIT状态转换到READY状态的任务。信号量选择电路234的输入为来自任务切换电路210的释放信号量系统调用释放的信号量(以下简称为“释放信号量”)的信号量ID。来自状态存储单元220的输入信号有ID、ST、WR、PR、SID和TIM六种。信号量选择电路234的输出信号是从WAIT状态转换到READY状态的任务的任务ID。如果不存在该任务,则输出如-1等的规定值。关于更具体的电路结构,将参照图13进行详述。
(C)事件选择电路236:用于通过设定事件系统调用的执行,选择从WAIT状态转换到READY状态的任务。事件选择电路236的输入为来自任务切换电路210的由设定事件系统调用设定的事件(以下简称为“设定事件”)的事件ID。来自状态存储单元220的输入信号有ID、ST、WR、EID、FL和FLC六种。事件选择电路236的输出信号为从WAIT状态转换到READY状态的任务的任务ID、以及该任务的FL、FLC。
(D)超时检测电路238:用于检测出处于WAIT状态的任务中超时计数器274的超时值变成零的任务。每当更新超时值时,驱动超时检测电路238。超时检测电路238的输入信号有ID、ST和TO三种,输出信号是该任务的任务ID。如果不存在该任务,则输出如-1等的规定值。
(E)互斥量电路240:用于通过释放互斥量系统调用的执行,选择从WAIT状态转换到READY状态的任务。互斥量电路240的输入信号为来自任务切换电路210的由释放互斥量系统调用释放的互斥量(以下简称为“释放互斥量”)的互斥量ID。来自状态存储单元220的输入信号有ID、ST、WR、PR、SID和TIM六种。互斥量电路240输出从WAIT状态转换到READY状态的任务的任务ID。如果不存在该任务,则输出如-1等的规定值。
(F)检索电路242:当任务切换电路210输入任务ID时,检索电路242输出该任务的全部状态数据。
下面通过关于任务切换的描述,对RUN-任务的选择、信号量、事件、互斥和超时,特别是任务选择电路230的处理,与普通技术进行比较说明。
[RUN-任务的选择]
[1]通过普通软件RTOS进行RUN-任务的选择
图11是表示普通RTOS进行RUN-任务选择时所采用的任务就绪表的图。
任务就绪表形成在存储器上,将各READY-任务的TCB用指针连接。优先级指针280设置在每个任务优先级上,指出对应任务优先级的任务的TCB的开始地址。在图11的任务就绪表中,任务优先级“0”的优先级指针280指向任务A的TCB的地址,任务优先级“1”的优先级指针280指向任务B的TCB的地址。任务A的TCB指向任务D的TCB的地址。
通用软件RTOS一边扫描该任务就绪表一边选择出下一个RUN-任务。在这个处理过程中,RTOS进行如下两个阶段的处理:
A.使RUN-任务从RUN状态转换到READY状态。
B.选择下一个RUN-任务,并使该选择出的任务的任务状态从READY状态转换到RUN状态。
将软件RTOS进行的处理分解成如下各处理。
<RUN-任务的状态转移>
这里,以任务J为RUN-任务来进行说明。
A1.RTOS将RUN-任务的任务ID存储在存储器中。RTOS根据该任务ID,获取任务J的TCB的地址。
A2.访问该TCB,获取任务J的任务优先级。假设该任务优先级为“0”。
A3.参考图11所示的任务就绪表,获取与任务J的任务优先级对应的优先级指针280。
A4.检测所获取的优先级指针280所指的TCB。这里检测出任务A的TCB。
A5.跟踪任务A的TCB所具有的指针,以检测出任务就绪表最末尾的TCB。图11中,任务就绪表的最末尾是任务F。
A6.配置任务F的TCB的指针指向任务J的TCB的地址。由此,任务J的TCB被追加到任务就绪表中。
A7.在任务J的TCB中设定“READY”。另外,处理数据被复制到该TCB的寄存器存储区域。
<READY-任务的状态转移>
B1.RTOS检测任务优先级“0”的优先级指针280指向哪个TCB。如果没有指向任何TCB,则检测任务优先级“1”的优先级指针280指向哪个TCB。RTOS一边以降低的任务优先级顺序检测该任务就绪表,一边试图确定任务,直到发现指向的TCB为止。该图中,指定任务A。
B2.将任务A从任务就绪表中移除。具体地说,重写任务优先级“0”的优先级指针280,以取代任务A来指向任务D的TCB的地址。另外,通过设定NULL使得任务A的指针不指向任务D的地址。由此,任务A的TCB从任务就绪表中移除。
B3.在任务A的TCB中设定“RUN”。另外,保存在任务A的TCB的寄存器存储区域中的处理数据被加载到处理寄存器组中。
如上所述,普通软件RTOS采用该任务就绪表进行任务切换,即RTOS根据下述策略,从多个READY-任务中选择RUN-任务。
1.所选择的任务为READY-任务(第一条件)。
2.所选择的任务为READY-任务中任务优先级最高的任务(第二条件)。
3.当存在多个任务优先级最高的任务时,所选择的任务是转换为READY状态的时间最久的任务(第三条件)。
这三个条件统称为“RUN任务选择条件”。任务处理器100的执行选择电路232通过硬件来实现这种RTOS的任务调度功能。
[2]通过根据基本实施方式的硬件RTOS所进行的RUN-任务的选择
图12是执行选择电路232的电路图。
这里,假设从任务0~任务7共八个任务中选择出RUN-任务。执行选择电路232包括四个第一比较电路290(290a~290d)、两个第二比较电路292(292a、292b)、以及一个第三比较电路294。另外,还包括八个判定电路296(296a~296h)。
判定电路296的输入信号为表示任务状态的ST信号。当该ST信号表示READY时,判定电路296输出的CID信号为“1”;当该ST信号表示READY之外的任务状态时,则输出的CID信号为“0”。判定电路296根据上述RUN-任务选择条件中的第一条件进行判定。第一比较电路290的输入为两个任务的ID、PR和TIM、以及来自判定电路296的CID信号。
以第一比较电路290a为例进行说明。第一比较电路290a比较任务0和任务1,以根据上述的RUN任务选择条件选择出更适合的任务。
第一判定:首先,比较分别从判定电路296a和判定电路296b输出的CID信号。如果某一个CID信号是“1”,换句话说,如果只有一个任务处于READY状态,则第一比较电路290a输出该任务的ID、PR和TIM。如果两个CID信号都是“0”,即哪个任务都不处于READY状态,则第一比较电路290a输出ID=PR=TIM=NULL。这表示哪个任务都没有被选择。如果两个CID信号都是“1”,即两个任务都处于READY状态,则执行下面的第二判定。
第二判定:比较任务0的PR信号和任务1的PR信号,以选择出任务优先级较高的任务。例如,如果任务0的任务优先级是“1”、任务1的任务优先级是“2”,则第一比较电路290a输出任务0的ID、PR和TIM。通过第二判定,能够选择出任务优先级最高的任务作为RUN-任务的候选。如果任务0和任务1的任务优先级相同,则执行下面的第三判定。
第三判定:比较任务0的TIM信号和任务1的TIM信号,以选择出READY占用时间较长的任务。如果对应的READY占用时间相同,则选择任务0。由于仅通过比较占用时间的大小就能够进行判定,因此将无需进行如任务就绪表一样的TCB顺序管理。
由此,任务0和任务1、任务2和任务3、任务4和任务5、以及任务6和任务7,分别根据RUN-任务选择条件进行比较。第二比较电路292通过测试来自两个第一比较电路290的输出,来进一步筛选RUN-任务的候选。第二比较电路292a根据第一比较电路290a和第一比较电路290b的输出来执行任务选择。因此,第二比较电路292a输出任务0~任务3中最符合RUN-任务选择条件的任务的ID、PR和TIM。第三比较电路294也以相同的方式进行操作,第三比较电路294输出任务0~任务7中某一个任务的任务ID。
根据这种处理方法,能够通过硬件来实现RUN-任务选择条件。普通软件RTOS一边访问任务就绪表一边选择RUN-任务。但是本实施例中的执行选择电路232根据从状态存储单元220不断输出的状态数据,选择RUN-任务。由执行选择电路232执行的处理总结如下。
<RUN-任务的状态转移>
这里,假设任务J为该RUN-任务。
A1.任务切换电路210在任务J的任务状态寄存器258中设定“READY”。
A2.任务切换电路210设置任务J的定时器252,以开始测量READY占用时间。
由此,任务J从RUN状态转换到READY状态。如前所述,处理数据保存在任务J的保存寄存器110中。连接处理寄存器组154和保存寄存器110的总线,能够并行传输处理数据,从而A1和A2的处理能够在一个时钟时间内执行。
<READY-任务的状态转移>
B1.当任务J的状态转移完成时,任务切换电路210根据执行选择电路232所输出的任务ID确定RUN-任务,并在该确定的任务的任务状态寄存器258中设定“RUN”。
由此,所确定的任务从READY状态转换到RUN状态。所确定的任务的处理数据从保存寄存器110加载到处理寄存器组154中。连接保存寄存器110和处理寄存器组154的总线,也能够并行传输处理数据,从而B1的处理能够在一个时钟时间内执行。
软件RTOS在任务切换时,由于例如访问任务就绪表等原因会消耗CPU的很多CPU时钟时间。与此相反,本实施例中的任务控制电路200能够在很短的时间内完成任务切换。由于状态存储单元220不断地将状态数据输出给执行选择电路232,因此执行选择电路232不断地输出某一个任务的任务ID。不是在任务切换发生后才开始RUN-任务的选择处理,而是根据任务切换发生时的执行选择电路232的输出来执行RUN-任务的选择,这对任务切换高速化也有贡献。以上说明假设有八个任务,但是通过增加比较电路的阶段数,能够对更多的任务进行寻址。
[信号量处理]
图13是表示由通用RTOS进行的信号量处理中所采用的等待信号量表的图。
在说明等待信号量表之前,先简单说明信号量。信号量表212中对应记录信号量ID和信号量计数器。在信号量计数器中将初始值设定为有限数。例如,假设设定为信号量ID=4,信号量计数器=3。当某一个任务执行将信号量ID=4的信号量作为待机信号量的等待信号量系统调用时,任务切换电路210使待机信号量的信号量计数器递减。每当通过等待信号量事件调用来请求获取时,递减信号量计数器,当信号量计数器变成0时,无法再获取信号量。执行将信号量计数器为0的信号量作为待机信号量的等待信号量系统调用的任务,状态转换到WAIT状态。
另一方面,当某一个任务执行将信号量ID=4的信号量作为释放信号量的释放信号量系统调用时,任务切换电路210使信号量表212的信号量计数器递增。综上所述:
当信号量计数器>0时:执行等待信号量系统调用的任务,从RUN转换到READY。此时递减信号量计数器。
当信号量计数器=0时:执行等待信号量系统调用的任务,从RUN转换到WAIT。不递减信号量计数器。
为了使执行等待信号量系统调用的任务从WAIT状态转换到READY状态,其它任务需要执行释放信号量系统调用。
[1]由普通软件RTOS进行的信号量处理
普通软件RTOS通过采用等待信号量表来管理以信号量等待为理由处于WAIT状态的任务(以下特别称作“信号量等待任务”)的TCB。等待信号量表是具有与图11所示的任务就绪表类似构造的列表,形成在存储器上。各信号量等待任务的TCB由指针连接。优先级指针280指向对应任务优先级的信号量等待任务的TCB的开始地址。
当执行释放信号量系统调用时,普通软件RTOS一边扫描该等待信号量表一边选择应从WAIT状态转换到READY状态的信号量等待任务。执行等待信号量系统调用以及执行释放信号量系统调用时,RTOS执行的处理如下。
<等待信号量系统调用的执行>
这里,假设任务J为RUN-任务。
A1.RTOS将RUN-任务的任务ID存储在存储器中。根据该任务ID,获取任务J的TCB的地址。
A2.检测在等待信号量系统调用中所指定的待机信号量的信号量计数器。以下根据信号量计数器的值,处理被分别说明。
(当信号量计数器>0时)
A3.RTOS使待机信号量的信号量计数器递减。
A4.在任务J的TCB中设定“READY”。这种情况下,任务J的TCB被追加到任务就绪表中。
(当信号量计数器=0时)
A3.RTOS访问该TCB,以获取任务J的任务优先级。假设任务优先级为“0”。
A4.根据等待信号量表,获取与任务J的任务优先级对应的优先级指针。
A5.检测所获取的优先级指针所指的TCB。这里,检测到任务A的TCB。
A6.跟踪任务A的TCB所具有的指针,以检测出该等待信号量表中最末尾的TCB。如图13所示,任务F在该等待信号量表的最末尾。
A7.配置任务F的TCB的指针指向任务J的TCB的地址。由此,任务J的TCB被追加到等待信号量表中。
A8.在任务J的TCB中设定“WAIT”。另外,还设定待机信号量的信号量ID。
<释放信号量系统调用的执行>
B1.RTOS一边按顺序跟踪任务优先级为“0”的任务,一边搜索以释放信号量为待机信号量的信号量等待任务。如果不存在这样的任务,则将任务优先级为“1”的任务设为搜索对象。根据是否搜索到以释放信号量为待机信号量的信号量等待任务,分别执行不同的处理。
(搜索到时)
B2.以搜索到的任务是任务E来进行说明。RTOS在任务E的TCB中设定“READY”。另外,清除待机信号量的信号量ID。
B3.将任务E的TCB从等待信号量表中移除。
B4.使释放信号量的任务的状态从RUN状态转换到READY状态。该任务的TCB被追加到任务就绪表中。
(未搜索到时)
B2.RTOS使信号量计数器递增。
B3.使释放信号量的任务的状态从RUN状态转换到READY状态。该任务的TCB被追加到任务就绪表中。
普通软件RTOS通过管理上述等待信号量表,进行与信号量相关的处理。在释放信号量时,RTOS根据以下策略从多个WAIT-任务中选择READY-任务。
1.所选择的任务应该为WAIT-任务(第一条件)。
2.所选择的任务应该为WAIT-任务中将释放信号量作为待机信号量的任务(第二条件)。
3.当存在多个这种任务时,所选择的任务应该具有最高的任务优先级(第三条件)。
4.如果存在多个任务优先级最高的任务,所选择的任务应该是转换为WAIT状态的时间最久的任务(第四条件)。
这四个条件统称为“信号量待机解除条件”。任务处理器100的信号量选择电路234通过硬件来实现这种RTOS的任务调度功能。
[2]由根据基本实施方式的硬件RTOS进行的信号量处理
图14是信号量选择电路234的电路图。
这里,也是以任务0~任务7共八个任务为例进行说明。信号量选择电路234包括四个第一比较电路300(300a~300d)、两个第二比较电路302(302a、302b)、以及一个第三比较电路304。另外,还包括八个判定电路306(306a~306h)。
判定电路306的输入信号为来自状态存储单元220的ST、WR、SID信号和来自任务切换电路210的表示信号量ID的信号。这里所输入的信号量ID是释放信号量的信号量ID。如果对应的任务是以释放信号量为待机信号量的信号量等待任务,则判定电路306输出的CID信号为“1”,如果不是,则输出的CID信号为“0”。判定电路306输出基于上述信号量待机解除条件中的第一条件和第二条件的判定结果。第一比较电路300的输入信号为两个任务的ID、PR和TIM、以及来自判定电路306的CID信号。
第一比较电路300是根据信号量待机解除条件中的第三条件和第四条件进行判定的电路。第二比较电路302和第三比较电路304也同样。以上已经说明,RUN-任务选择条件的第二条件和第三条件,与信号量待机解除条件的第三条件和第四条件相同。执行选择电路232的各比较电路是比较任务的状态数据(PR、TIM)的电路。另一方面,信号量选择电路234的各比较电路也是比较任务的状态数据(PR、TIM)的电路。因而,执行选择电路232的第一比较电路290和信号量选择电路234的第一比较电路300是内置有相同逻辑的电路,能够共用。各任务在通过判定电路306基于第一条件和第二条件进行判定的基础上,通过第一比较电路300进行判定处理。之后通过与执行选择电路232相同的判定处理,第三比较电路304输出某一个任务ID。当执行等待信号量系统调用以及当执行释放信号量系统调用时进行如下处理。
<等待信号量系统调用的执行>
这里,假设任务J为RUN-任务。
A1.任务切换电路210从信号量表212中检测在等待信号量系统调用中所指定的信号量的信号量计数器。以下根据信号量计数器的值,处理被分别说明。
(当信号量计数器>0时)
A2.任务切换电路210使信号量表212的信号量计数器递减。
A3.在任务J的任务状态寄存器258中设定“READY”。此时,任务切换电路210设置RUN-任务的定时器252,以开始测量READY占用时间。
(当信号量计数器=0时)
A2.任务切换电路210在任务J的任务状态寄存器258中设定“WAIT”,在待机理由寄存器262中设定“信号量等待”,在信号量ID寄存器264中设定待机信号量的信号量ID,并设定定时器252以开始测量WAIT占用时间。
由此,执行等待信号量系统调用的任务,从RUN状态转换到READY状态或者WAIT状态。
<释放信号量系统调用的执行>
B1.任务切换电路210将释放信号量的信号量ID输入到各判定电路306中。各判定电路306根据该信号量ID,判定是否满足信号量待机解除条件中的第一条件以及第二条件。因而,各个第一比较电路300根据第三条件以及第四条件选择任务。
(当某一个判定电路306输出“1”,第三比较电路304输出某一个任务ID时)
B2.任务切换电路210在所检测出的任务的任务状态寄存器258中设定“READY”,清除待机理由寄存器262和信号量ID寄存器264,并使定时器252开始测量READY占用时间。
B3.在执行系统调用的任务的任务状态寄存器258中设定“READY”,并开始测量READY占用时间。
(当没有判定电路306输出“1”,第三比较电路304不输出任何一个任务ID时)
B2.任务切换电路210使信号量表212的信号量计数器递增。
B3.使执行系统调用的任务的状态从RUN状态转换到READY状态。
由于状态存储单元220不断地将状态数据输出给信号量选择电路234,因此当任务切换电路210将信号量ID输入给判定电路306时,信号量选择电路234能够立即执行选择处理。
[互斥量处理]
与信号量类似,互斥量也用于任务之间的同步处理。互斥量和信号量存在以下几点不同。
1.信号量计数器可设定为1以上的整数。与此相对,互斥量是信号量计数器为1或者0的特殊信号量。当信号量计数器为2以上时,能够有2个以上的任务获得相同的信号量。但是,对于互斥量,能够获得某互斥量的任务通常只有一个。
2.能够通过释放信号量系统调用释放信号量的任务,不限于通过等待信号量系统调用来获得信号量的任务。与此相对,能够通过释放互斥量系统调用释放互斥量的任务,只能是通过等待互斥量系统调用来获得互斥量的任务。
在释放互斥量时,任务切换电路210从多个WAIT-任务中选择READY-任务的策略如下。
1.所选择的任务应该是WAIT-任务(第一条件)。
2.所选择的任务应该是WAIT-任务中以释放互斥量为待机互斥量的任务(第二条件)。
3.当存在多个这种任务时,所选择的任务应该是任务优先级最高的任务(第三条件)。
4.当存在多个任务优先级最高的任务时,所选择的任务应该是转换为WAIT状态时间最久的任务(第四条件)。
这四个条件统称为“互斥量待机解除条件”。
因而,当执行等待互斥量系统调用以及当执行释放互斥量系统调用时,根据基本实施方式的硬件RTOS执行如下处理。信号量表212中对应地存储互斥量ID和表示该互斥量是否被哪一个任务占用的占用状态数据。当该互斥量没有被占用时,占用状态数据为“0”,当该互斥量被占用时,占用状态数据为占用该互斥量的任务的任务ID。
<等待互斥量系统调用的执行>
这里,假设任务J为RUN-任务。
A1.任务切换电路210检测在等待互斥量系统调用中指定的互斥量是否被占用。以下根据该互斥量的占用状态,处理被分别说明。
(当互斥量没有被占用时)
A2.任务切换电路210将执行系统调用的任务的任务ID作为互斥量占用状态数据记录。
A3.在任务J的任务状态寄存器258中设定“READY”。此时,任务切换电路210设置RUN-任务的定时器252,以开始测量READY占用时间。
(当互斥量被占用时)
A2.任务切换电路210在任务J的任务状态寄存器258中设置“WAIT”,在待机理由寄存器262中设置“互斥量等待”,在互斥量ID寄存器265中设定待机互斥量的互斥量ID,并设定定时器252以开始测量WAIT占用时间。
<释放互斥量系统调用的执行>
B1.任务切换电路210在执行系统调用的任务占用释放互斥量的条件下,将释放信号量ID输入给互斥量电路240。互斥量电路240也包括如图14所示的多阶段连接的比较电路、以及判定是否满足互斥量待机解除条件中第一条件以及第二条件的判定电路。该判定电路以该互斥量为对象,只有当互斥量待机条件中的第一条件以及第二条件同时满足时才输出“1”。此外,当没有占用释放互斥量的任务执行释放互斥量系统调用时,使该任务的状态从RUN状态转换到READY状态。
(当某一个判定电路输出“1”,互斥量电路240输出某一个任务ID时)
B2.任务切换电路210在所检测出的任务的任务状态寄存器258中设定“READY”,清除待机理由寄存器262和互斥量ID寄存器265,并使定时器252开始测量READY占用时间。
B3.在执行系统调用的任务的任务状态寄存器258中设定“READY”,并开始测量READY占用时间。
(当没有判定电路输出“1”,互斥量电路240不输出任何一个任务ID时)
B2.任务切换电路210在信号量表212中将互斥量设定为非占用状态。
B3.使执行系统调用的任务的状态从RUN状态转换到READY状态。
[事件处理]
下面简单说明基本实施方式中的事件管理。事件表214对应地记录事件ID和标记模式(以下称作“当前标记模式”)。标记模式是8位的比特模式。
设定事件系统调用是以事件ID和标记模式(以下称作“设定标记模式”)为参数来更新当前标记模式的系统调用。当执行设定事件系统调用时,对应该事件的当前标记模式更新为与设定标记模式的逻辑或。例如,假如当前标记模式为“00001100”、设定标记模式为“00000101”,则当前标记模式变为“00001101”。以下关于各标记模式,从左至右依次称作第0比特,第1比特,…,以及第7比特。
等待事件系统调用是用于等待待机事件的当前标记模式满足规定条件的系统调用,以事件ID、标记模式(以下称作“待机标记模式”)以及标记条件作为参数。当执行等待事件系统调用时,判定当前标记模式和待机标记模式之间是否满足标记条件。标记条件是逻辑或(OR)或者逻辑与(AND)。在标记条件是逻辑与(AND)的情况下,WAIT解除条件是指:对于待机标记模式中为“1”的全部比特,当前标记模式中的对应比特也全部是“1”。在标记条件是逻辑或(OR)的情况下,WAIT解除条件是指:对与待机标记模式中为“1”的至少一比特,当前标记模式的对应比特也是“1”。例如,在当前标记模式为“00001101”、待机标记模式为“00000011”、标记条件是“逻辑或(OR)”的情况下,待机标记模式的第6比特以及第7比特是1,当前标记模式的第7比特是1,因此这种情况下,在等待事件系统调用中指定的WAIT解除条件满足。另一方面,在标记条件是“逻辑与(AND)”的情况下,由于当前标记模式的第6比特是“0”,因此WAIT解除条件不满足。
[1]由普通软件RTOS所进行的事件处理
当执行等待事件系统调用以及当执行设定事件系统调用时,通用RTOS执行如下处理。在通用RTOS中,为了管理事件,在存储器上保持有事件表。在该事件表中,不仅存储有事件ID、当前标记模式,通常还对应地存储有以该事件为待机事件而处于WAIT状态的任务(以下称作“事件等待任务”)的任务ID、待机标记模式、和标记条件。
<等待事件系统调用的执行>
A1.RTOS从事件表中读出由系统调用指定的事件的当前标记模式。
A2.按照标记条件比较当前标记模式和待机标记模式,以判定WAIT解除条件是否满足。
(当WAIT解除条件满足时)
A3.使执行系统调用的任务的任务状态从RUN状态转换到READY状态。
(当WAIT解除条件不满足时)
A3.在事件表中记录执行系统调用的任务的任务ID。
A4.在事件表中记录待机标记模式。
A5.在事件表中记录标记条件。
A6.使执行系统调用的任务的任务状态从RUN状态转换到WAIT状态。
<设定事件系统调用的执行>
B1.RTOS从事件表中读出与系统调用中指定的事件对应的当前标记模式、任务ID、待机标记模式、以及标记条件。
B2.将当前标记模式和设定标记模式的逻辑或作为新的当前标记模式进行记录。
(当不存在关于指定事件的事件等待任务时,或者当即使存在关于指定事件的事件等待任务,而根据待机标记模式和标记条件,WAIT解除条件不满足时)
B3.使执行系统调用的任务的任务状态从RUN状态转换到READY状态。
(当存在关于指定事件的事件等待任务,且WAIT解除条件满足时)
B3.使事件等待任务的任务状态从WAIT状态转换到READY状态。
B4.清除事件表中的待机任务ID、待机标记模式和标记条件。
B5.使执行系统调用的任务的任务状态从RUN状态转换到READY状态。另外,进行RUN-任务的选择。
当执行设定事件系统调用时,RTOS从多个WAIT-任务中选择READY-任务的策略如下。
1.所选择的任务应该是WAIT-任务(第一条件)。
2.所选择的任务应该是WAIT-任务中以指定事件为待机事件的任务(第二条件)。
3.所选择的任务应该是对待机标记模式、当前标记模式和标记条件进行比较,WAIT解除条件满足的任务(第三条件)。
这三个条件统称为“事件待机解除条件”。
[2]由根据基本实施方式的硬件RTOS所进行的事件处理
当任务处理器100执行等待事件系统调用以及执行设定事件系统调用时,RTOS执行如下处理。内置于任务处理器100的信号量表212对应存储事件ID和当前标记模式。待机任务ID和待机标记模式等信息,存储在状态存储单元220中。
<等待事件系统调用的执行>
A1.任务切换电路210从事件表214中读出当前标记模式。
A2.任务切换电路210根据标记条件比较当前标记模式和待机标记模式,以判定WAIT解除条件是否满足。
(当WAIT解除条件满足时)
A3.在执行系统调用的任务的任务状态寄存器258中设定“READY”。
(当WAIT解除条件不满足时)
A3.任务切换电路210在执行系统调用的任务的任务状态寄存器258中设定“WAIT”,在待机理由寄存器262中设定“事件等待”,在事件ID寄存器266中设定待机事件的事件ID,在待机标记寄存器268中设定待机标记模式,以及在标记条件寄存器270中设定标记条件。
<设定事件系统调用的执行>
B1.任务切换电路210从事件表214中读出当前标记模式,并且将系统调用中指定的事件的事件ID输入给事件选择电路236。
B2.任务切换电路210对设定标记模式和来自事件表214的当前标记模式进行逻辑或运算。
B3.事件选择电路236根据所输入的事件ID选择满足事件待机条件的任务。此时,也可以不考虑任务优先级和WAIT占用时间来选择多个任务。
(当存在满足事件待机解除条件的任务时)
B4.任务切换电路210在事件等待任务的任务状态寄存器258中设定“READY”,清除事件ID寄存器266、待机标记寄存器268、和标记条件寄存器270。
B5.使执行系统调用的任务的任务状态从RUN状态转换到READY状态。
(当不存在满足事件待机解除条件的任务时)
B4.任务切换电路210使执行系统调用的任务的任务状态从RUN状态转换到READY状态。
[超时处理]
当WAIT解除条件满足时,转换到WAIT状态的任务转换到READY状态。但是,如果因为某种外因或应用程序故障而阻碍WAIT解除条件满足时,该任务将不能从WAIT状态离开。因此,通常在任务转换到WAIT状态时设定超时值。超时值定期递减,当变成零时,即使WAIT解除条件不满足,任务也从WAIT状态转换到READY状态,即防止任务在WAIT状态停留的时间超过超时值。
[1]由普通软件RTOS所进行的超时处理
对于普通软件RTOS,在处于WAIT状态的任务的TCB中设定超时值,该超时值周期性地递减。RTOS周期性地向CPU处理申请中断,以检查全部TCB,以及检测出超时值到达0的WAIT-任务。当检测出这种任务时,RTOS使该任务的任务状态从WAIT状态转换到READY状态。
[2]由根据基本实施方式的硬件RTOS所进行的超时处理
另一方面,在基本实施方式中,任务切换电路210周期性地递减各超时计数器274的超时值。当执行WAIT系列系统调用时,超时值设定为参数。任务切换电路210在执行该系统调用的任务的超时计数器274中设定超时值。
由于超时值的递减处理不需要CPU 150参与,因此任务切换电路210能够不依赖于任务执行处理进行超时值的更新。因此,即使在CPU 150执行任务的过程中,任务控制电路200也能够自动地更新超时值。由于状态数据不断地被输入到超时检测电路238中,因此超时检测电路238能够在更新超时值的同时,检测出超时值到达0的任务。超时检测电路238输出检测出的这种任务的任务ID。当从超时检测电路238获得该任务ID时,任务切换电路210便确定发生了超时,随后申请HC以停止提供CPU时钟。任务控制电路200使发生超时的WAIT-任务转换到READY状态,并且使RUN-任务转换到READY状态。任务切换电路210从READY-任务中选择下一个应执行的任务。另外,任务切换电路210重启已发生超时的任务的定时器252,以测量READY占用时间。
根据这种处理方法,在任务执行过程中,即CPU时钟运行过程中发生超时时,能够通过立即向CPU 150申请中断,来执行任务切换。另外,在任务执行过程中,任务切换电路210能够不依赖CPU 150的处理能力独立地执行超时值的更新处理。
[作为有限状态机的任务切换电路210]
图15是任务切换电路210的状态转移图。
在初始化处理(A1)之前,全部任务都处于IDLE状态。当初始化处理完成时(S10),某一个任务成为RUN-任务,任务切换电路210处于任务执行状态(A2)。当检测出中断请求信号时(S12),特殊任务成为RUN-任务,执行中断处理(A3)。当中断处理完成时(S14),任务切换电路210从常规任务中选择RUN-任务,并转换到A2。
另外,在任务执行过程中(A2),执行系统调用时(S16),执行系统调用处理(A4)。在未发生任务切换即RUN-任务切换的情况下(S18),任务切换电路210返回到A2。另一方面,在由于系统调用处理(A4)而发生任务切换的情况下(S20),任务切换电路210根据执行选择电路232的输出来进行RUN-任务的选择(A5)。当任务切换完成时(S22),处理状态转换到A2。
最后,结合基本实施方式,还附带说明一下只安装作为任务处理器100的主要部件的保存电路120和任务控制电路200中的一个的情况。
[未配置任务控制电路200的类型的任务处理器100]
图16是图5所示的任务处理器100中未配置任务控制电路200的任务处理器100的电路图。
代替配置任务控制电路200,追加有寄存器切换控制电路322和处理数据存储单元320。由于未配置任务控制电路200,因此任务调度功能由软件RTOS来实现。因而,RTOS在任务切换时,需要暂时取得CPU 150的使用权。处理数据存储单元320通常存储用于RTOS的处理数据。当RTOS取得CPU 150的使用权时,处理数据存储单元320调换存储在处理数据存储单元320中的RTOS用处理数据和存储在特殊寄存器156中的任务用处理数据。以下以从任务A向任务B切换来说明该处理过程。
A1.当任务A执行系统调用时,将系统调用中的变量以及系统调用ID记录在某些通用寄存器158内。
A2.寄存器切换控制电路322将任务A的处理数据移动到处理数据存储单元320中,并将处理数据存储单元320中的RTOS用处理数据加载到处理寄存器组154中。在该阶段,RTOS取得CPU 150的使用权。
A3.寄存器切换控制电路322向保存寄存器110a输入写入信号,以将处理数据存储单元320中存储的任务A用处理数据保存到保存寄存器110中。
A4.RTOS根据记录在通用寄存器158中的系统调用变量和ID,执行与系统调用相对应的处理。另外,将任务A的TCB中的任务状态数据设定为“READY”,并向任务就绪表中追加任务A的TCB。
B1.接着,RTOS按照所述的RUN-任务选择条件,选择RUN-任务,这里是选择任务B。
B2.RTOS指示寄存器切换控制电路322将指定任务B的任务选择信号输入到加载选择电路112中。由此,处理数据从保存寄存器110b移动到处理数据存储单元320中。
B3.寄存器切换控制电路322调换处理数据存储单元320中的任务B用处理数据和处理寄存器组154中的RTOS用处理数据。由此,任务B取得CPU 150的使用权。
根据这种处理方法,与配置任务控制电路200的图5所示的任务处理器100相比,能够使任务处理器100整体电路小型化。RTOS是以软件实现的,但是处理数据的加载/保存是能够由来自寄存器切换控制电路322的信号来硬件控制的。如果将分别连接处理寄存器组154、处理数据存储单元320、加载选择电路112、和保存寄存器110的总线设定为能够并行传输处理数据的位数,则与将处理数据保存到TCB中和从TCB加载处理数据相比,能够实现更高速的任务切换。
[未配置保存电路120的类型的任务处理器100]
图17是图5所示的任务处理器100中未配置保存电路120的任务处理器100的电路图。
代替配置保存电路120,追加有中断接口电路324。由于未配置保存电路120,因此处理数据保存到存储器的TCB中。处理数据的保存/加载由基于软件的RTOS来实现。因而,在任务切换时,RTOS需要暂时取得CPU 150的使用权。以下以从任务A向任务B切换来说明该处理过程。
当通过执行系统调用来启动任务切换时,首先软件RTOS将任务A的处理数据保存到任务A的TCB中。而且,将RTOS用处理数据加载到处理寄存器组154中。此时的处理方法与参照图3说明的内容相似。
软件RTOS向中断接口电路324中写入系统调用的参数。执行控制电路152使CPU 150的CPU时钟停止。中断接口电路324使任务控制电路200执行任务切换。任务切换电路210,首先将任务A的任务状态寄存器258设定为READY,并根据来自任务选择电路230的输出选择作为下一个RUN-任务的任务B。任务切换电路210指示中断接口电路324加载任务B的处理数据。这时,中断接口电路324使执行控制电路152恢复CPU时钟。另外,中断接口电路324通知软件RTOS已经选择了任务B。软件RTOS访问任务B的TCB,以将任务B的处理数据加载到处理寄存器组154中。
根据这种处理方法,与配置保存电路120的图5所示任务处理器100相比,能够使任务处理器100整体电路小型化。RTOS功能的一部分是以软件实现的,但是任务选择处理由任务控制电路200来实现。
与参照图2以及图3说明的软件RTOS不同,图16以及图17所示的任务处理器100,能够任意地将RTOS功能的一部分硬件化。如参照图16所述,由于配置了保存电路120,而无需访问用于处理数据保存/加载的TCB。因此,能够通过寄存器切换控制电路322来执行处理数据的保存/加载处理。另外,如参照图17所述,由于配置了任务控制电路200,因此软件RTOS能够将任务选择功能转移给任务控制电路200。
如参照图5所述,在配置了保存电路120和任务控制电路200的任务处理器100的情况下,能够将RTOS的任务调度功能完全硬件化。由于在任务转换时没有必要访问存储器中的TCB,因此使任务切换处理的速度进一步提高。本发明人等人的实验表明:与参照图3说明的普通软件RTOS相比,基本实施方式中的任务处理器100以约100倍的速度进行工作。
[改进的实施方式]
下面说明通过硬件来实现双输入型队列算法的改进实施方式中的任务处理器100。基本实施方式中的任务处理器100配置了基于定时器管理的任务调度功能。基本实施方式中的任务调度是“当任务优先级相同时,优先向等待时间最长的任务分配执行权”的算法。以下将这种任务调度称作“公平型任务调度”。
参照图11说明根据公平型任务调度的构思管理任务就绪表的方法。当为RUN-任务的任务J返回到READY状态时,任务J被安排在该表最末尾的任务F的后面。在任务J之后,任务A转换为RUN-任务。因此在任务优先级“0”的优先级指针280中,以任务D、…、任务F、任务J的顺序连接有各任务的TCB。直到任务F的执行结束之前,不向任务J提供执行权。公平型任务调度中的处理方法类似于FIFO的算法,即队列算法。因为该算法适用于基于定时器的管理,因此能够采用定时器通过硬件来实现公平型任务调度。
另一方面,某些软件OS采用“当任务优先级相同时,优先向曾经转换为RUN-任务的任务分配执行权”的任务调度。以下将这种任务调度称作“再执行优先型任务调度”。在再执行优先型任务调度中,返回到READY状态的任务J(其为RUN-任务)被放入表的起始处而不是最末尾。在任务J之后,任务A转换为RUN-任务。因此在任务优先级“0”的优先级指针280中,以任务J、任务D、…、任务F的顺序连接有各任务的TCB。当任务A结束时,优先于任务D、任务F再次向任务J提供执行权。当尽可能想总体执行曾经得到过执行权的任务时,再执行优先型任务调度是有效的。可以说再执行优先型任务调度包括LIFO算法,即堆栈算法。在改进实施方式中,通过硬件实现基本上为FIFO设计但也能够与LIFO相容的双输入型队列算法,从而实现再执行优先型任务调度。
此外,双输入型队列算法不仅在再执行优先型任务调度中还在普通应用程序中有用。因此,通过硬件实现双输入型队列算法有效提高了各种计算机程序的处理速度。
图18是改进实施方式中的任务处理器100的电路图。
除了CPU 150之外,改进实施方式中的任务处理器100还包括保存电路120和任务控制电路200。但是,改进实施方式中的任务切换电路210包括主电路400、写入电路402、队列控制电路404以及最大值选择电路406。主电路400是具备与基本实施方式中的任务切换电路210大体相同的功能的电路。因此,改进实施方式中的任务切换电路210被配置成除了与基本实施方式中的任务切换电路210一致的主电路400,还包括写入电路402、队列控制电路404以及最大值选择电路406。状态存储单元220不仅向任务选择电路230而且还向最大值选择电路406、队列控制电路404不断地输出全部任务的全部状态数据。
图19是改进实施方式中的任务控制电路200的部分电路图。
任务控制电路200的基本结构与图10所示的电路结构大体相同。分别与各任务相对应的各状态寄存器250包括任务ID寄存器410、任务优先级寄存器412、队列顺序寄存器414、以及队列标识寄存器416。状态寄存器250也可以包括其它的寄存器,但是这里重点说明与双输入型队列算法相关的那些寄存器。
(A)任务ID寄存器410:用于存储任务ID,与基本实施方式所示的任务ID寄存器254相同。任务ID寄存器410不断地输出表示任务ID的EID_S信号。
(B)任务优先级寄存器412:用于存储任务优先级(PR),与基本实施方式所示的任务优先级寄存器256相同。PR_S信号被不断地输出。
(C)队列顺序寄存器414:用于存储表示后述的虚拟队列中的输入顺序的“顺序值(ODR)”。顺序值越大,表示任务置于虚拟队列的更深处。详细情况将在后面描述。顺序值作为ODR_S信号被不断地输出。
(D)队列标识寄存器416:用于存储表示虚拟队列的“队列ID(QID)”。QID_S信号被不断地输出。
任务优先级寄存器412、队列顺序寄存器414以及队列标识寄存器416特别是作为用于管理虚拟队列的队列寄存器而工作。
虚拟队列是与任务状态相对应的队列。例如,QID=0的虚拟队列(以下表述为“虚拟队列(0)”)可以与READY状态相对应,虚拟队列(1)可以与等待信号量状态相对应,虚拟队列(2)可以与等待互斥量状态相对应。或者,虚拟队列(1)可以与信号量ID=0的等待信号量状态相对应,虚拟队列(2)可以与信号量ID=1的等待信号量状态相对应。QID与任务状态之间的对应可以通过软件任意设定。
当任务A处于READY状态时,在队列标识寄存器416_A中设定与READY状态相对应的虚拟队列的QID。任务选择电路230或队列控制电路404能够通过参照各队列标识寄存器416来判别各任务的任务状态。因此,队列标识寄存器416能够实现与基本实施方式中的任务状态寄存器258、待机理由寄存器262、信号量ID寄存器264、互斥量ID寄存器265以及事件ID寄存器266等相同的功能。
虚拟队列不是物理上存在的,而是根据队列顺序寄存器414和队列标识寄存器416的配置而假设的概念性队列,这点很重要。例如,当各队列标识寄存器416和队列顺序寄存器414被配置为:
任务A:QID=0,ODR=0
任务B:QID=0,ODR=1
任务C:QID=0,ODR=2
任务D:QID=1,ODR=0
时,表示在虚拟队列(0)中按照顺序依次输入任务C、B、A,而在虚拟队列(1)中只输入任务D。通过定义QID和ODR的数值范围能够灵活地变更虚拟队列的数量和大小。
任务选择电路230根据状态寄存器250输出的状态数据来选择应该转换状态的任务。主电路400向任务选择电路230输入CND信号。CND是表示任务选择条件的信号,包括表示队列ID的QID_C和表示任务优先级的PR_C。例如,在希望从虚拟队列(0)中抽取任务的情况下,主电路400在CND中设定QID_C=0。任务选择电路230输出表示在被指定的虚拟队列(0)中成为抽取对象的任务(以下简称为“抽取任务”)的任务ID的EID_A1,申请EID_A1_EN。另外,PR_A1和ODR_A1分别表示抽取任务的任务优先级和顺序值。由此,主电路400能够通过指定QID_C=Qn来查询任务选择电路230,从而识别虚拟队列(Qn)的抽取任务。任务选择电路230实现用于选择抽取任务的抽取候选电路的功能。更详细的情况将在后面参照图32进行描述。
向最大值选择电路406中输入来自主电路400的CND信号。当CND表明QID_C=Qn时,最大值选择电路406输出表示虚拟队列(Qn)中的最大顺序值的ODR_A2,并申请EID_A2_EN。更详细的情况将在后面参照图28进行描述。
队列控制电路404通过设定各状态寄存器250中的状态数据来控制各任务的状态转移。队列控制电路404接收来自主电路400的CMD和EID_C。除此之外,还接收CND(QID_C、PR_C)、ODR_A1、ODR_A2、ODR_A2_EN和各状态寄存器250中的状态数据。
CMD表示用于操作虚拟队列的命令。成为CMD对象的虚拟队列的队列ID、任务的任务ID和任务优先级分别由QID_C、EID_C和PR_C来指定。命令是ENQ_TL、ENQ_TP和DEQ三个中的任意一个。
当输入顺序输入命令ENQ_TL时,由EID_C信号指定的任务被输入虚拟队列的最末尾。以下将在队列的最末尾进行的输入称作“顺序输入”。当输入抽取命令DEQ时,在虚拟队列的起始处抽取任务。ENQ_TL和DEQ以FIFO模式控制队列。当输入逆序输入命令ENQ_TP时,由EID_C信号指定的任务被输入虚拟队列的起始处。以下将这种在队列的起始处进行的输入称作“逆序输入”。逆序输入不是FIFO模式的输入,因此逆序输入是特殊的输入方式。
当从主电路400输入CMD时,写入电路402申请WT,从而将从队列控制电路404输出的数据写入到各状态寄存器250中。队列控制电路404、写入电路402、任务选择电路230和最大值选择电路406等实现用于控制虚拟队列的虚拟队列处理电路的功能。
队列控制电路404的电路结构将参照下面的图20进行详述。
图20是队列控制电路404的电路图。
队列控制电路404是多个寄存器值生成电路420的集合。各寄存器值生成电路420是相同的电路。寄存器值生成电路420与每个任务相对应,也可以说与每个状态寄存器250相对应。寄存器值生成电路420_En与任务ID=En的任务(以下称为“任务(En)”)相对应。对应任务的任务ID作为ELM_ID信号被固定地输入到寄存器值生成电路420中。
ODR_S、QID_S和PR_S是从状态寄存器250输出的状态数据,分别表示顺序值、队列ID和任务优先级。向与任务(En)相对应的寄存器值生成电路420_En输入表示任务(En)的顺序值、队列ID和任务优先级的ODR_S_En、QID_S_En和PR_S_En。CMD和EID_C是从主电路400输入的。ODR_A2_EN和ODR_A2是从最大值选择电路406输入的。当申请ODR_A2_EN时,表示最大顺序值的ODR_A2是有效的。ODR_A1是从任务选择电路230输入的。ODR_A1表示抽取任务的任务ID。QID_C和PR_C是从主电路400输入的CND信号,分别表示作为任务选择条件的QID和PR。
寄存器值生成电路420En将任务(En)的顺序值、队列ID、任务优先级分别作为QID_N_En、ODR_N_En、PR_N_En输出,当通过写入电路402申请WT时,将QID_N_En、ODR_N_En、PR_N_En写入到状态寄存器250_En。
当写入电路402申请WT时,来自全部的寄存器值生成电路420的QID_N_En、ODR_N_En、PR_N_En被写入到全部的状态寄存器250中。受到CMD影响的与任务相对应的寄存器值生成电路420将根据后述的算法指定的新数据写入到状态寄存器250中。另一方面,不受CMD影响的与任务相对应的寄存器值生成电路420也通过重新输出与写入状态寄存器250中的数据相同的数据来进行写入操作。
此外,允许来自寄存器值生成电路420的数据被写入的WT也可以不是输入到各状态寄存器250,而是直接输入到队列控制电路404中。在这种情况下,只有内置在队列控制电路404中的寄存器值生成电路420中的与应该通过CMD变更状态的任务相对应的寄存器值生成电路420,可以将新数据写入状态寄存器250中。
寄存器值生成电路420进行的具体处理细节将在后面描述。
图21是表示虚拟队列与任务之间的关系的概念图。
这里,假设虚拟队列(Q0)和虚拟队列(Q1)两个虚拟队列。虚拟队列(Q0)是输入任务优先级PR=0的任务的优先队列(以下表述为“优先队列(Q0:0)”)和输入任务优先级PR=1的任务的优先队列(Q0:1)的集合。虚拟队列(Q1)也同理。实际上是假设四个优先队列。例如,虚拟队列(Q0)可以对应于READY状态,而虚拟队列(Q1)可以对应于WAIT状态。
在各虚拟队列中,左侧所示为输入口,右侧所示为抽取口。在顺序输入中,从左侧输入任务;在逆序输入中,从右侧输入任务。任务抽取通常是从右侧进行的。
在图21中,任务ID=E0、E1、E2、E3的四个任务被输入虚拟队列中。任务(E0)、任务(E2)和任务(E3)被输入虚拟队列(Q0)中。其中,任务(E0)和任务(E3)是任务优先级PR=0的任务,因此被输入优先队列(Q0:0)中。任务(E2)是PR=1的任务,因此被输入优先队列(Q0:1)中。输入虚拟队列(Q0)中的任务(E3)、任务(E2)和任务(E0)的顺序值ODR分别为2、1和0。任务优先级PR=0的任务(E1)被输入虚拟队列(Q1)中。该任务的ODR是“0”。
图22是与图21的状态相对应的状态寄存器250的数据结构图。
图21所示的各任务在虚拟队列中的输入状态通过状态寄存器250的设定来表现。在图21所示的状态中,任务(E0)至任务(E7)中被输入虚拟队列中的是任务(E0)至任务(E3)。因此,在其他任务的队列标识寄存器416中设定表示该任务未被输入任何队列的“Non”。在输入虚拟队列(Q0)中的任务(E0)、任务(E3)和任务(E2)的队列标识寄存器416中设定“Q0”。另外,在输入虚拟队列(1)中的任务(E1)的队列标识寄存器416中设定“Q1”。通过队列标识寄存器416的设定来表现哪个任务被输入哪个虚拟队列中。
在输入虚拟队列(Q0)中的包括任务(E0)、任务(E3)和任务(E2)的三个任务的队列顺序寄存器414中,分别将ODR设定为0、2和1。因为输入虚拟队列(Q1)中的任务只有任务(E1),因此顺序值被设定为最小的“0”。通过队列顺序寄存器414的设定来表现各任务在虚拟队列中的位置。
任务(E0)、任务(E1)和任务(E3)的任务优先级PR是“0”。因此,在这些任务的任务优先级寄存器412中设定“0”。由于任务(E2)的任务优先级PR是“1”,因此在任务优先级寄存器412_E2中设定“1”。通过任务优先级寄存器412的设定来表现各任务被输入哪个优先队列中。
根据以上的设定,将详述顺序输入、逆序输入和抽取中的处理细节。
顺序输入
图23是向图21所示的虚拟队列顺序输入任务(E4)的概念图。
这里假定向虚拟队列(Q1)顺序输入任务优先级PR=0的任务(E4)。主电路400配置CMD=ENQ_TL(顺序输入命令),以使EID_C=E4、QID_C=Q1,以及PR_C=0。当内置在队列控制电路404中的寄存器值生成电路420_E4检测出EID_C=ELM_ID=E4时,输出QID_N_E4=QID_C=Q1、ODR_N_E4=0以及PR_N_E4=PR_C=0。QID_N_E4表示输入任务(E4)的虚拟队列的QID,ODR_N_E4表示输入的顺序值,PR_N_E4表示任务(E4)的任务优先级。顺序输入的任务的ODR_N通常设定为“0”。“0”是表示队列中最新输入的顺序值。
寄存器值生成电路420_E4以及输入QID_S_En=QID_C=Q1的寄存器值生成电路420_En都对该命令作出响应。这样作出响应的寄存器值生成电路420_En输出ODR_N_En=ODR_S_En+1。在这种情况下,寄存器值生成电路420_E1检测QID_S_E1=QID_C=Q1,并输出ODR_N_E1=0+1=1。ODR_N_E1表示输入任务(E1)后的顺序值。已经输入顺序输入任务(E4)的虚拟队列(Q1)中的任务的顺序值将受影响。经过这种处理过程,形成虚拟队列(Q1)的任务(E4)和任务(E1)的状态数据得到调整。
图24是与图23的状态相对应的状态寄存器250的数据结构图。
在图24中,添加下划线的部分表示相对于图22所示的状态寄存器250的设定有变化的地方。QID_N_E4在与任务(E4)顺序输入虚拟队列(Q1)中相对应的队列标识寄存器416_E4中设定“Q1”。任务(E4)的ODR是“0”,PR是“0”。由于顺序输入任务(E4),已经输入虚拟队列(Q1)中的任务(E1)的ODR从“0”递增到“1”。修改后的状态寄存器250的设定表现图23所示的虚拟队列(Q1)的状态。
图25是向图23所示的虚拟队列中顺序输入任务(E5)的概念图。
这里假定向虚拟队列(Q0)顺序输入任务优先级PR=1的任务(E5)。主电路400配置CMD=ENQ_TL(顺序输入命令),以使EID_C=E5、QID_C=Q0以及PR_C=1。寄存器值生成电路420_E5输出QID_N_E5=QID_C=Q0、ODR_N_E5=0以及PR_N_E5=PR_C=1。
寄存器值生成电路420E5以及输入QID_C=QID_S_En=Q0的寄存器值生成电路420_En都在检测出QID_C=QID_S_En时输出ODR_N_En=ODR_S_En+1。在该例子中,与任务(E0)、任务(E2)和任务(E3)相对应的寄存器值生成电路420就是这样的寄存器。经过这种处理过程,形成虚拟队列(Q0)的任务(E5)、任务(E0)、任务(E2)和任务(E3)的状态数据得到调整。
图26是与图25的状态相对应的状态寄存器250的数据结构图。
在图26中添加下划线的部分表示相对于图24所示的状态寄存器250的设定有变化的地方。首先,在与任务(E5)顺序输入虚拟队列(Q0)中相对应的队列标识寄存器416_E5中设定“Q0”。任务(E5)的ODR是“0”,PR是“1”。由于顺序输入任务(E5),因此原先输入虚拟队列(Q0)中的任务(E0)、任务(E1)和任务(E3)的ODR分别递增。
图27是表示顺序输入的处理过程的流程图。
主电路400设定被顺序输入的任务(以下称作“顺序输入任务”)的输入条件(S10)。具体地说,以CMD=ENQ_TL设定EID_C、QID_C和PR_C。队列控制电路404中与顺序输入任务相对应的寄存器值生成电路420分别在顺序输入任务的任务优先级寄存器412、队列顺序寄存器414和队列标识寄存器416中设定PR_C、0和QID_C(S12)。
在已经向虚拟队列(QID_C)输入了其它任务的情况下(S14中的Y),已经输入的各任务的ODR相应递增(S16)。在图25所示的例子中,任务(E0)、任务(E2)和任务(E3)的ODR递增。步骤S12、S14和S16在时间上是大体并行执行的。
[逆序输入]
图28是最大值选择电路406的部分电路图。
最大值选择电路406是由主电路400驱动用于逆序输入的电路。当接收到表示QID_C=Qn的CND信号时,最大值选择电路406输出表示虚拟队列(Qn)中的最大顺序值的ODR_A2,并申请ODR_A2_EN。与基本实施方式所示的执行选择电路232和信号量选择电路234相似,最大值选择电路406由多段的比较电路构成。最大值选择电路406包括四个第一比较电路422(422a、422b等)、两个第二比较电路424(424a等)和一个第三比较电路(图中未示出)。另外,最大值选择电路406还包括八个判定电路426(426a、426b、426c、426d等)。
以第一比较电路422a为例进行说明。第一比较电路422a比较任务0和任务1,如果两者都被输入虚拟队列(Qn)中,则选择顺序值较大的任务。第一比较电路422a接收分别表示任务0和任务1的任务ID和顺序值的EID_S、ODR_S。
第一判定:如果任务0已经被输入虚拟队列(Qn)中,则判定电路426a申请EID_11A_EN。如果任务1已经被输入虚拟队列(Qn)中,则判定电路426b申请EID_11B_EN。第一比较电路422a首先参照分别从判定电路426a和判定电路426b输出的EID_11_EN信号。如果两个信号中的一个是“1”,则只有一个任务被输入虚拟队列(Qn)中。此时,第一比较电路422a将输入虚拟队列(Qn)中的任务的任务ID(EID_S)和顺序值(ODR_S)分别作为EID_21A和ODR_21A输出,并申请EID_21A_EN。
当判定电路426a和判定电路426b都输出“0”时,哪个任务都没有被输入虚拟队列(Qn)中。此时,取消EID_21A_EN,此后在第二比较电路424a中任务0和任务1都不会成为比较对象。
当判定电路426a和判定电路426b都输出“1”时,意味着两个任务都已经被输入虚拟队列(Qn)中,此时执行下面的第二判定。
第二判定:比较任务0的ODR_S_0和任务1的ODR_S_1,选择顺序值较大的任务。第一比较电路422a将分别表示顺序值较大的任务的任务ID(EID_S)和顺序值(ODR_S)的EID_21A和ODR_21A输出,并申请EID_21A_EN。
其它第一比较电路422的处理也同理,分别比较任务0和任务1、任务2和任务3、任务4和任务5、任务6和任务7。第二比较电路424通过比较来自两个第一比较电路422的输出来进一步选择顺序值较大的任务。以第二比较电路424a为例进行说明。第二比较电路424a比较第一比较电路422a的输出信号和第一比较电路422b的输出信号,以选择顺序值较大的任务。分别从第一比较电路422a和第一比较电路422b向第二比较电路424a输入EID_21、ODR_21和EID_EN。第二比较电路424从任务0至任务3中选择虚拟队列(Qn)中顺序值最大的任务。其它第二比较电路424也同理,虚拟队列(Qn)中的最大顺序值最终作为ODR_A2信号输出。当选择某一个任务时,申请ODR_A2_EN;当虚拟队列(Qn)中不存在任何任务时,取消ODR_A2_EN。
此外,也可以向第一比较电路422、第二比较电路424和第三比较电路输入用于使优先级判定无效的PR无效信号。当PR无效信号有效时,各比较电路从判定条件中排除优先级后选择任务。图32所示的各比较电路也同理。
图29是向图25所示的虚拟队列中逆序输入任务(E6)的概念图。
这里假定向虚拟队列(Q0)中逆序输入任务优先级PR=1的任务(E6)。首先,主电路400将表示输入目标QID=Q0的QID_C信号输入到最大值选择电路406。最大值选择电路406将表示虚拟队列(Q0)的最大顺序值的ODR_A2输出到队列控制电路404,并申请ODR_A2_EN。参照图25,虚拟队列(Q0)的最大顺序值是任务(E3)的“3”,因此,ODR_A2=3。
接着,主电路400设定CMD=ENQ_TP(逆序输入命令),以使EID_C=E6、QID_C=Q0以及PR_C=1。此时,当检测出EID_C=ELM_ID=E6时,内置在队列控制电路404中的寄存器值生成电路420_E6输出QID_N_E6=QID_C=Q0、ODR_N_E6=ODR_A2+1=3+1=4以及PR_N_E6=PR_C=1。
当发出CMD=ENQ_TP(逆序输入命令)时,只有与由EID_C指定的任务相对应的寄存器值生成电路420工作。因此,只有被逆序输入的任务(E6)的状态数据被变更。
图30是与图29的状态相对应的状态寄存器250的数据结构图。
在图30中添加下划线的部分是相对于图26所示的状态寄存器250的设定有变化的地方。首先,在与任务(E6)逆序输入虚拟队列(Q0)中相对应的队列标识寄存器416_E6中新设定“Q0”。任务(E6)的ODR是“4”,PR是“1”。通过逆序输入任务(E6),其它任务的状态数据不受影响。
图31是表示逆序输入的处理过程的流程图。
主电路400首先将逆序输入目标的虚拟队列的QID=Qn输入到最大值选择电路406中(S20)。主电路400将虚拟队列(Qn)的最大顺序值输出到队列控制电路404中(S22)。主电路400设定被逆序输入的任务(以下称作“逆序输入任务”)的输入条件(S24)。具体地说,在CMD=ENQ_TP(逆序输入命令)中设定EID_C、QID_C和PR_C。队列控制电路404中与逆序输入任务相对应的寄存器值生成电路420分别在逆序输入任务的任务优先级寄存器412、队列顺序寄存器414和队列标识寄存器416中设定PR_C、最大顺序值+1、以及QID_C(S26)。但是,当最大顺序值=0而取消ODR_A2_EN时,即未向虚拟队列(Qn)输入任务时,在队列顺序寄存器414中设定表示初始输入的顺序值“0”。
如上所述,在顺序输入时存在调整其它任务的顺序值的可能性,但是在逆序输入时不需要这种调整。当虚拟队列为FIFO模式时,越是以前输入的任务,设定越大的顺序值。换句话说,越是输入到虚拟队列深处的任务,顺序值越大。相反地,也可以是越是输入到虚拟队列深处的任务,顺序值越小。在这种情况下,在顺序输入时不需要调整其它任务的顺序值,但是在逆序输入时存在调整其它任务的顺序值的可能性。
抽取
图32是任务选择电路230的部分电路图。
任务选择电路230的基本结构与作为基本实施方式而参照图12所说明的相同。改进实施方式中的任务选择电路230,当接收到来自主电路400的询问时确定抽取任务。这里,说明与确定该抽取任务相关的电路结构。当接收到表示QID_C=Qn的CND信号时,任务选择电路230从虚拟队列(Qn)中任务优先级最高的优先队列中选择抽取任务,输出表示抽取任务的任务ID、任务优先级和顺序值的EID_A1、PR_A1和ODR_A1,并申请EID_A1_EN。与基本实施方式所示的执行选择电路232和信号量选择电路234相似,任务选择电路230由多段的比较电路构成。任务选择电路230包括四个第一比较电路430(430a、430b等)、两个第二比较电路432(432等)和一个第三比较电路(未示出)。另外,任务选择电路230还包括八个判定电路434(434a、434b、434c、434d等)。
以第一比较电路430a为例进行说明。第一比较电路422a比较任务0和任务1,如果两者都被输入虚拟队列(Qn)中,则选择任务优先级较高的任务。如果任务优先级相同,则选择顺序值较大的任务。第一比较电路430a接收表示任务0和任务1的任务ID、任务优先级和顺序值的EID_S、PR_S和ODR_S。
第一判定:如果任务0已经被输入虚拟队列(Qn)中,则判定电路434a申请EID_11A_EN。如果任务1已经被输入虚拟队列(Qn)中,则判定电路434b申请EID_11B_EN。第一比较电路430a首先参照分别从判定电路434a和判定电路434b输出的EID_11_EN信号。如果两个信号中的一个是“1”,则只有一个任务输入到虚拟队列(Qn)中。此时,第一比较电路430a输出表示输入虚拟队列(Qn)中的任务的任务ID(EID_S)、任务优先级(PR_S)以及顺序值(ODR_S)的EID_21A、PR_11A以及ODR_21A,并申请EID_21A_EN。
当判定电路434a和判定电路434b都输出“0”时,哪个任务都没有被输入到虚拟队列(Qn)中。此时,取消EID_21A_EN,此后在第二比较电路432a中任务0和任务1都不会成为比较对象。
当判定电路434a和判定电路434b都输出“1”时,意味着两个任务都已经被输入到虚拟队列(Qn)中,此时执行下面的第二判定。
第二判定:比较任务0的PR_S_0和任务1的PR_S_1,选择任务优先级较高的任务,即PR_S较小的任务。第一比较电路430a输出分别表示任务优先级较高的任务的任务ID(EID_S)、任务优先级(PR_S)以及顺序值(ODR_S)的EID_21A、PR_21A以及ODR_21A,并申请EID_21A_EN。如果两个任务的任务优先级相同,则执行下面的第三判定。
第三判定:比较任务0的ODR_S_0和任务1的ODR_S_1,选择顺序值较大的任务。第一比较电路430a输出分别表示顺序值较大的任务的任务ID(EID_S)、任务优先级(PR_S)以及顺序值(ODR_S)的EID_21A、PR_21A以及ODR_21A,并申请EID_21A_EN。
其它第一比较电路430的处理也同理,分别比较任务0和任务1、任务2和任务3、任务4和任务5、任务6和任务7。第二比较电路432通过比较来自两个第一比较电路430的输出来进一步圈定抽取任务的候选。最终,从虚拟队列(Qn)中任务优先级最高的优先队列中选择抽取任务。当选择某一个任务时,申请EID_A1_EN;当虚拟队列(Qn)中不存在任何任务时,取消EID_A1_EN。
图33是从图29所示的虚拟队列中抽取任务(E3)的概念图。
这里假定从虚拟队列(Q0)中抽取一个任务。主电路400将QID_C=Q0输入到任务选择电路230。参照图29,在与虚拟队列(Q0)中最高的任务优先级相对应的优先队列(Q0:0)中,输入顺序值“1”的任务(E0)和顺序值“3”的任务(E3)。任务选择电路230选择顺序值较大的任务(E3)作为抽取任务。任务选择电路230设定EID_A1=E3、PR_A1=0以及ODR_A1=3,并申请EID_A1_EN。
接着,主电路400设定CMD=DEQ(抽取命令),以使EID_C=EID_A1=E3以及QID_C=Q0。寄存器值生成电路420_E3输出QID_N_E3=Non、ODR_N_E3=0(复位)、PR_N_E3=0(复位)。由此,在状态寄存器250中任务(E3)和虚拟队列(Q0)之间的关系被解除。
当检测出QID_C=QID_S_En时,寄存器值生成电路420_E3以及输入QID_S_En=QID_C=Q0的寄存器值生成电路420_En都判定是否为ODR_S_En>ODR_A1。这里,ODR_A1是抽取任务(E3)被抽取前的顺序值。如果ODR_S_En>ODR_A1,即顺序值比抽取任务的顺序值还大的任务(En)的寄存器值生成电路420_En输出ODR_N_En=ODR_S_En-1。在图29所示的例子中,相当于与任务(E6)相对应的寄存器值生成电路420_E6。寄存器值生成电路420_E6输出ODR_N_E6=ODR_S_E6-1=4-1=3。由此,形成虚拟队列(Q0)的任务(E6)的状态数据得到调整。
图34是与图33的状态相对应的状态寄存器250的数据结构图。
在图34中添加下划线的部分是相对于图30所示的状态寄存器250的设定有变化的地方。首先,对应于从虚拟队列(Q0)抽取任务(E3),在队列标识寄存器416_E3中新设定“Non”。另外,在队列顺序寄存器414和任务优先级寄存器412中分别设定“0”作为复位值。由于抽取任务(E3),原先输入虚拟队列(Q0)中的任务(E0)、任务(E2)、任务(E5)、任务(E6)中顺序值比抽取任务(E3)更大的任务(E6)的ODR递减。
图35是表示抽取处理过程的流程图。
主电路400首先向任务选择电路230输入成为抽取目标的虚拟队列的QID=Qn(S30)。任务选择电路230从虚拟队列(Qn)中选择抽取任务(S32)。当主电路400向队列控制电路404输入抽取任务的任务ID=En时,队列控制电路404从抽取任务(En)的状态数据中清除QID=Qn(S34)。此时,将PR和ODR复位为“0”,或者,也可以不进行复位。
当向虚拟队列(Qn)中输入其它任务(S36中的Y),且存在ODR_S_En>ODR_A1的任务(S38中的Y)时,相应任务的顺序值递减(S40)。此外,步骤S30至S40并非必须顺次执行,也可以在时间上并行执行。
在另一种实现方式中,也可以从虚拟队列的中间抽取任务。例如,在图33中,需要从虚拟队列(Q0)的正中央抽取任务(E2)。任务(E2)可在某个标志A被设定为打开的条件下执行。当该标志A处于关闭时,需要从虚拟队列(Q0)的中间取出任务(E2)。或者,当任务(E2)的预先设定的等待时间已经超时时,需要从虚拟队列(Q0)的中间取出任务(E2)。在这种情况下,通过清除任务(E2)的QID,使顺序值比任务(E2)的顺序值“2”大的任务的ODR递减,从而能够从虚拟队列(Q0)的中间取出任务(E2)。在图33所示的情况下,任务(E6)的ODR变为2。由于虚拟队列是以不受物理限制的形式由硬件形成,因此在队列的中间也能够实现输入或抽取处理。
根据以上所述的虚拟队列控制,能够通过硬件逻辑来实现特殊的队列,该特殊的队列不仅能够以FIFO模式工作而且能够以LIFO模式工作。如果用软件来实现双输入型队列算法,则通常是根据连接表来实现的。但是,当基于软件进行处理时,必然产生伴随访问存储器和地址管理的开销。相反地,改进实施方式所示的虚拟队列控制是由硬件逻辑来实现的,因此能够实现简单且高速的控制。特别是在时间要求严格的RTOS中,通过硬件实现双输入型队列算法的意义很大。下面说明通过上述虚拟队列控制方法来实现再执行优先型任务调度的方式。
图36是表示再执行优先型任务调度中的虚拟队列和任务之间的关系的第一概念图。
这里,假设与READY状态相对应的虚拟队列(Q0)和与WAIT信号量状态相对应的虚拟队列(Q1)两个虚拟队列。虚拟队列(Q0)是用于输入任务优先级PR=0的任务的优先队列(以下表述为“优先队列(Q0:0))和用于输入任务优先级PR=1的任务的优先队列(Q0:1)两个优先队列的集合。虚拟队列(Q1)也同理,实际上是假设四个优先队列。
在图36中,PR=1的任务(E1)处于RUN状态,也是PR=1的任务(E0)和任务(E2)在优先队列(Q0:1)中处于READY状态。另外,PR=0的任务(E3)在优先队列(Q1:0)中处于WAIT信号量状态。这里,任务(E1)是希望在得到执行权时集中或优先执行的任务。
首先,处于RUN状态的任务(E1)执行释放信号量系统调用并返回到READY状态(S1)。由于任务(E1)是希望在尽可能早的阶段中再执行的任务,因此被“逆序输入”到优先队列(Q0:1)中。另一方面,释放信号量系统调用的执行使得任务(E3)的WAIT解除条件被满足。任务(E3)是从优先队列(Q1:0)中抽取的,并向优先队列(Q0:0)中顺序输入(S2)。接着,任务选择电路230选择新的RUN-任务。任务选择电路230选择处于READY状态的任务中任务优先级最高的任务(E3)作为抽取任务。由此,刚从WAIT状态跳转到READY状态的任务(E3)变成从优先队列(Q0:0)抽取的新的RUN-任务。根据这种任务调度,如果WAIT解除条件满足,则任务优先级高的任务能够在较早的阶段中获得执行权。
图37是表示再执行优先型任务调度中的虚拟队列和任务之间的关系的第二概念图。
当任务(E3)执行等待信号量系统调用时,任务(E3)被顺序输入到优先队列(Q1:0)中。接着,任务选择电路230选择新的RUN-任务。任务选择电路230选择处于READY状态的任务中任务优先级最高的任务,但是在这里,任务(E0)、任务(E2)和任务(E1)的任务优先级相同。在这种情况下,从优先队列(Q0:1)中抽取任务(E1)(S5)。任务(E1)成为新的RUN-任务。根据这种处理方法,关于任务(E1)的、不需要设定任务优先级PR=0但需要一旦开始执行则希望尽可能连续地执行该任务的规定能够得到适当的解决。
在再执行优先型任务调度中,根据执行情况或任务的种类区分使用顺序输入和逆序输入,从而能够控制任务的执行顺序。因此,不仅保持基本实施方式所示的任务处理器100的高速处理性能,而且还能够实现更精细的任务调度。
以上基于实施例说明了本发明。这些实施例只是示例,本领域技术人员能够理解,可以对这些结构要素以及处理流程的组合进行各种变型,而这些变型也属于本发明的范围。
当接收到用于指定要素ID和队列ID的顺序输入命令时,在与所指定的要素ID相对应的队列寄存器中设定所指定的队列ID以及表示元素被置于与所指定的队列ID相对应的虚拟队列末尾的末尾顺序值;
当接收到用于指定要素ID和队列ID的逆序输入命令时,在与所指定的要素ID相对应的队列寄存器中设定所指定的队列ID以及表示元素被置于与所指定的队列ID相对应的虚拟队列起始处的起始顺序值;
2.根据权利要求1所述的虚拟队列处理电路,其特征在于,当接收到所述顺序输入命令或所述逆序输入命令时,所述队列控制电路调整保存由所述命令指定的队列ID的队列寄存器中的而非针对所输入元素的队列寄存器中的顺序值。
3.根据权利要求1所述的虚拟队列处理电路,其特征在于,还包括抽取候选电路,用于当指定了队列ID时,参照从所述多个队列寄存器中并行输出的队列ID和顺序值,输出与所述被指定的队列ID和起始顺序值相对应的要素ID;
5.根据权利要求4所述的虚拟队列处理电路,其特征在于,当接收到指定队列ID的所述抽取命令时,所述队列控制电路调整保存所述被指定的队列ID的队列寄存器中的而非针对所提取的元素的队列寄存器中的顺序值。
6.根据权利要求5所述的虚拟队列处理电路,其特征在于,还包括抽取候选电路,用于当指定了队列ID时,参照从所述多个队列寄存器中并行输出的队列ID、顺序值以及优先级,输出与保存所述被指定的队列ID、设定最高优先级以及等于或最接近于起始顺序值的顺序值的队列寄存器相对应的要素ID;
所述任务选择电路确定用于保存与READY(就绪)状态相对应的虚拟队列的就绪队列的队列ID以及表示所述就绪队列的起始位置的起始顺序值的状态寄存器,从而选择与所述确定的状态寄存器相对应的第二任务作为下一个执行对象;
当接收到所述系统调用信号时,所述任务切换电路从所述第二任务的状态寄存器中清除队列ID,在所述第一任务的状态寄存器中设定与不同于RUN(运行)状态的其它执行状态相对应的虚拟队列的队列ID和顺序值,将所述处理寄存器的数据保存在规定的存储区域中,并且将所述第二任务的保存在所述存储区域中的数据加载到所述处理寄存器中。
8.根据权利要求7所述的任务控制装置,其特征在于,当所述第一任务从所述其它执行状态跳转到READY状态时,所述任务切换电路在所述第一任务的状态寄存器中设定所述就绪队列的队列ID和起始顺序值。
9.根据权利要求7所述的任务控制装置,其特征在于,所述任务选择电路在作为与等待WAIT(等待)解除条件满足的WAIT状态相对应的虚拟队列设定了等待队列的情况下,当所述WAIT解除条件满足时,选择与保存所述等待队列的队列ID和起始顺序值的状态寄存器相对应的任务;
当接收到指定要素ID和队列ID的顺序输入命令时,在与所述被指定的要素ID相对应的队列寄存器中设定所述被指定的队列ID以及表示元素被置于与所述被指定的队列ID相对应的虚拟队列末尾的末尾顺序值;
12.根据权利要求11所述的虚拟队列处理电路,其特征在于,当接收到指定要素ID和队列ID的逆序输入命令时,所述队列控制电路在与所述被指定的要素ID相对应的队列寄存器中设定所述被指定的队列ID以及表示元素被置于与所述被指定的队列ID相对应的虚拟队列起始的起始顺序值。
13.根据权利要求11所述的虚拟队列处理电路,其特征在于,当接收到指定要素ID的抽取命令时,无论所述被指定的要素ID的顺序值是否是起始顺序值,所述队列控制电路从与所述被指定的要素ID相对应的队列寄存器中清除队列ID,以将该要素设为抽取对象。
14.根据权利要求11所述的虚拟队列处理电路,其特征在于,当接收到所述顺序输入命令时,所述队列控制电路调整保存由所述命令指定的队列ID的队列寄存器中的而非针对所输入元素的队列寄存器中的顺序值。
15.根据权利要求11所述的虚拟队列处理电路,其特征在于,还包括抽取候选电路,用于当指定了队列ID时,参照从所述多个队列寄存器中并行输出的队列ID和顺序值,输出与所述被指定的队列ID和起始顺序值相对应的要素ID;
17.根据权利要求16所述的虚拟队列处理电路,其特征在于,当接收到指定队列ID的所述抽取命令时,所述队列控制电路调整保存所述被指定的队列ID的队列寄存器中的而非针对所提取的元素的队列寄存器中的顺序值。
18.根据权利要求17所述的虚拟队列处理电路,其特征在于,还包括抽取候选电路,用于当指定了队列ID时,参照从所述多个队列寄存器中并行输出的队列ID、顺序值以及优先级,输出与保存所述被指定的队列ID、设定最高优先级以及保存等于或最接近于起始顺序值的顺序值的队列寄存器相对应的要素ID;
权利要求11对修改前的权利要求1进行了修改。在说明书的段落[0174](即中文说明书第56页最后1段以及第57页第2段)中,公开了与起始顺序值无关地从队列的中间抽取任务(要素ID)的内容。权利要求11的修改主要基于段落[0174]的记载。