实时内部简易监视器的制作方法

文档序号:6554478阅读:267来源:国知局
专利名称:实时内部简易监视器的制作方法
技术领域
本发明涉及内部软件的中断处理,以及利用中断处理进行同步排他控制的实时内部简易监视程序。
背景技术
内部软件为了快速应答外部事件的变化,利用中断处理来确保实时性。另外,在内部软件中,使用μITRON等的内部控制用实时OS(Operating System操作系统)实现信标(semaphore)和事件标志(event flag)、信箱等的同步排他控制。
作为实现同步排他控制的以往技术,例如有专利文献1(特开平7-295840号公报)。在专利文献1中公开了这样的技术,即,使任务具有用于执行的条件,通过控制该执行顺序来实现同步排他控制,削减适用于内部系统的多道程序设计(multiprogramming)系统的OS使用的存储区域以及程序步骤,在提高资源的效率的同时提高生产性以及维护性。
具体地说,在事件成立条件存储部件中,存储可以执行针对细分化了程序的每个矢量(vector)所设定的任务的条件的种类(事件等待,信息等待,时间等待,起床等待等),以及,状态(事件等待中,事件已成立等)的成立条件,在条件存储部件中,存储与被存储在事件成立条件存储部件中的事件成立的时刻对应的事件等待解除条件,任务块存储用于控制任务的控制信息。
任务附属事件管理部件把被存储在事件成立条件存储部件中的事件成立条件和已发生的事件进行比较对比,任务附属事件等待管理部件基于被存储在任务块中的控制信息,用任务附属管理部件的检测功能把成为事件等待的状态的任务转移到事件等待状态的同时,在事件等待任务存储部件中存储转移到事件等待状态的任务。而后,任务附属事件等待管理部件在对事件等待状态的任务的事件解除条件成立的时刻,使该任务转移到执行等待状态,在执行等待任务存储部件中存储转移到执行等待状态的任务。任务管理部件从被存储在执行中任务存储部件中的当前CPU正在执行的任务,以及被存储在执行等待任务存储部件中的执行等待任务中,选择1个任务将其转移到执行状态。
在上述专利文献1所述的以往技术中,在使用多道程序设计系统的OS(实时OS)时,使任务具有用于执行的条件,通过控制其执行顺序而实现同步排他控制。
但是,安装有内部软件的产品的存储器容量有限。因此,如上述专利文献1所述的以往技术那样,为了实现同步排他控制而安装实时OS时,存在可用于实际需要的程序的存储器容量减少的问题。该问题在用1块芯片实现执行内部软件的处理器、作为存储内部软件的存储器的ROM、作为暂时保持在执行内部软件时需要的数据的存储器的RAM等的产品中比较显著。
另外,在实时OS中,通过使任务具有等待状态实现信标等的同步排他控制。但是,当不同的优先权的任务共用信标的情况下,存在产生优先权逆转的问题。
具体地说,当优先权低的任务取得信标的情况下,优先权高的任务处于等待状态。此时如果发生与优先权低的任务相比优先权高,并且与信标等待的任务相比优先权低的优先权中等的任务,则与取得信标的任务相比先执行优先权中等的任务,接着执行取得了信标的任务,最后执行优先权高的任务。即,存在以和预先规定的优先权不同的顺序进行任务处理的问题。
为了解决这些问题,考虑不使用实时OS,只用中断处理开发内部软件。但是在不使用实时OS而只用中断处理开发内部软件的情况下,存在无法进行同步排他控制的问题。另外,虽然可以知道发生了中断,但存在无法知道发生了几次中断的问题。进而,当发生了中断的情况下,必须把该状态保持在堆栈区域,因为把状态保持在堆栈区域期间全部中断处于禁止状态,所以还产生实时性变差的问题。

发明内容
本发明就是鉴于上述问题而提出的,其第1个目的在于得到不使用实时OS而只用中断处理实现同步排他控制的实时内部简易监视程序。
第2个目的在于得到在不使用实时OS而只用中断处理来实现同步排他控制时,避免各个中断处理的优先权逆转的实时内部简易监视程序。
为了解决上述问题实现本发明的目的,本发明是被适用在用包含正常状态的多个中断服务程序(ISR)构成的内部软件中的,根据与在上述多个ISR中使用的多个信标对应地保持与该信标的使用状态有关的信息的信标构造体,和具有与上述多个ISR的中断级别对应地保持与各ISR的状态有关的信息的中断控制块(ICB),从上述ISR的中断级别的优先顺序高的ICB开始顺序连接该ICB的ICB排列,对上述ISR进行调度的实时内部简易监视程序,其特征在于,具备ISR起动步骤,它设定在把在中断发生时被存储在堆栈区域上的程序计数的值、作为堆栈寄存器的值的堆栈指示字,以及上下文存储在与被中断的ISR对应的ICB的上下文保存区域上的同时,在与上述已发生的中断的ISR对应的ICB中处于执行等待状态;调度步骤,它选择在设定了执行状态的ICB中优先顺序最高的ICB,把被选择出的存储在ICB的上下文保存区域上的程序计数器的值、堆栈指示字,以及上下文存储在上述堆栈区域上,执行用中断恢复命令选择的ISR;ISR结束步骤,它设定在通过上述调度步骤而执行的ISR的处理结束时,在与结束的ISR对应的ICB中处于中断等待状态。
如果采用本发明,因为,本发明被适用在用包含正常状态的多个中断服务程序(ISR)构成的内部软件中,在根据与在上述多个ISR中使用的多个信标对应地保持与该信标的使用状态有关的信息的信标构造体,和具有与上述多个ISR的中断级别对应地保持与各ISR的状态有关的信息的中断控制块(ICB),从上述ISR的中断级别的优先顺序高的ICB开始顺序连接该ICB的ICB排列,对ISR进行调度时,ISR起动任务设定在把在中断发生时被存储在堆栈区域上的处理器上下文(程序计数器的值、堆栈指示字,以及上下文)存储在与被中断的SIR对应的ICB的上下文保存区域上的同时,在与上述已发生的中断的ISR对应的ICB中处于执行等待状态;调度程序以及调度器(dispatcher)作为ISR的调度处理,选择在设定了执行等待状态的ICB中优先顺序最高的ICB,把被选择的存储在ICB的上下文保存区域上的程序上下文存储在堆栈区域,执行用中断恢复命令选择出的与ICB对应的ISR,所以,起到能够不使用实时OS,只用中断处理实现同步排他控制的实时内部简易监视程序的效果。


图1是表示适用本发明中的实时内部简易监视程序的装置的结构一例的图。
图2是表示在本发明中的实时内部简易监视程序的实施方式1的结构的概念图。
图3是表示图2所示的ICB的结构的图。
图4是表示图2所示的信标构造体的构成的图。
图5是用于说明图2所示的ISR的状态转移的图。
图6是用于说明实施方式1的起动ISR生成任务的动作的流程图。
图7是用于说明实施方式1的ISR起动任务的动作的流程图。
图8是用于说明实施方式1的调度程序的动作的流程图。
图9是用于说明实施方式1的调度器(dispatcher)的动作的流程图。
图10是用于说明转移到实施方式1的信标等待状态的信标取得任务的动作的流程图。
图11是用于说明实施方式1的信标解放任务的动作的流程图。
图12是用于说明不向实施方式1的信标等待状态转移的信标取得任务的动作的流程图。
图13是用于说明实施方式1的ISR延迟任务的动作的流程图。
图14是用于说明实施方式1的ISR恢复任务的动作的流程图。
图15是用于说明实施方式1的定时中断处理程序(handler)的动作的流程图。
图16是用于说明实施方式1的ISR结束任务的动作的流程图。
图17是用于说明优先权的逆转的图。
图18是用于说明避免优先权的逆转的图。
图19是用于说明避免优先权的逆转的图。
图20-1是用于说明转移到实施方式2的信标等待状态的信标取得任务的动作的流程图。
图20-2是用于说明转移到实施方式2的信标等待状态的信标取得任务的动作的流程图。
图21-1是用于说明实施方式2的信标解放任务的动作的流程图。
图21-2是用于说明实施方式2的信标解放任务的动作的流程图。
符号的说明1处理器2程序存储单元3数据存储单元4ICB排列5信标构造体群6调度程序7调度器(dispatcher)9状态处理程序10控制对象装置12程序计数器
13寄存器群14控制寄存器21、22、23信标构造体91ISR生成任务92ISR起动任务93a、93b、93c信标取得任务94、94a信标解放任务95ISR延迟任务96ISR恢复任务97ISR结束任务98定时中断处理程序401休眠状态402中断等待状态403执行等待状态404执行状态405信标等待状态406执行停止状态1601优先顺序1602时间轴具体实施方式
以下,基于

本发明中的实时内部简易监视程序的实施方式。而且本发明并不被本实施方式所限定。
本发明中的实时内部简易监视程序是通过让中断处理具有成为任务那样的等待状态的状态,不使用实时OS实现同步排他控制,但为了简单说明,在以下的实施方式中,使用当前一般使用的作为实时OS之一的μITRON方法的术语进行说明。
实施方式1.
用图1~图16说明本发明的实施方式1。图1是表示适用本发明中的实时内部简易监视程序的装置结构的一个例子的图。在图1中,适用了实时内部简易监视程序的装置具备处理器1;程序存储单元2;数据存储单元3;控制对象装置10。
程序存储单元2例如用ROM(Read Only Memory)等的存储介质构成,存储用处理器1执行的用户程序、在用户程序中必要的固定数据等。本发明中的实时简易监视程序在用户程序内使用,实现同步排他控制。
数据存储单元3用RAM(Random Access Memory)等的可以写入的存储介质构成,存储堆栈区域、在用户程序中所需要的数据缓冲区、在实时内部简易监视程序中需要的信息。
处理器1具备CPU(Control Processing Unit)11;程序计数器12;具有在计算处理中使用的通用寄存器和存储堆栈指针的堆栈寄存器等的寄存器群13;存储中断信号的控制信息的控制寄存器14。
CPU11读出被存储在程序存储单元2的程序计数器12表示的地址中的程序代码,根据读出的程序代码使用寄存器群13的通用寄存器执行规定的计算处理对控制对象装置10进行控制。
输入到CPU11的多个(这种情况下是7个)中断信号从控制对象装置10或者外部输入。控制寄存器14由针对每个中断信号表示发生了中断信号(中断信号处于断言(assert))的中断标志,和设定是否屏蔽中断信号的屏蔽标志构成。
CPU11在控制寄存器14的屏蔽标志是OFF的情况下(没有屏蔽的情况下)如果中断信号处于断言(assert)后,则把当前执行的程序计数器12的值,以及堆栈计数器的值(堆栈指针)存储于被存储在堆栈寄存器中的堆栈指针所表示的堆栈区域中,执行被存储在程序存储单元2的预先规定的地址表示的区域上的程序。
CPU11在控制寄存器14的屏蔽标志是ON(中断被屏蔽而处于中断禁止状态)的情况下,即使中断信号处于断言(assert)也继续执行当前正在执行的程序。这种情况下,在用户程序中确认控制寄存器14的中断标志而进行规定的中断处理,或者在屏蔽标志成为OFF时受理中断。以下,说明在控制寄存器14的屏蔽标志中设定为OFF的情况。
图2是表示本发明的实时内部简易监视程序的实施方式1的结构的概略图。在图2中,实时内部简易监视程序具备多个(这种情况下是7个)的中断服务程序(ISR)81~87以及正常状态程序80;具有设定ISR81~87以及正常状态程序80的各种信息的中断控制块(ICBInterrupt Control Block)40~47的中断控制块排列(ICB排列)4;基于ICB排列4进行ISR81~87以及正常状态程序80的调度(确定执行顺序并选择应该执行的ISR81~87,以及正常状态程序80)的调度程序6以及调度器(dispatcher)7;设定在ISR81~87及正常状态程序80中使用的信标的状态的信标构造体群5;进行ISR8187以及正常状态程序80的状态控制的状态处理程序9。
实现ISR81~87、正常状态程序80、状态处理程序9、调度程序6以及调度器(dispatcher)7的功能的程序被存储在前面图1所示的程序存储单元2中。另外,ICB排列4以及信标构造体群5被存储在前面图1所示的数据存储单元3中。
ISR81~87是由被输入到CPU11中的各中断信号进行的中断处理的程序。在此,ISR81是在ISR81~87中中断级别最低(优先顺序为最低)级别1的中断处理程序,ISR87是在ISR81~87中中断级别最高(优先顺序高)的级别7的中断处理程序。即,按照ISR81、ISR82、ISR83、ISR84、ISR85、ISR86、ISR87的顺序优先顺序增高。
正常状态程序80是和采用中断信号进行的中断处理不同的处理,即是在非中断状态(正常状态)时执行的处理程序,包含设定控制寄存器14和ICB排列4、信标构造体群5等的初始值的处理,以及ISR81~87的生成处理。在装置的起动时(电源接入时或者系统复位时),首先执行正常状态程序80。
ICB排列4具备与正常状态程序80以及ISR81~87对应的ICB40~47。在本发明中的实时内部简易监视程序基于ICB40~47实现同步排他控制(调度)。因此,在非中断状态中执行的正常状态程序80也作为比中断级别最低的ISR81的级别还低(级别0)的ISR来处理并与ICB40对应起来。即,ICB排列4具备“中断级别的个数+1”个的ICB。而且,以下,把正常状态程序80称为ISR80。
ICB40~47具有作为排列连结的构造,该排列的连结顺序表示ISR80~87的调度的优先顺序。在此,因为中断级别按照ISR87、ISR86、ISR85、ISR84、ISR83、ISR82、ISR81、ISR80的顺序降低,所以按照ICB47、ICB46、ICB45、ICB44、ICB43、ICB42、ICB41、ICB40的顺序连结。该连结表示ISR80~ISR87的优先顺序(调度器(dispatcher)7的ICB40~47的搜索顺序),与连结有关的信息被存储在数据存储单元3中。
ICB40~47具备全部相同的结构。参照表示图3所示的ICB47的结构的图说明ICB的结构。
在图3中,ICB47用以下部分构成状态标志171、执行计数器172、信标等待索引(index)173、执行次数上限值174、ISR开头地址175、堆栈底层地址176、堆栈大小177、请求中断级别178、延迟时间计数器179、ICB位置变更对象180,以及上下文保存区域181构成。
状态标志171是表示ICB47的状态的标志的集合,由以下部分构成有效/无效标志1711、ready/not ready标志1712、信标取得中标志1713、信标等待标志1714、中断级别变更请求标志1715、执行次数上限指定标志1716、堆栈溢出检验请求标志1717、延迟中标志1718,以及ICB位置变更标志1719。
在有效/无效标志1711中设定是否可以使用ISR87,即是否作为调度对象的信息。当ISR87可以使用的情况下,在有效/无效标志1711中设定ON(这种情况下是“1”),当ICB47不可以使用的情况下,在有效/无效标志1711中设定OFF(这种情况下是“0”)。
在ready/not ready标志1712中,设定ISR87是否处于中断等待状态的信息。当ISR87是处于中断等待状态的情况下,在ready/notready标志1712中设定OFF(这种情况下是“0”),当ISR87不是处于中断等待状态的情况下,在ready/not ready标志1712中设定ON(这种情况下是“1”)。
在信标取得中标志1713中,设定ISR87是否取得任意的信标的信息。当ISR87取得任意的信标的情况下,在信标取得中标志1713中设定ON(这种情况下是“1”),当ISR87未取得信标的情况下,在信标取得中标志1713中设定OFF(这种情况下是“0”)。
在信标等待标志1714中,设定ISR87是否是任意的信标的等待状态的信息。当1SR87是任意的信标等待状态的情况下,在信标等待标志1714中设定ON(这种情况下是“1”),当ISR87不是信标的等待状态的情况下,在信标等待标志1714中设定OFF(这种情况下是“0”)。
在中断级别变更请求标志1715中设定是否变更预先确定的中断级别的信息。当在预先确定的中断级别下动作的情况下(只受理比自身优先权高的中断的情况下),在中断级别变更请求标志1715中设定OFF(这种情况下是“0”),当以被设定于请求中断级别178中的中断级别进行动作的情况下,在中断级别变更请求标志1715中设定ON(这种情况下是“1”)。
在执行次数上限指定标志1716中在发生了多次ISR87进行处理的中断的情况下,设定是否限制ISR87的执行次数的信息。当不限制执行次数的情况下(只按照发生了中断的次数执行ISR的情况下),在执行次数上限指定标志1716中设定OFF(这种情况下是“0”),当限制执行次数的情况下,在执行次数上限指定标志1716中设定ON(这种情况下是“1”)。
在堆栈溢出检验请求标志1717中设定在上下文保存区域181中是否发生了溢出的信息。当在上下文保存区域181中未发生溢出(正常)的情况下,在堆栈溢出检验请求标志1717中设定OFF(这种情况下是“0”),当在上下文保存区域181中发生了溢出(异常)的情况下,在堆栈溢出检验请求标志1717中设定ON(这种情况下是“1”)。
在延迟中标志1718中设定ISR87是否是执行停止状态(延迟实施状态)的信息。在ISR87是执行停止状态的情况下,在延迟中标志1718中设定ON(这种情况下是“1”),当ISR87不是执行停止状态的情况下,在延迟中信标1718中设定OFF(这种情况下是“0”)。
在ICB位置变更标志1719中设定是否变更ICB47的位置的信息。如上所述,ICB40~47根据预先确定的中断级别连结。在ICB位置变更标志1719中,设定是否为了避免优先权的逆转等的处理而变更了该连结的位置,即是否把调度的优先顺序变更为和中断级别不同的顺序的信息。当未变更位置的情况下,在ICB位置变更标志1719中设定OFF(这种情况下是“0”),当变更了位置的情况下,在ICB位置变更标志1719中设定ON(这种情况下是“1”)。
在执行计数器172中设定应该执行ISR87的次数,即起动ISR87的中断处理程序(handler)的发生次数。在执行次数上限值174的标志是ON的情况下,被设定在执行计数器172中的值在执行次数上限值174的值以内。
在信标等待索引(index)173中,设定ISR87取得等待的信标的索引(index)(用于识别取得等待的信标的信标识别符)。信标等待索引(index)173的值只在信标等待标志1714是ON的情况下有效。
在执行次数上限值174中设定应该执行ISR87的次数的上限值,即在执行计数器172上的上限值。执行次数上限值174的值只在执行次数上限指定标志1716是ON的情况下才有效。
在ISR开头地址175中设定存储程序存储单元2的ISR87的区域的开头地址。
在堆栈底层地址176中设定上下文保存区域181的初始值(在数据存储单元3的上下文保存区域181中最初存储数据的地址)。在堆栈大小177中设定上下文保存区域181的大小,即数据存储单元3的上下文保存区域181的存储器大小。
被设定在堆栈底层地址176,以及堆栈大小177中的信息在检验上下文保存区域181是否溢出时使用,在检测出溢出时在堆栈溢出检验请求标志1717中设定“ON”。检验溢出的任务在ISR80~87内起动。
在请求中断级别178中设定表示ISR87在执行状态时允许中断的中断级别的值。请求中断级别178的值只在中断级别变更请求标志1715是ON的情况下才有效。
例如,因为ISR87是中断级别7,所以当中断级别变更请求1715是“OFF”的情况下ISR80~86无法中断。但是,当中断级别变更请求标志1715是“ON”,并且请求中断级别178是“3”的情况下,允许中断级别3~6的ISR83~86的中断。
在延迟时间计数器179中设定ISR87应该延迟的剩余的时间,即从执行停止状态到恢复为止的时间。延迟时间计数器179的值只在延迟标志1718是ON的情况下才有效。
ICB位置变更对象180在变更了ICB47的位置的情况下,设定作为变更对象的ISR87~80的信息。ICB位置变更对象180的值只在ICB位置变更标志1719是ON的情况下才有效。
在上下文保存区域181中设定中断发生时的状态,即程序计数器12和寄存器群13等用于从ISR87恢复到中断发生时的状态所需要的上下文。
回到图2,信标构造体群5由ISR80~87使用的信标的数(这种情况下是3个)的信标构造体21~23构成。信标构造体21~23具有全部相同的构造。参照表示图4所示的信标构造体21的构造的图来说明信标构造体的构成。
在图4中,信标构造体21由信标值211、所有ISR212、等待ISR213构成。在信标值211中设定与信标构造体21对应的信标的剩余数。当信标值211的初始值是“3”的情况下(自身管理的信标数是3个的情况下),如果信标值211的值是“3”,则表示自身管理的信标在ISR80~ISR87中未取得,如果信标值211的值是“2”,则表示在ISR80~87之中取得1个自身管理的信标,如果信标值211的值是“1”,则表示在ISR80~87之中取得2个自身管理的信标。如果信标值211的值是“0”,则表示在ISR80~87之中全部取得自身管理的信标(没有剩余信标),即ISR80~87无法取得信标。
在所有ISR212中设定用于识别取得信标构造体21管理的信标的ISR80~87的ISR识别符。ISR识别符可以预先给予ISR80~87,也可以使用程序存储单元2存储ISR80~87的开头地址,或者预先确定的中断级别。
所有ISR212和信标值211连动,信标值211的值与被设定在所有ISR212中的ISR80~87的个数的合计和信标构造体21管理的信标的个数相等。具体地说,在信标值211的值是“初始值-1”的情况下,在所有ISR212中设定1个ISR识别符。
在等待ISR213中设定信标构造体21管理的信标的取得等待的ISR识别符。当在等待ISR213中设定ISR识别符的情况下,信标值211是“0”,在所有ISR212中设定信标构造体21管理的信标数量的ISR识别符。
在本发明中的实时内部简易监视程序通过使用ICB排列4以及信标构造体群5,通过使ISR80~87具有任务那样的等待的状态,来实现同步排他控制,ISR80~87具有多个状态。状态处理程序9是用于使ISR80~87的状态发生转移的程序,由ISR生成任务91、ISR起动任务92、信标取得任务93a、信标取得任务93b、信标放开任务94、ISR延迟任务95、ISR恢复任务96、ISR结束任务97,以及定时中断处理程序(handler)98构成。
各任务91~97以及定时中断处理程序(handler)98在由用户制成的ISR80~87中使用,和调度程序6以及调度器(dispatcher)7一同向该任务的状态转移。参照图5说明各任务91~97、定时中断处理程序(handler)98、调度程序6以及调度器(dispatcher)7的功能和ISR80~87的状态。
ISR80~87分别具有休眠(dormnt)状态401、中断等待(notready)状态402、执行等待(ready)状态403、执行(running)状态404、信标等待状态(sem_wait)状态405,以及执行停止(sleep)状态406的6个状态。
所谓休眠(dormnt)状态401是ISR80~87只在程序存储单元2中存在的状态,即在程序存储单元2中ISR80~87只作为命令代码存在而不可以使用的状态。当ISR80~87处于休眠(dormnt)状态401的情况下,因为无法使用ISR80~87,所以在ICB40~47的有效/无效标志1711(参照图3)中设定“0”,当发生了与ISR80~87对应的中断的情况下变为错误。在休眠(dormnt)状态401中,只是ISR生成任务(cre_tsk)91可以执行。
ISR生成任务91把与应该制作的ISR80~87对应的ICB40~47的有效/无效标志1711中设定为“1”,把应该制作的ISR80~87从休眠(dormnt)状态401转移到中断等待状态402。另外,ISR生成任务91进行ICB40~47的初始设定从而可以使用用户为了实现所希望的功能而需要的ISR80~87。
所谓中断等待状态402是从休眠(dormnt)状态401转移(执行了ISR生成任务91)的状态,或者未发生中断的状态,是未执行ISR80~87的状态。从休眠(dormnt)状态401、执行状态404、信标等待状态405,或者执行停止状态406向中断等待状态402转移。当ISR80~87处于中断等待状态402的情况下,在ICB40~47的ready/not ready标志1712(参照图3)中设定“0”。
ISR确定任务(sta_tsk)92把ISR80~87从休眠(dormnt)状态401转移到中断等待状态402。ISR起动任务92是在与ISR80~87对应的中断发生时CPU11执行的中断处理程序(handler),在把与所发生的中断对应的ICB40~47的ready/not ready标志1712设置为“1”的同时,对ICB40~47进行初始化。
所谓中断等待状态402是通过与ISR80~87对应的中断发生而使中断处理即ISR80~87的执行处于等待的状态。当ISR80~87处于中断等待状态402的情况下,在ICB40~47的ready/not ready标志1712中设定“1”。
调度程序6以及调度器(dispatcher)7基于ICB40~47从中断等待状态402的ISR80~87中选择应该执行的ISR80~87,即优先顺序最高的ISR80~87,通过向选择出的ISR80~87进行转移处理,转移到执行状态404。
具体地说,调度程序6在从ISR起动任务92、信标取得任务93a、信标解放任务94、ISR延迟任务95、ISR恢复任务96、ISR结束任务97,或者定时中断处理程序(handler)98进行转移(起动)处理后,基于这些任务92、93a、94~97,或者与执行了定时中断处理程序(handler)98的ISR80~87对应的ICB40~47的执行计数器172(参照图3)判定是否应该执行ISR80~87。调度程序6在判定为应该执行的情况下进行向调度器(dispatcher)7转移的处理。
调度器(dispatcher)7从ICB40~47的连结的开头开始顺序判定是否在ready/not ready标志1712中设定了“1”,最初选择与在ready/not ready标志1712中设定了“1”的ICB40~47对应的ISR80~87,通过进行向选择出的ISR80~87的转移处理而转移到执行状态404。所谓执行状态404是执行ISR80~87的处理的状态。
信标取得标志(wai_sem,pol_sem)93a、93b在执行状态404的ISR80~87取得任意的信标时起动,基于信标构造体21~23取得信标。信标取得任务93a在能够取得信标的情况下恢复到起动原(调出原的下一地址)。当不能取得信标的情况下把ISR80~87转移到信标等待状态405。信标取得任务93b并不是把ISR80~87转移到信标等待状态405,而是持有是否已经取得信标的信息恢复到调出原的下一地址。
所谓信标等待状态405是在ISR80~87想要使用信标取得任务93a取得信标时无法取得信标的情况下,即在与要取得的的信标对应的信标构造体21~23(参照图4)的信标值211中设定“0”,在所有ISR212中设定信标的数量的ISR识别符,在等待ISR213中至少设定1个ISR识别符的状态。
信标放开任务(sig_sem)94在ISR80~87处于执行状态404在放开由信标取得任务93a、93b取得的信标时使用,把信标等待状态405的ISR80~87转移到执行等待状态403。信标放开任务94在把信标等待状态405的ISR80~87转移到执行等待状态403时,把与转移的ISR80~87对应的ICB40~47的信标等待标志1714设置为“0”。
ISR延迟任务(dly_tak)95是在ISR80~87处于执行状态404的情况下,在想中断执行时起动的任务,把ISR80~87从执行状态404向执行停止状态406转移。
所谓执行停止状态406是使ISR80~87的执行停止的状态,在ICB40~47的延迟中标志1718设定“1”。执行停止状态406通过ISR恢复任务96或者经过规定时间(定时中断处理程序(handler)98)而转移到执行等待状态403。
ISR恢复任务96把与恢复对象的ISR80~87对应的ICB40~47的延迟中标志1718设定为“OFF”,在ready/not ready标志1712中设定“ON”,通过初始化延迟时间计数器179的值,在经过应该延迟的时间前,强制性地把恢复对象的ISR80~87从执行停止状态406转移到执行等待状态403。
定时中断处理程序(handler)98在处理器1内的定时器(未图示)的计数值每次改变时起动,改变ICB40~47的延迟时间计数器179的值。定时中断处理程序(handler)98在ICB40~47的延迟时间计数器179的值为“0”时,在该ICB40~47的状态标志171的延迟中标志1718中设定“0”的同时,在ready/not ready标志1712中设定“1”,把ISR80~87从执行停止状态406转移到执行等待状态403。
ISR结束任务(ext_tsk)97在ISR80~87的结束时起动,基于与起动的ISR80~87对应的ICB40~47的执行计数器172的值使ISR80~87结束,把ISR80~87从执行状态404向中断状态402转移。
以下,参照图6~图16的流程图说明本发明的实时内部简易监视程序的动作。而且假设,在执行各任务91~97,以及定时中断处理程序(handler)98时,CPU11把程序计数器12的值以及寄存器13内的堆栈计数器的值即堆栈指针存储在堆栈区域中。另外,假设在回到调出原(起动原)的下一地址时中断禁止状态被解除。进而,假设在电源接入时,通过来自外部的系统复位,ICB40~47被初始化。
首先,参照图6的流程图说明把ISR80~87从图5所示的休眠(dormnt)状态401转移到中断等待状态402的ISR生成任务91的ISR生成处理的动作。
ISR生成任务91把CPU11的动作模式设置成中断禁止状态(步骤S100)。具体地说,ISR生成任务91把上述控制器寄存器14的每个中断信号的屏蔽标志全部设置为ON。
ISR生成任务91把上下文保存(存储)在堆栈区域(步骤S101)。ISR生成任务91因为从正常状态程序80开始起动,所以恢复到正常状态程序80(回到调出原的下一地址),把为了继续进行ISR生成任务91起动前的处理所需要的通用寄存器的值等的上下文保存在堆栈区域。在堆栈区域的什么地方存储上下文,和一般的程序一样使用堆栈指针值来确定。
以下,把存储在堆栈区域上的上下文,和在ISR80~87起动各任务91~97或者定时中断处理程序(handler)98时CPU11存储在堆栈区域上的程序计数器12的值以及寄存器群13内的堆栈寄存器的值即堆栈指针称为处理器上下文,把除了堆栈寄存器的寄存器群13,和除了程序计数器12的值的程序的恢复所需要的数据称为上下文。
ISR生成任务91确认与应该生成的ISR80~87对应的ICB40~47的状态标志171的有效/无效标志1711是否是ON(这种情况下是“1”)(步骤S102)。
当有效/无效标志1711是“ON”的情况下,表示应该制成的ISR80~87已经制成。ISR生成任务91是为了生成应该制作的ISR8087而起动的任务,已经制成ISR80~87(有效/无效标志1711是ON)是在程序中发生异常的情况。因而,ISR生成任务91回到错误(表示ISR生成错误的代码)并返回调出原的下一地址(步骤S103)。
另一方面,当有效/无效标志1711是“OFF”(这种情况下是“0”)的情况下,ISR生成任务91在与应该制作的ISR80~807对应的ICB40~47的有效/无效标志1711中设定“ON”的同时,对ICB40~47进行初始化(步骤S104,S105)。
具体地说,ISR生成任务91在与应该制作的ISR80~87对应的ICB40~47的有效/无效标志1711中设定“1”,在ready/not ready标志1712、信标取得中标志1713、信标等待标志1714、中断级别变更请求标志1715、延迟中标志1718,以及ICB位置变更标志1719中设定“0”。
ISR生成任务91当变更预先规定的中断级别的情况下,在中断级别变更请求标志1715中设定“1”的同时,在请求中断级别178中设定受理请求的中断级别,当不变更中断级别的情况下,在中断变更请求标志1715中设定“0”。
ISR生成任务91在设定执行次数的上限值的情况下,在执行次数上限指定标志1716中设定“1”的同时,在执行次数上限值174中设定执行次数的上限值,当不设定执行次数的上限值的情况下(在执行只与中断发生的数量对应的ISR80~87的情况下),在执行次数上限指定标志1716设定“0”。
另外,ISR生成任务91当进行堆栈溢出检验的情况下,在堆栈溢出检验请求标志1717中设定“1”,当不进行堆栈溢出检验的情况下,在堆栈溢出检验请求标志1717中设定“0”。
ISR生成任务91在ISR开头地址175中设定存储着与ICB40~47对应的ISR80~87的开头代码的程序存储单元2的地址,在堆栈底层地址176中设定上下文保存区域181的初始值,在堆栈大小177中设定上下文保存区域181的大小。
另外,ISR生成任务91在上下文保存区域181上设定在程序地址上设定的值、上下文保存区域181的堆栈指针的值。
在对与应该制作的ISR80~87对应的ICB40~47进行初始化后,生成标志恢复保存在堆栈区域中的上下文(把通用寄存器等的值返回到制作任务起动前的状态)并返回到调出原的下一地址(步骤S106,S107)。
以下,参照图7的流程图说明ISR起动任务92的ISR起动处理的动作。ISR起动任务92把CPU11的动作模式设置成中断禁止状态,把上下文保存在堆栈区域(步骤S200,S201)。
ISR起动任务92确认与起动了(发生了中断)ISR起动任务92的中断对应的ICB40~47的有效/无效标志1711是否是“ON”(步骤S202)。
当有效/无效标志1711是“OFF”的情况下,ISR起动任务92因为没有生成与所发生的中断对应的ISR80~87,所以返回例外(表示未生成对应的ISR80~87而ISR起动任务92起动的代码),回到调出原的下一地址(步骤S203)。
当与所发生的中断对应的ICB40~47的有效/无效标志1711是“ON”的情况下,起动标志进行执行次数上限指定标志1716是否是“ON”的判定(步骤S204)。
当执行次数上限指定标志1716是“ON”的情况下,ISR起动任务92把与所发生的中断对应的被设定在ICB40~47的执行计数器172中的值和被设定在执行次数上限值174中的值进行比较(步骤S205)。
当被设定在执行计数器172中的值大于被设定在执行次数上限值174中的值的情况下,ISR起动任务92返回例外(表示超越执行次数上限值ISR并且起动任务已起动的代码),回到调出原的下一地址(步骤S203)。
当被设定在执行计数器172中的值小于等于被设定在执行次数上限值174中的值的情况下,或者执行次数上限指定标志1716是“OFF”的情况下,ISR起动任务92取得被中断的(已在执行ISR起动任务92前执行)的ISR80~87的优先顺序(步骤S206)。
被中断(已在执行ISR起动任务92之前执行)的ISR80~87的优先顺序通过以后叙述的调度器(dispatcher)7的处理被设定在数据存储单元3的中断任务存储器的区域上。ISR起动任务92通过从中断任务存储区域读出数据,取得被中断(已在执行ISR任务92之前执行)的ISR80~87的优先顺序。所谓中断任务存储是保持当前执行中的ISR80~87的信息的数据存储单元3的区域,将在以后叙述,用调度器(dispatcher)7存储现在执行中的ISR80~87的信息。
ISR起动任务92把保存在堆栈区域上的处理器上下文保存在与被中断的ISR80~87对应的ICB40~47的上下文保存区域181中(步骤S207)。即,ISR起动任务92把在本任务起动时CPU11保存在堆栈区域上的程序计数器12的值以及堆栈指针,和在步骤S201中本任务保存在堆栈区域上的上下文,拷贝在与本任务起动之前执行的ISR80~87对应的ICB40~47的上下文保存区域181上进行保存。
ISR起动任务92在与已发生的中断对应的ICB40~47的执行计数器172的值上加上1(使执行计数器172计数增加)(步骤S208)。另外,ISR起动任务92在与已发生的中断对应的ICB40~47的ready/not ready标志1712中设定“NO”(这种情况下是“1”)并向调度程序6转移处理(步骤S209,S210)。
以下,参照图8的流程图说明调度程序6的动作。调度程序6对于与已发生的中断对应的ICB40~47的执行计数器172的值是否大于等于“1”进行判定(步骤S300)。当与已发生的中断对应的ICB40~47的执行计数器172的值小于“1”的情况下,调度程序6执行错误处理(步骤S301)。当与已发生的中断对应的ICB40~47的执行计数器172的值大于等于“1”的情况下,调度程序6向调度器(dispatcher)7转移(步骤S302)。
以下,参照图9的流程图说明调度器(dispatcher)7的动作。调度器(dispatcher)7根据被存储在数据存储单元3中的搜索顺序,从在ICB排列4中的ICB40~47的连结的开头开始顺序地搜索ready/notready标志1712,取得ready/not ready标志1712是否处于“ON”的最初的ICB40~47(步骤S400)。
调度器(dispatcher)7把被保存在已取得的ICB40~47上的上下文保存区域181上的上下文拷贝在堆栈区域上(步骤S401)。调度器(dispatcher)7把已取得的ICB40~47的优先顺序存储在中断堆栈存储器中(步骤S402)。
调度器(dispatcher)7把应该从中断恢复的地址以及堆栈指针拷贝到堆栈区域(步骤S403)。具体地说,把已取得的ICB40~47的被保存在上下文保存区域181上的地址以及堆栈指针的值拷贝在堆栈区域上。即,在执行了恢复命令时,改写堆栈区域的数据以便设定程序计数器12以及堆栈寄存器使与已取得的ICB40~47对应的ISR80~87的处理得以执行。
调度器(dispatcher)7对已取得的ICB40~47的中断变更请求标志1715是否是“ON”进行判定(步骤S404)。当已取得的ICB40~47的中断级别变更请求标志1715是“ON”的情况下,调度器(dispatcher)7把在已取得的ICB40~47的请求中断级别178中设定的值拷贝到堆栈区域(步骤S405)。由此,在根据恢复命令从中断恢复时,成为被设定在请求中断级别178中的值的中断级别。
在把被设定在请求中断级别178中的值拷贝到堆栈区域上后,或者当中断级别变更请求标志1715是“OFF”的情况下,调度器(dispatcher)7执行来自中断的恢复命令,执行与已取得的ICB40~47对应的ISR80~87(步骤S406~S407)。
以下,参照图10的流程图,说明信标取得任务93a的信标取得处理(当无法取得信标的情况下转移到信标等待状态405的处理)的动作。
信标取得任务93a把CPU11的动作模式设置成中断禁止状态,在与起动了本任务(执行中的)的ISR80~87对应的ICB40~47的上下文保存区域181上保存处理器上下文(步骤S500,S501)。
信标取得任务93a确认所要求的信标(请求信标)是否存在(步骤S502)。具体地说,信标取得任务93a对与对象信标对应的信标构造体21~23的信标值211的值是否大于等于“1”进行判定,当信标值211的值是大于等于“1”的情况下,确认为请求信标存在,当信标值211是“0”的情况下确认为所要求的信标不存在。
当请求信标存在的情况下,信标取得任务93a在与请求信标对应的信标构造体21~23的所有ISR212中设定执行中的ISR80~87的ISR识别符(步骤S503)。
信标取得任务93a在与执行中的ISR80~87对应的ICB40~47的信标取得中标志1713中设定“ON”(步骤S504)。另外,信标取得任务93a从与请求信标对应的信标构造体21~23的信标值211的值中减去1(减少),回到调出原的下一地址(步骤S505,506)。
另一方面,当请求信标不存在的情况下,信标取得任务93a在与执行中的ISR80~87对应的ICB40~47的信标等待索引173中设定所要求的信标索引(步骤S507)。
信标取得任务93a在设定与执行中的ISR80~87对应的ICB4047的信标等待标志1714中设定“ON”的同时,在ready/not ready标志1712中设定“OFF”(步骤S508)。由此,执行中的ISR80~87从执行状态404转移到信标等待状态405。
信标取得任务93a在与请求信标对应的信标构造体21~23的等待ISR213中设定执行中的ISR80~87的ISR识别符,向调度程序6转移处理(步骤S509,S510)。
以下,参照图11的流程图,说明信标解放任务94的信标解放处理的动作。信标解放任务94把CPU11的动作模式设置成中断禁止状态,在与解放信标(起动了信标解放任务94)的ISR80~87对应的ICB40~47的上下文保存区域181上存储处理器上下文(步骤S600,S601)。
信标解放任务94在与解放信标的ISR80~87对应的ICB40~47的信标取得中标志1713中设定“OFF”(步骤S602)。信标解放任务94对等待已被解放的信标的ISR80~87是否存在进行判定(步骤S603)。具体地说,信标解放任务94判定在与被解放的信标对应的信标构造体21~23的等待ISR213中是否设定了ISR识别符。
当等待已被解放的信标的ISR80~87不存在的情况下,信标解放任务94增加与已被解放的信标对应的信标构造体21~23的信标值211的值(步骤S604)。
信标解放任务94恢复在步骤S601中存储在与进行信标解放的ISR80~87对应的ICB40~47的上下文保存区域181上的处理器上下文(拷贝到堆栈区域),回到起动了信标解放任务94的调出原的下一地址(步骤S605,S606)。
另一方面,当等待解放的信标的ISR80~87存在的情况下,信标解放任务94在清除与等待着信标的ISR80~87对应的ICB40~47的信标等待索引173的同时,在信标等待标志1714中设定“OFF”,在ready/not ready标志1712中设定“ON”(步骤S607)。
信标解放任务94清除与解放的信标对应的信标构造体21~23的等待ISR213(步骤S608)。在等待ISR213中,设定等待着解放的信标的ISR80~87的ISR识别符。当在等待ISR213中设定多个ISR识别符的情况下,信标解放任务94按照预先规定的顺序选择接着取得信标的ISR80~87。例如,可以选择设定在最先等待ISR213中的ISR80~87,也可以选择设定在等待ISR213中的ISR80~87的中优先顺序为最高的ISR80~87。
信标解放任务94在与被放开的信标对应的信标构造体21~23的所有ISR212中设定选择出的ISR80~87的ISR识别符(步骤S609)。即,把拥有的ISR212的设定变更为已处于信标等待的ISR80~87。其后,信标解放任务94把处理转移到调度程序6(步骤S610)。
以下,参照图12的流程图说明信标取得任务93b的信标取得处理(即在无法取得信标的情况下也不向信标取得等待状态转移的处理)的动作。而且,对于所要求的信标存在并取得信标的步骤S700~S706来说,因为和参照前面图10的流程图说明的信标取得任务93a的信标取得处理步骤S500~506的动作相同,故省略其详细的说明。
信标取得任务93b把CPU11的动作模式设置成中断禁止状态,在与起动了信标取得任务93b(当前执行中)的ISR80~87对应的ICB40~47的上下文保存区域181中存储处理器上下文,确认是否存在所要求的信标(对象信标)(步骤S700~702)。
当所要求的信标(要求信标)存在的情况下,信标取得任务93b在所要求的信标构造体21~23的所有ISR212中设定当前执行中的ISR80~87的ISR识别符(步骤S703)。
信标取得任务93b在与执行中的ISR80~87对应的ICB40~47的信标取得中标志1713中设定“ON”的同时,减少与放开的信标对应的信标构造体21~23的信标值211的值,返回调出原的下一地址(步骤S704~S706)。
另一方面,当请求信标不存在的情况下,信标取得任务93b退回错误(表示无法取得信标的代码),回到调出原的下一地址(步骤S707)。
以下,参照图13的流程图说明ISR延迟任务95的延迟处理的动作。ISR延迟任务95把CPU11的动作模式设置成中断禁止状态,把上下文保存在堆栈区域(步骤S800,S801)。
ISR延迟任务95在与执行中的ISR80~87对应的ICB40~47的状态标志171的ready/not ready标志1712中设定“OFF”,在延迟中标志1718中设定“ON”(步骤S802,S803)。由此,执行中的ISR80~87从执行状态404转移到执行停止状态406。
ISR延迟任务95把停留在执行停止状态406的时间,即使起动了ISR延迟任务95的ISR80~87延迟的时间设定在对应的ICB40~47的延迟时间计数器179中并把处理转移到调度程序6(步骤S804,S805)。
用以后叙述的定时中断处理程序(handler)98减少延迟时间计数器179的值。因而,设定在延迟时间计数器179中的值成为“使其延迟的时间/定时中断处理程序(handler)98起动的时间”。在此,所谓定时中断处理程序(handler)98起动的时间是由处理器1内的定时器(未图示)产生的中断时间。
以下,参照图14的流程图说明ISR恢复任务96的延迟恢复处理的动作。ISR恢复任务96把CPU11的动作模式设置为中断禁止状态,把上下文保存在堆栈区域(步骤S900,S901)。
ISR恢复任务96在与从执行停止状态406恢复的(恢复对象)ISR80~87对应的ICB40~47的状态标志171的ready/not ready标志1712中设定“ON”,在延迟中标志1718中设定“OFF”(步骤S902,S903)。由此,恢复对象的ISR80~87从执行停止状态406转移到执行等待状态403。
ISR恢复任务96初始化(例如,设定“null”)与恢复对象ISR80~87对应的ICB40~47的延迟时间计数器179的值,把处理转移到调度程序6(步骤S904,S905)。
以下,参照图15的流程图说明定时中断处理程序(handler)98的定时中断处理的动作。定时中断处理程序(handler)98把上下文保存在堆栈区域中(步骤S1000)。
定时中断处理程序(handler)98把ICB40~47的连结的开头的ICB40~47作为处理对象ICB,对处理对象ICB的延迟中标志1718是否是ON(“1”)进行判定(步骤S1001)。当处理对象ICB的延迟中标志1718是ON的情况下,定时中断处理程序(handler)98减少处理对象ICB的延迟时间计数器179的值(步骤S1002)。
定时中断处理程序(handler)98对处理对象ICB的延迟时间计数器179的值是否是“0”进行判定(步骤S1003)。当处理对象ICB的延迟时间计数器179的值是“0”的情况下,定时中断处理程序(handler)98在处理对象ICB的ready/not ready标志1712中设定“ON”的同时,在延迟中标志1718中设定“OFF”(步骤S1004,S1005)。另外,定时中断处理程序(handler)98对处理对象ICB的延迟时间计数器179进行初始化(例如,设定“null”)(步骤S1006)。
定时中断处理程序(handler)98在处理对象ICB达到ICB排列4的最末尾的ICB前重复以下动作基于ICB排列4的连结把与当前的处理对象ICB的下一连结的ICB40~47作为新的处理对象ICB,当处理对象ICB的延迟中标志1718是ON的情况下,减少延迟时间计数器179的值,当减少后的延迟时间计数器179的值是“0”的情况下,把处理对象ICB的ready/not ready标志1712设置为“ON”,把延迟中标志1718设置为“OFF”并对自演时间计数器进行初始化(步骤S1001~S1008)。
定时中断处理程序(handler)98在处理对象ICB达到ICB排列4的最末尾的ICB时转移到调度程序6处理(步骤S1009)。
以下,参照图16的流程图说明ISR结束任务97的ISR结束处理的动作。ISR结束任务97把CPU11的动作模式设置为中断禁止状态(步骤S1100)。
ISR结束任务97减少与起动了本任务(执行中的)的ISR80~87对应的ICB40~47的执行计数器172的值(步骤S1101)。ISR结束任务97判定与执行中的ISR80~87对应的ICB40~47的执行计数器172的值是否是“0”(步骤S1102)。
当与执行中的ISR80~87对应的ICB40~47的执行计数器172的值是“0”的情况下,ISR结束任务97在与执行中的ISR80~87对应的ICB40~47的ready/not ready标志1712中设定“OFF”(步骤S1103)。由此,执行中的ISR80~87从执行状态404转移到中断等待状态402。
当把与执行中的ISR80~87对应的ICB40~47的ready/notready标志1712设置在“OFF”后,或者与执行中的ISR80~87对应的ICB40~47的执行计数器172的值不是“0”的情况下,ISR结束任务97对与执行中的ISR80~87对应的ICB40~47进行初始化(步骤S1104)。
当对与执行中的ISR80~87对应的ICB40~47的堆栈底层地址176以及上下文保存区域181进行了初始化后,ISR结束任务97把处理转移到调度程序6(步骤S1105)。
这样在本实施方式1中,在基于信标构造体和ICB排列进行ISR的调度时,ISR起动任务进行这样的设定,即,在把在中断发生时被存储在堆栈区域上的处理器上下文存储在与被中断的ISR对应的ICB的上下文保存区域中的同时,在与已发生的中断的ISR对应的ICB中处于执行等待状态,调度程序以及调度器(dispatcher)作为ISR的调度处理,选择在设定了执行等待状态的ICB中优先顺序最高的ICB,把存储在选择出的ICB的上下文保存区域上的处理器上下文存储在堆栈区域上,执行与用中断恢复命令选择出的ICB对应的ISR。其中的信标构造体是被适用在用包含正常状态的多个ISR构成的中断软件中,与在多个ISR中使用的多个信标对应起来,保持与该信标的使用状态有关的信息的构造体。其中的ICB排列是具有与多个ISR的中断级别对应地保持与各ISR的状态有关的信息的中断控制块(ICB),从ISR的中断级别的优先顺序高的ICB开始顺序连结多个ICB得到排列。
即,在把在中断发生时被存储在堆栈区域上的处理器上下文存储在与已中断的ISR对应的ICB的上下文保存区域上的同时,使已发生的中断的ISR转移到执行等待状态,把存储在在执行等待状态的ISR中优先顺序最高的ISR的ICB的上下文保存区域上的处理器上下文存储在堆栈区域,通过更换根据中断恢复命令恢复的返回地址,执行在执行等待状态的ISR中优先顺序最高的ISR。由此,是不使用实时OS,实现同步排他控制的最小限度的构造(只有ISR),和使用实时OS的情况相比能够减少在产品中需要的存储器容量。
另外,在本实施方式1中,信标取得标志在与执行中的ISR要求的信标对应的信标构造体的信标数的值大于等于1的情况下,在减少该信标数的值的同时,把要求信标的ISR的ISR识别符设定在该所有ISR取得信标,当与要求的信标对应的信标构造体的信标数比1小的情况下,把要求信标的ISR的ISR识别符设定在该等待ISR,在与要求了信标的ISR对应的ICB中设定信标等待状态,信标解放任务在增加与执行中的ISR放开的信标对应起来的信标构造体的信标数的同时,对放开被设定在该拥有ISR中的信标的ISR的ISR识别符进行删除,当在该等待ISR中设定ISR识别符的情况下,在减少该信标数的同时,把被设定在该ISR中的ISR识别符设定在该所有ISR上,删除被设定在该ISR上的ISR识别符,在与新取得信标的ISR对应起来的ICB中设定执行等待状态。
即,当无法取得所要求的信标的情况下,把要求了信标的ISR转移到信标等待状态并暂停其处理,在取得所要求的信标的ISR放开了信标时,使信标等待状态的ISR取得已放开的信标并转移到执行等待状态。由此,即使在不使用实时OS,只用ISR执行同步排他控制的情况下,也可以实现利用了信标的同步排他处理。
另外,在本实施方式1中,ISR起动任务在每次发生中断时,增加与进行所发生的中断处理的ISR对应的ICB的执行计数器的值并在ICB中保持中断次数,调度器(dispatcher)只以执行计数器保持的中断次数把该ICB作为选择对象,并只以上述中断次数执行自身对应起来的ISR,ISR结束任务因为减少执行计数器的值,所以在即使不使用实时OS而只用ISR实现同步排他控制的情况下,也可以识别发生了几次中断,并只按中断发生次数执行处理。
实施方式2.
用图17~图21(表示图21-1,图21-2)说明本发明的实施方式2。在本实施方式2中是避免在利用信标时产生的优先权(中断级别的优先顺序)的逆转。
首先,参照图5以及图17说明优先权的逆转。而且,为了简单说明,在此假设信标数为1,在1个ISR取得信标时另一任务不能取得信标。
在图17中,左轴1601表示优先顺序位,下轴1602表示时间轴(经过时间),ISR1603是在ISR1603~1606中优先顺序最高(优先权4)的任务,ISR1604是接着ISR1603的高优先顺序(优先权3)的任务,ISR1605是接着ISR1604的高优先顺序(优先权2)的任务,ISR1606是在ISR1603~1606中优先顺序最低(优先权1)的任务。
在时刻t1中ISR1606起动。在时刻t1中,因为只有ISR1606起动,所以ISR1606处于执行状态404并取得信标。
在时刻t2中ISR1603起动。ISR1603优先权是4,因为执行状态的ISR1606的优先权是1,所以ISR1606处于执行等待状态403,而ISR1603处于执行状态404。
在时刻t3中,虽然执行状态404的ISR1603要取得信标,但因为ISR1606已取得共用的信标,所ISR1603处于信标等待状态405。因此,虽然优先权比ISR1603还低,但已取得信标的ISR1606处于执行状态404。
在时刻t4中ISR1604、1605起动,因为ISR1604的优先权是3,ISR1605的优先权是2,所以执行状态404的ISR1606处于执行等待状态403,ISR1604处于执行状态404。即,与优先权最高的优先权4的ISR1603相比,还是前面优先权低的ISR1604处于执行状态404。
在时刻t5中ISR1604结束(转移到中断等待状态402)。在时刻t5中,ISR1603、1605、1606处于等待状态。在等待状态(执行等待状态403及信标等待状态405)的ISR1603、1605、1606中,ISR1603优先权最高。但是,ISR1603是等待ISR1606已取得的信标放开的信标等待状态405,不能向执行状态404转移。因而,接着ISR1603的优先权高的ISR1605处于执行状态404。
在时刻t6中ISR1605结束。在时刻t6中,ISR1603、ISR1606处于等待状态。ISR1603虽然比ISR1606优先权还高,但因为处于等待ISR1606已取得的信标的信标等待状态405,所以ISR1606处于执行状态404。
在时刻t7中ISR1606放开信标而结束处理。因为信标被放开,所以信标等待状态405的ISR1603经过执行等待状态403变为执行状态404,取得信标而再次开始处理。
这样,当因为优先权1的ISR1606取得信标,所以优先权4的ISR1603在成为信标等待状态405的情况下,如果优先权2、3的ISR1604、1605起动,则在执行了优先权比已取得信标的ISR1606的优先权还高的ISR1604、1605后执行ISR1606,最后执行优先权最高的ISR1603状态,即处于优先权逆转的形态,把ISR1603~1606的执行顺序变化称为优先权的逆转。
为了防止优先权的逆转,只要交换已取得信标的ISR,和与ISR共用信标并且处于信标等待状态的ISR的优先权即可。但是,在已取得信标的ISR的优先权比和该ISR共用信标并且处于信标等待状态的ISR的优先权还高的情况下,因为不发生优先权的逆转,所以取得信标的ISR的优先权只在比和该ISR共用信标并且处于信标等待状态的ISR的优先权还低的情况下,交换ISR之间的优先权。
具体地说,在前面的图17的时刻t3中,在ISR1603转移到信标等待状态405时进行把ISR1606设置成优先权4,把自身优先权设置为优先权1的优先权的交换。由此,如图18所示,即使优先权3的ISR1604和优先权2的ISR1605起动,已取得了优先权的ISR1606也处于执行状态404。
在时刻t4a中ISR1606放开信标而结束处理。此时ISR1606进行把信标等待状态405的ISR1603设置成优先权4,把自身的优先权设置为优先权1的交换,即返回到原本的优先权并结束处理。由此,如图19所示,比ISR1604、ISR1605还在前面的ISR1603处于执行状态404,按照ISR1603、ISR1604、ISR1605这一原本的优先顺序进行处理,避免利用信标时的优先权的逆转。
以下,说明避免利用信标时的优先权的逆转的本实施方式2的实时内部简易监视程序。适用本实施方式2的实时内部简易监视程序的装置的构成因为和前面图1所示的实施方式1的装置的构成相同,所以在此省略其说明。
在本发明中的实施方式2的实时内部简易监视程序代替前面图2所示的实施方式1的实时内部简易监视程序的信标取得任务93a以及信标解放任务94,具备信标取得任务93c以及信标解放任务94a。
信标取得任务93c除了信标取得任务93a的功能外,具备当不能取得所要求的信标(转移到信标等待状态405)的情况下,对已取得所要求的信标的ISR80~87的优先权和执行中的ISR80~87的优先权进行交换(变更)的功能。
信标解放任务94a除了信标解放任务94的功能外,具备当对起动了本任务(执行中)的ISR80~87的优先权进行变更的情况下,把变更的优先权返回到预先确定的优先权的功能。
以下说明本实施方式2的实时内部简易监视程序的动作。而且,因为本实施方式2的实时内部简易监视程序和前面的实施方式1的实时内部简易监视程序的不同点是信标的取得处理以及信标放开处理,所以在此只说明实现信标的取得处理的信标取得任务93c,以及实现信标的放开处理的信标解放任务94a的动作。
首先,参照图20-1以及图20-2的流程图说明信标取得任务93c的动作。信标取得任务93c把CPU11的动作模式设置成中断禁止状态,在与起动了本任务(执行中)的ISR80~87对应的ICB40~47的上下文保存区域181上保存处理器上下文(图20-1的步骤S1200,S1201)。
信标取得任务93c确认是否存在所要求的信标(请求信标)(步骤S20-1的步骤S1202)。当存在要求信标的情况下,信标取得任务93c在与请求信标对应的信标构造体21~23的所有ISR212中设定执行中的ISR80~87的ISR(图20-1的步骤S1203)。
信标取得任务93c在与执行中的ISR80~87对应的ICB40~47的信标取得中标志1713中设定“ON”(图20-1的步骤S1204)。另外,信标取得任务93c减少与请求信标对应的信标构造体21~23的信标值211的值,并返回到调出原的下一地址(图20-1的步骤S1205,S1206)。
另一方面,当请求信标不存在的情况下,信标取得任务93c判定已取得请求信标的ISR80~87的优先顺序是否比执行中的ISR80~87的优先顺序还高(图20-2的步骤S1207)。
具体地说,信标取得任务93c根据与请求任务对应的被设定在信标构造体21~23的所有ISR212中的ISR识别符,识别已取得请求信标的ISR80~87。另外,信标取得任务93c用调度器(dispatcher)7从设定了执行中的ISR80~87的优先顺序的中断任务存储器中,取得执行中的ISR80~87的优先顺序。信标取得任务93c对已识别的ISR80~87的优先顺序,和从中断任务存储器中取得的优先顺序进行比较,对已取得请求信标的ISR80~87的优先顺序是否比执行中的ISR80~87的优先顺序还高进行判定。
当执行中的ISR80~87的优先顺序比取得了请求信标的ISR80~87的优先顺序还高的情况下,信标取得任务93c在与已取得请求信标的ISR80~87对应的ICB40~47的ICB位置变更标志1719中设定“ON”(图20-2的步骤S1208)。
另外,信标取得任务93c在与执行中的ISR80~87对应的ICB40~47的ICB位置变更标志1719中设定“ON”(图20-2的步骤S1209)。
信标取得任务93c在与已取得请求信标的ISR80~87对应的ICB40~47的ICB位置变更对象180中设定执行中的ISR80~87的信息(ISR识别符)(图20-2的步骤S1210)。
另外,信标取得任务93c在与执行中的ISR80~87对应的ICB40~47的ICB位置变更对象180中设定已取得请求信标的ISR80~87的信息(ISR识别符)(图20-2的步骤S1211)。
信标取得任务93c变更ICB40-47的位置(图20-2的步骤S1212)。具体地说,信标取得任务93c在ICB排列4中的ICB40~47的连结中,更换与取得了请求信标的ISR80~87对应的ICB40~47,和与执行中的ISR80~87对应的ICB40~47。由此,对检索应该执行的调度器(dispatcher)7的ISR80~87的顺序进行变更以交换优先顺序。
信标取得任务93c在与执行中的ISR80~87对应的ICB40~47的信标等待索引173中设定所要求的信标索引(图20-2的步骤S1213)。
信标取得任务93c在与执行中的ISR80~87对应的ICB40~47的信标等待标志1714中设定“ON”的同时,在ready/not ready标志1712中设定“OFF”(图20-2的步骤S1214)。信标取得任务93c在与请求信标对应的信标构造体21~23的等待ISR213中设定执行中的ISR80~87的ISR识别符,并把处理转移到调度程序6(图20-2的步骤S1215,S1216)。
以下,参照图21的流程图,说明信标解放任务94a的动作。信标解放任务94a把CPU11的动作模式设置为中断禁止状态,在与进行信标解放(起动了信标解放任务94a)的ISR80~87对应的ICB40~47的上下文保存区域181上存储处理器上下文(图21-1的步骤1300,S1301)。
信标解放任务94a在与进行信标解放的ISR80~87对应的ICB40~47的信标取得中标志1713中设定“OFF”(图21-1的步骤S1302)。信标解放任务94a对等待已解放的信标的ISR80~87是否存在进行判定(图21-1的步骤S1303)。
当等待被解放的信标的ISR80~87不存在的情况下,信标解放任务94a增加与已解放的信标对应的信标构造体21~23的信标值211的值(图21-1的步骤S1304)。
信标解放任务94恢复在步骤S1301中存储在与进行了信标解放的ISR80~87对应的ICB40~47的上下文保存区域181上的处理器上下文(拷贝到堆栈区域),回到起动了信标解放任务94a的调出原的下一地址(图21-1的步骤S1305,S1306)。
另一方面,当等待已解放的信标的ISR80~87存在的情况下,信标解放任务94a在清除与等待着信标的ISR80~87对应的ICB40~47的信标等待索引173的同时,在信标等待标志1714中设定“OFF”,在ready/not ready标志1712中设定“ON”(图21-1的步骤S1307)。
信标解放任务94清除与已解放的信标对应的信标构造体21~23的等待ISR213(图21-1的步骤S1308)。信标解放任务94a在与已放开的信标对应的信标构造体21~23的所有ISR212中设定选择出的ISR80~87的ISR识别符(图21-1的步骤S1309)。
信标解放任务94a对与放开信标的ISR80~87对应的ICB40~47的ICB位置变更标志1719是否是“ON”进行判定(图21-2的步骤S1310)。
当ICB位置变更标志1719是“ON”的情况下,信标解放任务94a在与取得了信标的ISR80~87对应的ICB40~47的ICB位置变更标志1719中设定“OFF”(图21-2的步骤S1311)。另外,信标解放任务94a在与放开信标的ISR80~87对应的ICB40~47的ICB位置变更标志1719中设定“OFF”(步骤S22-2的步骤S1312)。
信标解放任务94a对与获得了信标的ISR80~87对应的ICB40~47的ICB位置变更对象180进行初始化(图21-2的步骤S1313)。另外,信标解放任务94a对与放开信标的ISR80~87对应的ICB40~47的ICB位置变更对象180进行初始化(图21-2的步骤S1314)。
信标解放任务94a使ICB排列4中的ICB40~47的位置回到原始位置(图21-2的步骤S1315)。具体地说,在ICB排列4中的ICB40~47的连结中,更换与放开了信标的ISR80~87对应的ICB40~47,和与取得了信标的ISR80~87对应的ICB40~47。由此,在取得了信标的ISR80~87转移到信标等待状态405时变更的ICB排列4中的ICB40~47的连结被返回到基于原本的优先顺序的连结。
在使ICB排列4中的ICB40~47的位置返回原始位置后,或者在与放开信标的ISR80~87对应的ICB40~47的ICB位置变更标志1719是“OFF”的情况下,信标解放任务94a把处理转移到调度程序6(图21-2的步骤S1316)。
这样在本实施方式2中,当判定为信标取得任务判定为所要求的信标不可以使用的情况下,对取得了所要求信标的ISR的优先顺序和要求了信标的ISR的优先顺序进行比较,当取得了所要求的信标的ISR的优先顺序比要求了信标的ISR的优先顺序还低的情况下,在变更ICB排列的连结以更换已取得所要求的信标的ISR的优先顺序和要求了信标的ISR的优先顺序的同时,在与交换了优先顺序的ISR对应起来的ICB中设定表示已变更了优先顺序的信息,信标解放任务当在与放开信标的ISR对应起来的ICB中设定了表示优先顺序已变更的信息的情况下,在变更ICB排列的连结以交换放开信标的ISR的当前的优先顺序,和与放开该信标的ISR进行了优先顺序的交换的ISR的当前的优先顺序的同时,在与交换了优先顺序的ISR对应起来的ICB中设定表示优先顺序没有变更的信息。由此,可以避免在利用信标时以和预先确定的优先权不同的顺序执行ISR的优先顺序的逆转。
如上所述,本发明的实时内部简易监视程序在内部软件的同步排他控制中有用,特别适用于存储内部软件的存储器容量少时的同步排他控制。
权利要求
1.一种实时内部简易监视方法,是基于信标构造体和ICB排列对上述ISR进行调度的实时内部简易监视方法,所述信标构造体被适用在由包含正常状态的多个中断服务程序(ISR)构成的内部软件中,与在上述多个ISR中使用的多个信标对应起来保持与该信标的使用状态有关的信息,所述ICB排列与上述多个ISR的中断级别对应的保持与各ISR的状态有关的信息的中断控制块(ICB),从上述ISR的中断级别的优先顺序位高的ISR开始顺序连接该ICB,该实时内部简易监视方法的特征在于包括ISR起动步骤,在发生中断时,在把在中断发生时被存储在堆栈区域上的程序计数器的值、堆栈寄存器的值即堆栈指针以及把上下文存储在与已中断的ISR对应的ICB的上下文保存区域上的同时,设定在与上述已发生的中断的ISR对应的ICB中处于执行等待状态;调度步骤,选择在设定了执行等待状态的ICB中优先顺序最高的ICB,把被存储在选择出的ICB上下文保存区域上的程序计数器的值、堆栈指针以及上下文存储在上述堆栈区域上,并执行由中断恢复命令选择出的ISR;ISR结束步骤,在结束由上述调度步骤执行的ISR的处理时,设定在与结束的ISR对应的ICB中处于中断等待状态。
2.根据权利要求1所述的实时内部简易监视方法,其特征在于还包括信标取得步骤,基于与通过上述调度步骤执行的ISR要求的信标对应的信标构造体保持着的使用信息,判定是否可以使用所要求的信标,当判定为上述所要求的信标可以使用的情况下,基于与要求了信标的ISR有关的信息更新上述使用信息中的可以使用的信标数以及与取得了信标的ISR有关的信息,让已执行的ISR取得信标,当判定为上述所要求的信标不可以使用的情况下,在基于与要求了信标的ISR有关的信息更新上述使用信息中的与信标等待的ISR有关的信息的同时,设定在与要求了上述信标的ISR对应的ICB中处于信标等待状态;信标放开步骤,基于通过上述调度步骤执行的与ISR放开的信标对应起来的信标构造体所保持的使用信息,对是否存在等待着放开的信标的ISR进行判定,当判断为存在等待着上述放开的信标的ISR时,基于与放开信标的ISR有关的信息以及与等待着信标的ISR有关的信息,更新在上述使用信息中与取得了信标的ISR有关的信息以及与等待着信标的ISR有关的信息,从已执行的ISR中放开信标,在让等待着上述信标的ISR取得已放开的信标的同时,设定在与新取得信标的ISR对应起来的ICB中处于执行等待状态,当判定为不存在等待上述放开的信标的ISR时,基于与放开上述信标的ISR有关的信息来更新在上述使用信息中可以使用的信标数以及与取得了信标的ISR有关的信息并放开信标。
3.根据权利要求2所述的实时内部简易监视方法,其特征在于上述信标构造体的使用信息包含设定可以使用的信标的个数的信标数;对识别已取得信标的ISR的ISR识别符进行设定的所有ISR;对等待信标的取得的信标等待状态的ISR的ISR识别符进行设定的等待ISR,上述信标取得步骤,当与通过上述调度步骤执行的ISR要求的信标对应起来的信标构造体的信标数的值大于等于1的情况下,在减少该信标数的值的同时,把要求信标的ISR的ISR识别符设定在该所有ISR中并取得信标,当与上述所要求的信标对应的信标构造体的信标数小于1的情况下,把要求上述信标的ISR的ISR识别符设定在该等待ISR中,在与要求了上述信标的ISR对应的ICB中设定信标等待状态,上述信标放开步骤,在增加与通过上述调度步骤执行的ISR放开的信标对应起来的信标构造体的信标数的同时,删除对设定在该所有ISR上的信标进行放开的ISR的ISR识别符,当在该等待ISR中设定着ISR识别符的情况下,在对该信标数进行减少的同时,把在该等待ISR中设定着的ISR识别符设定在该ISR中,删除在该等待ISR中设定着的ISR识别符,在与新取得信标的ISR对应起来的ICB中设定执行等待状态。
4.根据权利要求1所述的实时内部简易监视方法,其特征在于上述ISR起动步骤,在中断每次发生时,ISR对已发生的中断进行处理,并增加与ISR对应起来的ICB的执行计数器的值,并把中断次数保持在ICB中,上述调度步骤,只以上述执行计数器保持的中断次数把该ICB作为选择对象,并只以上述中断次数执行自身对应起来的ISR,上述ISR结束步骤,减少上述执行计数器的值。
5.根据权利要求4所述的实时内部简易监视方法,其特征在于上述ISR起动步骤,在与进行上述发生的中断处理的ISR对应起来的ICB的执行计数器的值小于等于预先登记在该ICB中的执行次数上限值的情况下,增加上述执行计数器的值。
6.根据权利要求2~5的任意一项所述的实时内部简易监视方法,其特征在于上述信标取得步骤,当判断为上述要求的信标不能使用的情况下,把取得了上述要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序进行比较,当取得了上述要求的信标的ISR的优先顺序比要求了上述信标的ISR的优先顺序还低的情况下,在变更ICB排列的连接以交换已取得上述要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序的同时,设定表示在与交换了优先顺序的ISR对应起来的ICB中变更了优先顺序的信息,上述信标放开步骤,当设定了表示在与放开上述信标的ISR对应起来的ICB中变更了优先顺序的信息的情况下,在变更ICB排列的连接以交换放开上述信标的ISR的当前的优先顺序,和与放开该信标的ISR交换了优先顺序的ISR的当前的优先顺序的同时,设定表示在与已交换了优先顺序的ISR对应的ICB中没有优先顺序的变更的信息。
7.一种实时内部简易监视程序,是基于信标构造体和ICB排列对上述ISR进行调度的实时内部简易监视程序,所述信标构造体被适用于由包含正常状态的多个中断服务程序(ISR)构成的内部软件中,与在上述多个ISR中使用的多个信标对应起来保持与该信标的使用状态有关的信息,所述ICB排列具有与上述多个ISR的中断级别对应的保持与各ISR的状态有关的信息的中断控制块(ICB),从上述ISR的中断级别的优先顺序高的ISR开始顺序连接该ICB,该实时内部简易监视程序的特征在于,使计算机执行以下步骤ISR取得步骤,在发生中断时,在把在中断发生时存储在堆栈区域中的程序计数器的值、堆栈寄存器的值即堆栈指针以及把上下文存储在与已被中断的ISR对应的ICB的上下文保存区域中的同时,设定在与上述发生了中断的ISR对应的ICB中处于执行等待状态;调度步骤,选择在设定了执行等待状态的ICB中优先顺序最高的ICB,把被存储在选择出的ICB的上下文保存区域中的程序计数器的值、堆栈指针以及上下文存储在上述堆栈区域中,并执行由中断恢复命令选择出的ISR;ISR结束步骤,在结束由上述调度步骤执行的ISR的处理时,设定在与结束的ISR对应的ICB中处于中断等待状态。
8.根据权利要求7所述的实时内部简易监视程序,其特征在于,使计算机进一步执行以下步骤信标取得步骤,基于通过上述调度步骤执行的与ISR要求的信标对应起来的信标构造体保持着的使用信息来判定所要求的信标是否可以使用,当判定为上述所要求的信标可以使用的情况下,基于与要求了信标的ISR有关的信息更新上述使用信息中的可以使用的信标数以及与取得了信标的ISR有关的信息,让已执行的ISR取得信标,当判定为上述请求的信标不能使用的情况下,在基于与要求了信标的ISR有关的信息更新上述使用信息中的与信标等待的ISR有关的信息的同时,设定在与要求了上述信标的ISR对应的ICB中处于信标等待状态;信标放开步骤,基于通过上述调度步骤执行的与ISR放开的信标对应起来的信标构造体所保持的使用信息,对是否存在等待着放开的信标的ISR进行判定,当判定为存在等待着上述放开的信标的ISR的ISR时,基于与放开信标的ISR有关的信息以及与等待着信标的ISR有关的信息,更新在上述使用信息中与取得了信标的ISR有关的信息以及与等待着信标的ISR有关的信息,从已执行的ISR放开信标,在使等待着上述信标的ISR取得已放开的信标的同时,设定在与新取得了信标的ISR对应起来的ICB中处于执行等待状态,当判定为不存在等待着上述放开的信标的ISR时,基于与放开上述信标的ISR有关的信息,更新在上述使用信息中可以使用的信标数以及与取得了信标的ISR有关的信息,并放开信标。
9.根据权利要求8所述的实时内部简易监视程序,其特征在于上述信标构造体的使用信息包含设定可以使用的信标数的的信标数;对识别已取得了信标的ISR的ISR识别符进行设定的所有ISR;对等待着信标的取得的信标等待状态的ISR的ISR识别符进行设定的等待ISR,上述信标取得步骤,当与通过上述调度步骤执行的ISR要求的信标对应起来的信标构造体的信标数的值大于等于1的情况下,在减少该信标数的值的同时,把要求信标的ISR的ISR识别符设定在该所有ISR并取得信标,当与上述所要求的信标对应的信标构造体的信标数小于1的情况下,把要求上述信标的ISR的ISR识别符设定在该等待ISR,在与要求了上述信标的ISR对应的ICB中设定信标等待状态,上述信标放开步骤,在增加与通过上述调度步骤执行的ISR放开的信标对应起来的信标构造体的信标数的同时,删除对设定在该所有ISR上的信标进行放开的ISR的ISR识别符,当在该等待ISR中设定着ISR识别符的情况下,在对该信标数进行减少的同时,把在该等待ISR中设定的ISR识别符设定在该所有ISR中,删除在该等待ISR中设定着的ISR识别符,在与新取得了信标的ISR对应起来的ICB中设定执行等待状态。
10.根据权利要求7所述的实时内部简易监视程序,其特征在于上述ISR起动步骤,在中断每次发生时,ISR对已发生的中断进行处理,并增加与ISR对应的ICB的执行计数器的值,并把中断次数保持在ICB中,上述调度步骤,只以上述执行计数器保持的中断次数把该ICB作为选择对象,并只以上述中断次数执行自身对应的ISR,上述ISR结束步骤,减少上述执行计数器的值。
11.根据权利要求10所述的实时内部简易监视程序,其特征在于上述ISR起动步骤,在与进行上述发生的中断的处理的ISR对应起来的ICB的执行计数器的值小于等于预先被登记在该ICB中的执行次数上限值的情况下,增加上述执行计数器的值。
12.根据权利要求7~11的任意项之一所述的实时内部简易监视程序,其特征在于上述信标取得步骤,在判定为上述要求的信标不能使用的情况下,对取得了上述要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序进行比较,当取得了上述要求的信标的ISR的优先顺序比要求了上述信标的ISR的优先顺序还低的情况下,在变更ICB排列的连接以交换已取得了上述所要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序的同时,设定表示在与交换了优先顺序的ISR对应起来的ICB中变更了优先顺序的信息,上述信标放开步骤,当设定了表示在与放开上述信标的ISR对应起来的ICB中变更了优先顺序的信息的情况下,在变更ICB排列的连接以对放开上述信标的ISR的当前的优先顺序,和与放开该信标的ISR交换了优先顺序的ISR的当前的优先顺序进行交换的同时,设定表示在与交换了优先顺序的ISR对应起来的ICB中没有优先顺序的变更的信息。
13.一种计算机可以读取的记录介质,存储有基于信标构造体和ICB排列对上述ISR进行调度的实时内部简易程序,所述信标构造体被适用在由包含正常状态的多个中断服务程序(ISR)构成的内部软件中,与在上述多个ISR中使用的多个信标对应地保持与该信标的使用状态有关的信息,所述ICB排列具有与上述多个ISR的中断级别对应的保持与各ISR的状态有关的信息的中断控制块(ICB),从上述ISR的中断级别的优先顺序位高的ISR开始顺序连接该ICB的ICB排列,该实时内部简易监视程序的特征在于使计算机执行以下步骤ISR起动步骤,在发生中断时,在把在中断发生时存储在堆栈区域中的程序计数器的值、堆栈寄存器的值即堆栈指针以及把上下文存储在与已被中断的ISR对应的ICB的上下文保存区域中的同时,设定在与上述已发生中断的ISR对应的ICB中处于执行等待状态;调度步骤,在设定了执行等待状态的ICB中选择优先顺序最高的ICB,把被存储在选择出的ICB的上下文保存区域中的程序计数器的值、堆栈指针以及上下文存储在上述堆栈区域中,并执行由中断恢复命令选择出的ISR;ISR结束步骤,在结束由上述调度步骤执行的ISR的处理时,设定在与结束的ISR对应的ICB中处于中断等待状态。
14.根据权利要求13所述的计算机可以读取的记录介质,其特征在于上述实时内部简易监视程序进一步使计算机执行以下步骤信标取得步骤,基于与通过上述调度步骤执行的ISR要求的信标对应起来的信标构造体保持的使用信息,判定是否可以使用所要求的信标,当判定为上述所要求的信标可以使用的情况下,基于与要求了信标的ISR有关的信息更新上述使用信息中的可以使用的信标数以及与取得了信标的ISR有关的信息,让已执行的ISR取得信标,当判定为上述所要求的信标不可以使用的情况下,在基于与要求了信标的ISR有关的信息更新上述使用信息中的与信标等待的ISR有关的信息的同时,设定在与要求了上述信标的ISR对应起来的ICB中处于信标等待状态;信标放开步骤,基于通过上述调度步骤执行的与ISR放开的信标对应起来的信标构造体保持着的使用信息,判定等待着放开的信标的ISR是否存在,当判断为等待着上述放开的信标的ISR存在的情况下,基于与放开信标的ISR有关的信息以及与等待着信标的ISR有关的信息,更新在上述使用信息中与取得了信标的ISR有关的信息以及与等待着信标的ISR有关的信息,从执行的ISR中放开信标,在让等待着上述信标的ISR取得已放开的信标的同时,设定在与新取得信标的ISR对应起来的ICB中ISR处于执行等待状态,当判定为等待上述放开的信标的ISR不存在的情况下,基于与放开上述信标的ISR有关的信息来更新在上述使用信息中可以使用的信标数以及与取得了信标的ISR有关的信息并放开信标。
15.根据权利要求14所述的计算机可以读取的记录介质,其特征在于上述信标构造体的使用信息包含设定可以使用的信标数的信标数;对识别已取得信标的ISR的ISR识别符进行设定的所有ISR;对等待信标的取得的信标等待状态的ISR的ISR识别符进行设定的等待ISR,上述信标取得步骤,当与通过上述调度步骤执行的ISR要求的信标对应起来的信标构造体的信标数的值大于等于1的情况下,在减少该信标数的值的同时,把要求信标的ISR的ISR识别符设定在该所有ISR中并取得信标,当与上述所要求的信标对应起来的信标构造体的信标数小于1的情况下,把要求上述信标的ISR的ISR识别符设定在该等待ISR中,在与要求了上述信标的ISR对应的ICB中设定信标等待状态,上述信标放开步骤,在增加与通过上述调度步骤执行的ISR放开的信标对应起来的信标构造体的信标数的同时,删除对设定在该所有ISR上的信标进行放开的ISR的ISR识别符,当在该等待ISR中设定着ISR识别符的情况下,在对该信标数进行减少的同时,把在该等待ISR中设定着的ISR识别符设定在该ISR中,删除在该等待ISR中设定着的ISR识别符,在与新取得信标的ISR对应的ICB中设定执行等待状态。
16.根据权利要求13所述的计算机可以读取的记录介质,其特征在于上述ISR起动步骤,在中断每次发生时,ISR对已发生的中断进行处理,并增加与ISR对应起来的ICB的执行计数器的值,并把中断次数保持在ICB中,上述调度步骤,只以上述执行计数器保持的中断次数把该ICB作为选择对象,并只以上述中断次数执行自身对应起来的ISR,上述ISR结束步骤,减少上述执行计数器的值。
17.根据权利要求16所述的计算机可以读取的记录介质,其特征在于上述ISR起动步骤,在与进行上述发生中断的处理的ISR对应起来的ICB的执行计数器的值小于等于预先登记在该ICB中的执行次数上限值的情况下,增加上述执行计数器的值。
18.根据权利要求13~17的任意项之一所述的计算机可以读取的记录介质,其特征在于上述信标取得步骤,在判定为上述要求的信标不能使用的情况下,把取得了上述要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序进行比较,当取得了上述要求的信标的ISR的优先顺序比要求了上述信标的ISR的优先顺序还低的情况下,在变更ICB排列的连接以进行取得了上述要求的信标的ISR的优先顺序和要求了上述信标的ISR的优先顺序的同时,设定表示在交换了优先顺序的ISR对应起来的ICB中变更了优先顺序的信息,上述信标放开步骤,当设定了表示在与放开上述信标的ISR对应起来的ICB中变更了优先顺序的信息的情况下,在变更ICB排列的连接以交换放开上述信标的ISR的当前的优先顺序,和与放开该信标的ISR交换了优先顺序的ISR的当前的优先顺序的同时,设定表示在与交换了优先顺序的ISR对应起来的ICB中没有优先顺序的变更的信息。
全文摘要
得到一种不使用实时OS而只用中断处理实现同步排他控制的实时内部简易监视程序。保持与包含正常状态的多个ISR80~87的中断级别对应起来的各ISR80~87的状态相关的信息的ICB40~47,基于从ISR中断级别的优先顺序高的ISR开始顺序地连接的ICB排列,对ISR进行调度时,ISR起动任务在把在中断发生时存储在堆栈区域上的处理器上下文存储在与已中断的ISR80~87对应的ICB的上下文保存区域上的同时,在与已发生的中断对应的ICB40~47中设定处于执行等待状态,调度器在已设定了执行状态的ICB40~47中选择优先顺序最高的ICB40~47,把选择出的被存储在ICB40~47的上下文保存区域上的处理器上下文存储在堆栈区域上,执行与用中断恢复命令选择出的ICB40~47对应的ISR。
文档编号G06F9/46GK1908904SQ20061000641
公开日2007年2月7日 申请日期2006年1月20日 优先权日2005年8月5日
发明者南角茂树, 井上祯一郎, 岩桥正实, 川上敏弘 申请人:三菱电机株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1