(57)【特許請求の範囲】
【請求項１】
実行単位となる複数の処理プログラムを当該処理プログラム毎に設定される優先度に基づき実行することによって、一連の機能を実現する情報処理装置において、
前記優先度の相対的に低い下位プログラムと前記優先度の相対的に高い上位プログラムとの間で共通に使用されるグローバル変数を２つの領域に重複させて記憶させ、当該領域の一方を公開領域、他方を作業領域として設定しておき、
前記下位プログラムによる前記グローバル変数の参照途中で前記上位プログラムによって前記グローバル変数が更新される可能性のある第１のケースに対し、
前記上位プログラムでは、前記作業領域を使用して前記グローバル変数を更新する上位更新処理を実行するようにし、
一方、前記下位プログラムでは、前記公開領域を使用して前記グローバル変数を参照する下位参照処理及び、当該下位参照処理による前記グローバル変数の参照を完了すると、前記作業領域を新たに公開領域として設定しなおすと共に前記公開領域を新たに作業領域として設定しなおす領域切換処理を実行するようにしたこと
を特徴とする情報処理装置。
【請求項２】
実行単位となる複数の処理プログラムを当該処理プログラム毎に設定される優先度に基づき実行することによって、一連の機能を実現する情報処理装置において、
前記優先度の相対的に低い下位プログラムと前記優先度の相対的に高い上位プログラムとの間で共通に使用されるグローバル変数を２つの領域に重複させて記憶させ、当該領域の一方を公開領域、他方を作業領域として設定しておき、
前記下位プログラムによる前記グローバル変数の参照途中で前記上位プログラムによって前記グローバル変数が更新される可能性のある第１のケースに対し、
前記上位プログラムでは、前記作業領域を使用して前記グローバル変数を更新する上位更新処理を実行するようにし、
一方、前記下位プログラムでは、前記公開領域を使用して前記グローバル変数を参照する下位参照処理及び、当該下位参照処理による前記グローバル変数の参照を完了すると、前記作業領域を新たに公開領域として設定しなおすと共に前記公開領域を新たに作業領域として設定しなおす領域切換処理を実行するようにしており、
さらに、前記下位プログラムによる前記グローバル変数の更新途中で前記上位プログラムによって前記グローバル変数が参照される可能性のある第２のケースに対し、
前記上位プログラムでは、前記公開領域を使用して前記グローバル変数を参照する上位参照処理を実行するようにし、
一方、前記下位プログラムでは、前記作業領域を使用して前記グローバル変数を更新する下位更新処理及び、当該下位更新処理による前記グローバル変数の更新を完了すると、前記作業領域を新たに公開領域として設定しなおすと共に前記公開領域を新たに作業領域として設定しなおす領域切換処理を実行するようにしたこと
を特徴とする情報処理装置。
【請求項３】
請求項２に記載の情報処理装置において、
前記各処理プログラムでは、前記グローバル変数の参照又は更新を行う他の処理プログラムの優先度に基づき、前記下位処理プログラム又は前記上位処理プログラムのいずれに該当するかを判断する判断処理を実行し、当該判断処理による判断結果に基づいて、前記該当する処理を実行するようにしたこと
を特徴とする情報処理装置。
【請求項４】
請求項３に記載の情報処理装置において、
前記グローバル変数の参照又は更新を行う処理プログラムの優先度の中で最も高い優先度を記憶するための優先度記憶手段を備え、
前記判断処理は、前記優先度記憶手段に記憶された優先度と、判断対象の処理プログラムに設定された優先度とを比較することによって判断するものであること
を特徴とする情報処理装置。
【請求項５】
請求項３に記載の情報処理装置において、
前記判断処理は、判断対象の処理プログラムにて処理対象となるグローバル変数についての参照又は更新を行う他の処理プログラムの優先度に基づき判断するものであること
を特徴とする情報処理装置。
【請求項６】
請求項５に記載の情報処理装置において、
前記グローバル変数毎に、当該グローバル変数の参照又は更新を行う処理プログラムの優先度の中で最も高い優先度を記憶するための優先度記憶手段を備え、
前記判断処理は、前記優先度記憶手段に記憶された、前記処理対象となるグローバル変数に対応する優先度と、判断対象の処理プログラムに設定された優先度とを比較することによって判断するものであること
を特徴とする情報処理装置。
【請求項７】
請求項１〜６のいずれかに記載の情報処理装置において、
さらに、前記公開領域又は前記作業領域として領域を設定する設定情報を記憶するための領域情報記憶手段を備えていること
を特徴とする情報処理装置。
【請求項８】
請求項７に記載の情報処理装置において、
前記領域切換処理は、前記領域情報記憶手段に記憶された前記設定情報を更新することによって、前記作業領域を新たに公開領域として設定しなおすと共に前記公開領域を新たに作業領域として設定しなおすものであること
を特徴とする情報処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、割込処理が実行される処理プログラムにおいて、割込処理のリアルタイム性を確保する技術に関する。
【０００２】
【従来の技術】
例えば車両に搭載される電子制御装置（以下「ＥＣＵ」という。）に用いられる制御プログラムでは、制御応答性や安全性の確保等から所定の処理をリアルタイムに実行する必要性がある。そのため、このようなリアルタイム性を必要とする処理（リアルタイム処理）は、メインルーチンとは別の割込ルーチンとして用意されるのが一般的である。割り込みルーチンは、例えばイベントの発生等をトリガとしてメインルーチンの実行中に優先して実行される。優先して実行されるとは、割込ルーチンの実行により一時的にメインルーチンの実行が中断され、割込ルーチン終了後に、再びその中断位置からメインルーチンが実行されることをいう。
【０００３】
近年では、上述したＥＣＵの制御プログラムもＯＳ（オペレーティング・システム）上で動作するようになっており、メインルーチンや割込ルーチン等の実行単位がタスクと呼ばれ、ＯＳにより管理されている。
このタスクには実行の優先度を示すレベル（タスクレベル）が設定されており、このタスクレベルに基づいて上述したような割込処理を実現している。つまり、ＯＳの管理の下、相対的にレベルの高いタスクである上位タスクは、相対的にレベルの低いタスクである下位タスクに優先する（割り込む）。上述した例で言えば、メインルーチンによる処理が下位タスクに相当し、割込ルーチンによる処理が上位タスクに相当する。
【０００４】
このようなタスク概念の導入は、タスクレベルを設定するという極めて簡単な情報記述だけで何等プログラム間の実行タイミング等を記述する必要をなくし、割込処理の設計を容易にした。
一方、イベント発生というような、下位タスクの処理タイミングに関係しないタイミングで、上位タスクが割り込む。そのため、下位タスクに不具合が生じる可能性がある。ここで本発明で前提とする、上位タスクの割り込みによって生じる不具合について説明する。
【０００５】
上位タスクと下位タスクとで共通の変数を操作する場合を考える。この共通の変数は、例えばプログラム全体が複数の関数にて構成されているとき、これら関数間で共通にアクセスできる記憶領域に記憶されるものであり、グローバル変数（大域変数）と呼ばれる。
【０００６】
例えば、下位タスクにて２つのグローバル変数ａ，ｂを参照し、上位タスクにて同一のグローバル変数ａ，ｂを更新する場合を考える。このとき、下位タスクにて変数ａが参照された後、変数ｂが参照される前に上位タスクが割り込むと、グローバル変数ａ，ｂが共に更新されてしまい、その後、下位タスクで参照されるグローバル変数ｂは上位タスクによる更新後のものになってしまう。つまり、一方のグローバル変数ａについては時間的に古いものが参照され、他方のグローバル変数ｂについては時間的に新しいものが参照されるのである。このような状態は、グローバル変数の同時性（一貫性、無矛盾性などと呼ばれることもある）が失われた状態と表現され、この同時性が必要とされる場合、例えば時間的な相関関係が変数間に存在するような場合には、制御上の問題を招く事態となる。
【０００７】
また例えば、下位タスクにて２つのグローバル変数ａ，ｂを更新し、上位タスクにて同一のグローバル変数ａ，ｂを参照する場合も同様である。このとき、下位タスクにて変数ａが更新された後、変数ｂが更新される前に、上位タスクによってグローバル変数ａ，ｂが参照される可能性がある。このような上位タスクの割り込みがあると、一方のグローバル変数ａについては時間的に新しいものが参照され、他方のグローバル変数ｂについては時間的に古いものが参照されてしまう。つまり、この場合も、グローバル変数の同時性が失われてしまう。
【０００８】
なお、上述した例では２つのグローバル変数を処理対象としていたが、同時性を必要とする３つ以上のグローバル変数を処理対象とする場合も、同様の問題が発生する。また、１つのグローバル変数を処理対象とする場合であっても、同様の問題が発生する。例えば下位タスクで２回連続して同一のグローバル変数を読み出す場合が一例として挙げられる。このときは、下位タスクによる１回目の変数の参照後に上位タスクでその変数が更新されると、２回目に読み出された変数は、１回目に読み出された変数と異なるものとなってしまい、同時性が失われることになる。
【０００９】
従来、このような同時性を確保するため、下位タスクのプログラム中には、必要に応じて割込禁止／許可命令を記述していた。割込禁止命令は、上位タスクの割り込みを禁止するものであり、割込許可命令は上位タスクの割り込みを許可するものである。つまり、割込禁止命令と割込許可命令で挟まれた処理ステップの途中では、上位タスクは割り込めない。したがって、同時性を必要とするグローバル変数に係る処理の前後にそれぞれ割込禁止命令、割込許可命令を記述しておけば、上位タスクによる参照・更新がなされないため、グローバル変数の同時性が確保できることになる。
【００１０】
【発明が解決しようとする課題】
上述したような割込処理は、リアルタイム処理の実行には不可欠の技術であり、ＯＳによるタスク管理といったコンピュータ技術の発達によって容易に設計されるに至った。しかしながら一方で、割込処理が増えると、それに応じて割込禁止／許可命令の記述が増えることにより、リアルタイム性が確保できなくなってしまうことが問題になる。これについて説明する。
【００１１】
上述したように、下位タスクのプログラム中に割込禁止／許可命令が記述されると、割込禁止命令と割込許可命令で挟まれた処理ステップの途中では、上位タスクは割り込めない。すなわち、上位タスクは下位タスクで割込許可がなされるまで実行を待つことになり、この期間は、実行の優先度が実質的に逆転することになる。そのため、割込処理が増えてこのような期間が多くなればなるほど、リアルタイム処理である上位タスクの実行が遅れる可能性が高くなり、制御応答性や安全性の確保等が実現が困難になるなど、制御性能に影響を及ぼす結果を招いてしまう。
【００１２】
本発明は、このような問題を解決するためになされたものであり、相対的に優先度の高い上位プログラムによる割込処理を遅らせることなく、しかも、相対的に優先度の低い下位プログラムとの間で共通に使用されるグローバル変数の参照時の同時性を確保することを目的とする。
【００１３】
【課題を解決するための手段及び発明の効果】
上述した目的を達成するためになされた請求項１に記載の情報処理装置は、実行単位となる複数の処理プログラムを当該処理プログラム毎に設定される優先度に基づき実行することによって、一連の機能を実現する。例えばＯＳ上でタスク管理されるプログラムであれば、この処理プログラム毎にタスクが生成されることになり、タスク毎に設定されるタスクレベルがここでいう優先度に相当する。なお、以下では各機能の実現において処理プログラムを主体とした表現を便宜上用いることがあるが、実際には情報処理装置の備えるいわゆるＣＰＵが主体となって処理プログラムを実行することによって各機能が実現されることは言うまでもない。
【００１４】
本発明では、グローバル変数を２つの領域に重複させて記憶させる。グローバル変数は、優先度の相対的に低い下位プログラムと優先度の相対的に高い上位プログラムとの間で共通に使用される変数である。ここで「２つの領域に重複させて記憶させる」というのは、各グローバル変数をそれぞれ、一方の領域（以下「領域１」という。）と他方の領域（以下「領域２」という。）の両方に記憶することをいう。そして、例えば領域１を公開領域として設定し、領域２を作業領域として設定する。
【００１５】
そして、本発明では、下位プログラムによるグローバル変数の参照途中で、上位プログラムによってグローバル変数が更新される可能性のある第１のケースに対し、次のような構成を採用した。
すなわち、上位プログラムでは、上位更新処理を実行することによって、作業領域を使用してグローバル変数を更新し、一方、下位プログラムでは、下位参照処理を実行することによって、公開領域を使用してグローバル変数を参照するようにした。つまり、グローバル変数の参照と更新を別々の領域で行うようにし、下位プログラムによるグローバル変数の参照時における同時性を確保したのである。
【００１６】
具体的に、下位プログラムにて２つのグローバル変数ａ，ｂを参照し、上位プログラムにて同一のグローバル変数ａ，ｂを更新する場合を考える。このとき、下位プログラムでは、公開領域に記憶されたグローバル変数ａ，ｂを参照する。一方、上位プログラムは、作業領域に記憶されたグローバル変数ａ，ｂを更新する。したがって、例えば下位プログラムによる参照途中で上位プログラムが割り込んでも、作業領域に記憶されたグローバル変数ａ，ｂが更新されるだけであり、下位プログラムの参照する公開領域に記憶されたグローバル変数ａ，ｂは更新されない。すなわち、下位プログラムで参照されるグローバル変数ａ，ｂの同時性が確保される。
【００１７】
そして、下位プログラムではさらに、下位参照処理によるグローバル変数の参照を完了すると、領域切換処理を実行することによって、作業領域を新たに公開領域として設定しなおすと共に公開領域を新たに作業領域として設定しなおす。
「グローバル変数の参照を完了する」とは、同時性を必要とするグローバル変数の一連の参照処理が完了することをいう。例えば同時性を必要とする複数のグローバル変数の参照処理を全て完了した場合であることが考えられる。また、同時性を必要とする１つのグローバル変数の複数回の参照処理を全て完了した場合であることが考えられる。
【００１８】
参照を完了した時点では、それ以前の上位プログラムの割り込みによって作業領域のグローバル変数が更新されている可能性がある。したがって、作業領域と公開領域とを切り換えることにより、次の参照処理において、更新されたグローバル変数が参照されるようにする。
【００１９】
このようにすれば、上位プログラムによる割込処理を遅らせることなく、しかも、下位プログラムで参照されるグローバル変数の同時性を確保することができる。
ところで、上述した構成は、下位プログラムによるグローバル変数の参照途中で、上位プログラムによってグローバル変数が更新される可能性のある第１のケースに対するものであった。これに対し、さらに、下位プログラムによるグローバル変数の更新途中で、上位プログラムによってグローバル変数が参照される可能性のある第２のケースも考えられる。上述した第１及び第２のそれぞれのケースに対し、下位プログラム及び上位プログラムにおけるグローバル変数参照時の同時性を確保するために、請求項２に示す構成を採用することが考えられる。
【００２０】
すなわち、上位プログラムでは、上位参照処理を実行することによって、公開領域を使用してグローバル変数を参照し、一方、下位プログラムでは、下位更新処理を実行することによって、作業領域を使用してグローバル変数を更新することを特徴とするものである。
【００２１】
この場合も、グローバル変数の参照と更新を別々の領域で行うようにしたことによって、このときは、上位プログラムによる参照時におけるグローバル変数の同時性を確保した。
具体的に、下位プログラムにて２つのグローバル変数ａ，ｂを更新し、上位プログラムにて同一のグローバル変数ａ，ｂを参照する場合を考える。このとき、下位プログラムでは、作業領域に記憶されたグローバル変数ａ，ｂを更新する。一方、上位プログラムは、公開領域に記憶されたグローバル変数ａ，ｂを参照する。したがって、例えば下位プログラムによる更新途中で上位プログラムが割り込んでも、公開領域に記憶されたグローバル変数ａ，ｂが参照されることになり、更新途中の作業領域に記憶されたグローバル変数ａ，ｂが参照されることはない。すなわち、上位プログラムで参照されるグローバル変数ａ，ｂの同時性が確保される。
【００２２】
そして、この場合も下位プログラムでは、下位更新処理によるグローバル変数の更新を完了すると、領域切換処理を実行することによって、作業領域と公開領域とを切り換える。次の参照処理において、更新されたグローバル変数が参照されるようにするためである。なお、「グローバル変数の更新を完了する」とは、参照の場合と同様、同時性を必要とするグローバル変数の一連の更新処理が完了することをいう。
【００２３】
このようにすれば、上位プログラムによる割込処理を遅らせることなく、しかも上位プログラムあるいは下位プログラムで参照されるグローバル変数の同時性を確保することができる。
【００２４】
ところで、本発明は、上述したような第１又は第２のケースにおけるグローバル変数参照時の同時性の確保を目的としてなされたものである。したがって、このいずれかのケースに該当することを前提に、各処理プログラムは、他の処理プログラムとの関係において、自らを、上位プログラム又は下位プログラムとして判断するようにしてもよい。
【００２５】
例えば、ある処理プログラムがグローバル変数を参照する場合、別の処理プログラムによってグローバル変数が更新される可能性があることが予め分かっているという前提の下で、その別の処理プログラムに対して、上位プログラムとなるのか下位プログラムとなるのかを判断することが考えられる。同様に、ある処理プログラムがグローバル変数を更新する場合、別の処理プログラムによってグローバル変数が参照される可能性があることが予め分かっているという前提の下でその別の処理プログラムに対して、上位プログラムとなるのか下位プログラムとなるのかを判断することが考えられる。
【００２６】
そこで、請求項３に示すように、各処理プログラムでは、グローバル変数の参照又は更新を行う他の処理プログラムの優先度に基づき、下位処理プログラム又は上位処理プログラムのいずれに該当するかを判断する判断処理を実行し、当該判断処理による判断結果に基づいて、該当する処理を実行するようにしてもよい。具体的には、例えば請求項４に示すように、グローバル変数の参照又は更新を行う処理プログラムの優先度の中で最も高いものを優先度記憶手段に記憶しておき、この記憶された優先度と処理プログラムに設定される優先度とを比較することによって、判断することが考えられる。このようにすれば、各処理プログラムをより汎用的なものとすることができる点で有利である。
【００２７】
なお、定義されたグローバル変数の全てが各処理プログラムの処理対象となるわけではない。したがって、他の処理プログラムにて更新又は参照されるグローバル変数が、処理対象のグローバル変数以外である可能性も考えられる。このような場合は、割り込みによる干渉は発生しない。
【００２８】
そこで、請求項５に示すように、上述した判断処理を、判断対象の処理プログラムにて処理対象となるグローバル変数についての参照又は更新を行う他の処理プログラムの優先度に基づき判断するものにするとよい。この場合、具体的には、請求項６に示すように、グローバル変数毎に、当該グローバル変数の参照又は更新を行う処理プログラムの優先度の中で最も高いものを優先度記憶手段に記憶しておくことが考えられる。このとき判断処理は、優先度記憶手段に記憶された、処理対象となるグローバル変数に対応する優先度と、判断対象の処理プログラムに設定された優先度とを比較することによって判断するものとする。
【００２９】
ところで、本発明では、２つの領域の一方を公開領域とし、他方を作業領域として設定し、領域切換処理によって、公開領域と作業領域を切り換える。このような領域設定は、例えば請求項７に示すように、領域情報記憶手段を備える構成とし、この領域情報記憶手段に設定情報を記憶することで実現することが考えられる。例えば設定情報として「１」又は「２」が記憶されるようにしておき、設定情報が「１」の場合は領域１が公開領域として、領域２が作業領域として設定され、一方「２」の場合は逆に、領域１が作業領域として、領域２が公開領域として設定されるという具合である。
【００３０】
この場合、請求項８に示すように、領域切換処理は、領域情報記憶手段に記憶された設定情報を更新することによって、作業領域を新たに公開領域として設定しなおすと共に公開領域を新たに作業領域として設定しなおすものとすることが考えられる。このような設定情報の更新は、ＣＰＵの一命令で実現できるため、このようにすれば領域切換の途中に割り込みがかかることもない。その結果、上位プログラムあるいは下位プログラムで参照されるグローバル変数の同時性を確実に確保できる。
【００３１】
【発明の実施の形態】
以下、本発明を具体化した実施例を図面を参照して説明する。
［実施例］
図１は、本発明の「情報処理装置」を具体化したエンジン制御装置（以下「ＥＣＵ」という。）１の構成を表すブロック図である。ＥＣＵ１は、車両に搭載された内燃機関型エンジンの制御を行う。
【００３２】
ＥＣＵ１は、エンジンのクランク軸が所定角度回転する毎にパルス状の信号を出力する回転角センサ、エンジンの特定の気筒のピストンが所定位置（例えば上死点：ＴＤＣ）にくる度にパルス状の信号を出力する基準位置センサ、エンジンの冷却水の温度を検出する水温センサ、及び酸素濃度を計測する酸素濃度センサ等、エンジンの運転状態を検出する様々なセンサ３０からの信号を入力して波形整形やＡ／Ｄ変換を行う入力回路２１と、入力回路２１からのセンサ信号に基づき、エンジンを制御するための様々な処理を実行するマイクロコンピュータ（以下「マイコン」という。）１０と、マイコン１０からの制御データに応じて、エンジンに取付けられたインジェクタ（燃料噴射装置）及びイグナイタ（点火装置）等のアクチュエータ４０を駆動する出力回路２２とを、備えている。
【００３３】
そして、マイコン１０には、プログラムを実行する周知のＣＰＵ（中央演算処理装置）１１と、ＣＰＵ１１によって実行されるプログラムを記憶するＲＯＭ１２と、ＣＰＵ１１による演算結果等を記憶するためのＲＡＭ１３と、入力回路２１及び出力回路２２との間で信号をやり取りするためのＩ／Ｏ１４と、各種レジスタやフリーランカウンタ等（図示省略）とが備えられている。
【００３４】
このように構成されたＥＣＵ１は、各種センサ３０から入力回路２１を介して入力される信号に基づき、出力回路２２に接続されたアクチュエータ４０を駆動する、エンジン制御処理を行う。
このエンジン制御を実現するためのエンジン制御プログラムは、上述したようにマイコン１０の備えるＲＯＭ１２に記憶されている。そして、このエンジン制御プログラムは実行単位毎に細分化されて記述されている。実行単位となる各処理プログラムは、設定される優先度（タスクレベル）に基づき実行される。具体的には、優先度の相対的に高い処理プログラムである上位プログラムは、相対的に低い処理プログラムである下位プログラムに優先して実行される。これら処理プログラムの実行単位がタスクと呼ばれ、ＯＳによって管理される。以下では、上位プログラムの実行単位を上位タスクと記述し、下位プログラムの実行単位を下位タスクと記述する。このようにして各タスクは、優先度に基づく割込処理によって、上述したエンジン制御処理に係る制御データを算出して更新したり、算出された制御データを参照して新たな制御データを算出したりする。
【００３５】
制御データを各タスクで共通に処理するために、グローバル変数が用いられる。グローバル変数は、例えばプログラム全体が複数の関数にて構成されているとき、これら関数間で共通にアクセスできる記憶領域に記憶される。
このようなグローバル変数の上位タスク及び下位タスクによる参照・更新を考えた場合、上述した割込処理によってグローバル変数の参照時の同時性が失われてしまうことがある。
【００３６】
従来は、このような不具合を回避するために、割込禁止／許可命令を下位タスクで実行することによって、同時性を必要とするグローバル変数の処理の途中で、上位タスクが割り込んでグローバル変数を処理できないようにしていた。
ところが、このような手法で上位タスクの割り込みを禁止してしまうと、下位タスクによって割込許可がなされるまで上位タスクは実行を待つことになり、この期間は、実質的に優先度が逆転してしまうことになる。そしてこのような割込処理が増えれば、それに伴って割込禁止の期間が多くなるため、上位タスクのリアルタイム性が確保できなくなって、制御性能に問題が生じる。
【００３７】
そこで本実施例では、次のようにした。
まず、グローバル変数を重複させて２つの領域に記憶させるようにした。図１に示すように、ＲＡＭ１３に、このグローバル変数の記憶領域１３ｂが設けられている。本実施例では、グローバル変数としての３つの制御データＡ，Ｂ，Ｃを処理対象としている。この場合、図２に示すように、制御データを領域１に格納すると共に他方の領域２にも格納する。ここでは、領域１に格納された制御データＡ，Ｂ，ＣをそれぞれＡ１，Ｂ１，Ｃ１と示し、領域２に格納された制御データＡ，Ｂ，ＣをそれぞれＡ２，Ｂ２，Ｃ２と示した。そして、ＲＡＭ１３には領域設定情報Ｓの記憶領域１３ａが設けられており、ここに記憶される領域設定情報Ｓの値によって、２つの領域１，２の一方を公開領域として、他方を作業領域として設定するようにした。具体的には、領域設定情報Ｓが「１」であれば、領域１が公開領域として設定され、領域２が作業領域として設定される。一方、領域設定情報Ｓが「２」であれば、領域１が作業領域として設定され、領域２が公開領域として設定される。
【００３８】
そして、本実施例は、下位タスクの制御データの参照処理の途中で上位タスクの割り込みによって制御データが更新される可能性のある第１のケースに対応するものであり、本実施例では、下位タスク処理及び上位タスク処理を以下に示すようなものとした。
【００３９】
まず下位タスク処理について、図３のフローチャートに基づき説明する。なお、図３に示すフローチャートは、制御データＡ，Ｂ，Ｃを参照して、これら制御データＡ，Ｂ，Ｃに基づき、新たな制御データＵを算出することを特徴とするものであり、これらの特徴的な処理に関係しないその他の処理については、フローチャート中に破線で示して省略した。
【００４０】
まずステップ（以下、ステップを単に記号Ｓで示す。）１００では、ＲＡＭ１３の記憶領域１３ｂに記憶された制御データＡを参照する。同様に、続くＳ１１０では制御データＢを参照し、さらに次のＳ１２０では、制御データＣを参照する。制御データＡ，Ｂ，Ｃの参照は、参照処理のサブルーチンをコールすることによってなされる。
【００４１】
ここで制御データＡ，Ｂ，Ｃの参照処理を、図４のフローチャートに基づき説明する。
処理が開始されると、最初に領域設定情報Ｓが「１」であるか否かを判断する（Ｓ２００）。領域設定情報Ｓは、上述したようにＲＡＭ１３の記憶領域１３ａに記憶されている。ここで領域設定情報Ｓが「１」であれば（Ｓ２００：ＹＥＳ）、領域１から制御データを読み出し（Ｓ２１０）、その後、本参照処理を終了する。一方、領域設定情報Ｓが「１」でない場合、すなわち領域設定情報Ｓが「２」であれば（Ｓ２００：ＮＯ）、領域２から制御データを読み出し（Ｓ２２０）、その後、本参照処理を終了する。
【００４２】
このような参照処理は、３つの制御データＡ，Ｂ，Ｃのそれぞれに対し、個別に用意してもよい。つまり、制御データＡを参照するための参照処理、制御データＢを参照するための参照処理、制御データＣを参照するための参照処理という具合に別個のサブルーチンにすることが考えられる。例えば制御データＡを参照するための参照処理では、領域１又は２の最初の記憶領域から制御データＡ１又はＡ２が読み出されるという具合である。また、３つの制御データＡ，Ｂ，Ｃのいずれかを指定して、共通の参照処理をコールするようにしてもよい。この場合、例えば制御データＢを指定すれば、領域１又は２の２番目の記憶領域から制御データＢ１又はＢ２が読み出されるという具合である。
【００４３】
いずれにしても、この場合、公開領域として設定された領域から制御データＡ，Ｂ，Ｃが読み出されることになる。領域設定情報Ｓが「１」であれば、領域１が公開領域となっているからであり、領域設定情報Ｓが「２」であれば、領域２が公開領域となっているからである。
【００４４】
図３のＳ１２０に続くＳ１３０では、領域設定情報Ｓが「１」であるか否かを判断する。ここで領域設定情報Ｓが「１」である場合（Ｓ１３０：ＹＥＳ）、Ｓ１４０にて領域設定情報Ｓを「２」として更新する。一方、領域設定情報Ｓが「１」でない場合（Ｓ１３０：ＮＯ）、すなわち領域設定情報Ｓが「２」である場合には、Ｓ１５０にて領域設定情報Ｓを「１」として更新する。
【００４５】
Ｓ１４０又はＳ１５０から移行するＳ１６０では、Ｓ１００〜Ｓ１２０で参照した制御データＡ，Ｂ，Ｃに基づき、新たな制御データＵを算出する。その後、本下位タスク処理を終了する。
続けて上位タスク処理について、図５のフローチャートに基づき説明する。なお、図５に示すフローチャートは、制御データＡ，Ｂ，Ｃを算出して、これら制御データＡ，Ｂ，Ｃを更新することを特徴とするものである。図３に示した下位タスク処理と同様、これらの特徴的な処理に関係しないその他の処理については、フローチャート中に破線で示して省略した。
【００４６】
まず最初のＳ３００において、３つの制御データＡ，Ｂ，Ｃを算出する。
続くＳ３１０では、ＲＡＭ１３の記憶領域１３ｂに記憶された制御データＡを更新する。同様に、次のＳ３２０では制御データＢを更新し、さらにＳ３３０では、制御データＣを更新する。その後、本上位タスク処理を終了する。
【００４７】
上述した制御データＡ，Ｂ，Ｃの更新は、更新処理のサブルーチンをコールすることによってなされる。
ここで制御データＡ，Ｂ，Ｃの更新処理を、図６のフローチャートに基づき説明する。
【００４８】
処理が開始されると、最初に領域設定情報Ｓが「１」であるか否かを判断する（Ｓ４００）。ここで領域設定情報Ｓが「１」であれば（Ｓ４００：ＹＥＳ）、領域２へ制御データを書き込む（Ｓ４１０）、その後、本更新処理を終了する。一方、領域設定情報Ｓが「１」でない場合、すなわち領域設定情報Ｓが「２」であれば（Ｓ４００：ＮＯ）、領域１へ制御データを書き込む（Ｓ４２０）、その後、本更新処理を終了する。
【００４９】
このような更新処理も、参照処理と同様、３つの制御データＡ，Ｂ，Ｃのそれぞれに対し、個別に用意してもよい。また、３つの制御データＡ，Ｂ，Ｃのいずれかを指定して、共通の更新処理をコールするようにしてもよい。
いずれにしても、この場合、作業領域として設定された領域へ制御データＡ，Ｂ，Ｃが書き込まれることになる。領域設定情報Ｓが「１」であれば、領域２が作業領域となっているからであり、領域設定情報Ｓが「２」であれば、領域１が作業領域となっているからである。
【００５０】
以上説明したように、本実施例のＥＣＵ１では、グローバル変数としての制御データＡ，Ｂ，Ｃの参照と更新を別々の領域で行うようにし、下位タスクによる制御データＡ，Ｂ，Ｃの参照時における同時性を確保した。
例えば領域設定情報Ｓが「１」であるものとして、具体的に説明する。
【００５１】
領域設定情報Ｓが「１」であれば領域１が公開領域となっている。したがって、下位タスクでは、公開領域である領域１に記憶された制御データＡ１，Ｂ１，Ｃ１を参照する（図３中のＳ１００〜Ｓ１２０、図４参照）。一方、上位タスクは、作業領域である領域２に記憶された制御データＡ２，Ｂ２，Ｃ２を更新する（図５中のＳ３１０〜Ｓ３３０、図６参照）。したがって、例えば下位タスクによる参照途中で上位タスクが割り込んでも、領域２に格納された制御データＡ２，Ｂ２，Ｃ２が更新されるだけであり、下位タスクの参照する領域１に格納された制御データＡ１，Ｂ１，Ｃ１は更新されない。すなわち、下位タスクで参照される制御データＡ１，Ｂ１，Ｃ１の同時性が確保される。
【００５２】
また、同時性を必要とする制御データＡ１，Ｂ１，Ｃ１の参照が完了した時点（図３中のＳ１２０終了時点）では、それ以前の上位タスクの割り込みによって領域２の制御データＡ２，Ｂ２，Ｃ２が更新されている可能性がある。したがって、領域設定情報Ｓを「１」→「２」と更新することによって（Ｓ１３０：ＹＥＳ、Ｓ１４０）、作業領域と公開領域とを切り換える。すなわち、領域１を作業領域として設定しなおすと共に、領域２を公開領域として設定しなおす。これによって、次の参照処理において、更新された制御データＡ２，Ｂ２，Ｃ２が参照されることになる。
【００５３】
その結果、上位タスクの割込処理を遅らせることなく、しかも、下位タスクで参照される制御データの同時性を確保することができる。
さらに、本実施例では、ＲＡＭ１３の記憶領域１３ａに記憶した領域設定情報Ｓによって領域１，２の一方を公開領域、他方を作業領域として設定し、この領域設定情報Ｓを更新することによって（図３中のＳ１３０〜Ｓ１５０）、領域１，２を切り換えるようにした。このような領域設定情報Ｓの更新は、ＣＰＵの一命令で実現できるため、領域切換の途中に割り込みがかかることもない。その結果、下位タスクで参照される制御データの同時性を確実に確保できる。
【００５４】
なお、本実施例におけるＲＡＭ１３が「領域情報記憶手段」に相当する。そして、図３中に一点鎖線で示した、Ｓ１００〜Ｓ１２０の処理が「下位参照処理」に相当し、Ｓ１３０〜Ｓ１５０の処理が「領域切換処理」に相当する。また、図５中に一点鎖線で示したＳ３１０〜Ｓ３３０の処理が「上位更新処理」に相当する。
［参考例］
上記実施例は、下位タスクの制御データの参照処理の途中で上位タスクの割り込みによって制御データが更新される可能性のある第１のケースに対応するものであった。
【００５５】
これに対して参考例は、下位タスクの制御データの更新処理の途中で上位タスクの割り込みによって制御データが参照される可能性のある第２のケースに対応するものである。なお、ハードウェア構成をはじめ、グローバル変数としての制御データをＲＡＭ１３の記憶領域１３ｂに重複させて記憶させ、さらに、領域設定情報Ｓによって、一方を公開領域、他方を作業領域として設定することは、上記実施例と同様である。したがって、以下では、上記実施例と異なる下位タスク処理及び上位タスク処理についてのみ説明する。
【００５６】
本参考例では、下位タスク処理及び上位タスク処理を以下に示すようなものとした。
まず下位タスク処理について、図７のフローチャートに基づき説明する。なお、図７に示すフローチャートは、制御データＡ，Ｂ，Ｃを算出して、これら制御データＡ，Ｂ，Ｃを更新することを特徴とするものである。これらの特徴的な処理に関係しないその他の処理については、上記実施例のフローチャートと同様に、フローチャート中に破線で示して省略した。
【００５７】
まずステップＳ５００では、３つの制御データＡ，Ｂ，Ｃを算出する。
続くＳ５１０では、ＲＡＭ１３の記憶領域１３ｂに記憶された制御データＡを更新する。同様に、次のＳ５２０では制御データＢを更新し、さらに続くＳ５３０では、制御データＣを更新する。
【００５８】
制御データＡ，Ｂ，Ｃの更新は、上記実施例で図６を用いて説明した更新処理のサブルーチンをコールすることによってなされる。すなわち、領域設定情報Ｓが「１」であれば（Ｓ４００：ＹＥＳ）、領域２へ制御データを書き込み（Ｓ４１０）、一方、領域設定情報Ｓが「１」でない場合、すなわち領域設定情報Ｓが「２」であれば（Ｓ４００：ＮＯ）、領域１へ制御データを書き込む（Ｓ４２０）。もちろん、上記実施例と同様、このような更新処理を、３つの制御データＡ，Ｂ，Ｃのそれぞれに対し個別に用意してもよいし、３つの制御データＡ，Ｂ，Ｃのいずれかを指定して、共通の更新処理をコールするようにしてもよい。
【００５９】
いずれにしても、この場合、作業領域として設定された領域へ制御データＡ，Ｂ，Ｃが書き込まれることになる。
図７中のＳ５３０に続くＳ５４０では、領域設定情報Ｓが「１」であるか否かを判断する。ここで領域設定情報Ｓが「１」である場合（Ｓ５４０：ＹＥＳ）、Ｓ５５０にて領域設定情報Ｓを「２」として更新する。一方、領域設定情報Ｓが「１」でない場合（Ｓ５４０：ＮＯ）、すなわち領域設定情報Ｓが「２」である場合には、Ｓ５６０にて領域設定情報Ｓを「１」として更新する。
【００６０】
そしてその後、本下位タスク処理を終了する。
続けて上位タスク処理について、図８のフローチャートに基づき説明する。なお、図８に示すフローチャートは、制御データＡ，Ｂ，Ｃを参照して、これら制御データＡ，Ｂ，Ｃに基づき、新たな制御データＵを算出することを特徴とするものである。図７に示した下位タスク処理と同様、これらの特徴的な処理に関係しないその他の処理については、フローチャート中に破線で示して省略した。
【００６１】
まず最初のＳ６００において、ＲＡＭ１３の記憶領域１３ｂに記憶された制御データＡを参照する。同様に、次のＳ６１０では制御データＢを参照し、さらにＳ６２０では、制御データＣを参照する。
そして、続くＳ６３０では、Ｓ６００〜Ｓ６２０にて参照した制御データＡ，Ｂ，Ｃに基づき、新たな制御データＵを算出し、その後、本上位タスク処理を終了する。
【００６２】
上述した制御データＡ，Ｂ，Ｃの参照は、上記実施例で図４を用いて説明した参照処理のサブルーチンをコールすることによってなされる。すなわち、領域設定情報Ｓが「１」であれば（Ｓ２００：ＹＥＳ）、領域１から制御データを読み出し（Ｓ２１０）、一方、領域設定情報Ｓが「１」でない場合、すなわち領域設定情報Ｓが「２」であれば（Ｓ２００：ＮＯ）、領域２から制御データを読み出す（Ｓ２２０）。もちろん、上記実施例と同様、このような参照処理を、３つの制御データＡ，Ｂ，Ｃのそれぞれに対し、個別に用意してもよいし、３つの制御データＡ，Ｂ，Ｃのいずれかを指定して、共通の参照処理をコールするようにしてもよい。
【００６３】
いずれにしても、この場合、公開領域として設定された領域から制御データＡ，Ｂ，Ｃが読み出されることになる。
以上説明したように、本参考例でも、上記実施例と同様に、グローバル変数としての制御データＡ，Ｂ，Ｃの参照と更新を別々の領域で行うようにしたことによって、このときは、上位タスクによる制御データＡ，Ｂ，Ｃの参照時における同時性を確保した。
【００６４】
例えば領域設定情報Ｓが「１」であるものとして、具体的に説明する。
領域設定情報Ｓが「１」であれば領域１が公開領域となっている。したがって、下位タスクでは、作業領域である領域２に記憶された制御データＡ２，Ｂ２，Ｃ２を更新する（図７中のＳ５１０〜Ｓ５３０、図６参照）。一方、上位タスクは、公開領域である領域１に記憶された制御データＡ１，Ｂ１，Ｃ１を参照する（図８中のＳ６００〜Ｓ６２０、図４参照）。したがって、例えば下位タスクによる更新途中で上位タスクが割り込んでも、領域１に格納された制御データＡ１，Ｂ１，Ｃ１が参照されることになり、更新途中の領域２に記憶された制御データＡ２，Ｂ２，Ｃ２が参照されることはない。すなわち、上位タスクで参照される制御データＡ１，Ｂ１，Ｃ１の同時性が確保される。
【００６５】
また、同時性を必要とする制御データＡ２，Ｂ２，Ｃ２の更新が完了した時点（図７中のＳ５３０終了時点）では、領域設定情報Ｓを「１」→「２」と更新することによって（Ｓ５４０：ＹＥＳ、Ｓ５５０）、作業領域と公開領域とを切り換える。これによって、次の参照処理において、更新された制御データＡ２，Ｂ２，Ｃ２が参照される。
【００６６】
その結果、上位タスクの割込処理を遅らせることなく、しかも、上位タスクで参照される制御データの同時性を確保することができる。
さらに、本参考例おいても、上記実施例と同様、ＲＡＭ１３の記憶領域１３ａに記憶した領域設定情報Ｓによって領域１，２の一方を公開領域、他方を作業領域として設定し、この領域設定情報Ｓを更新することによって（図７中のＳ５４０〜Ｓ５６０）、領域１，２を切り換えるようにした。このような領域設定情報Ｓの更新は、ＣＰＵの一命令で実現できるため、領域切換の途中に割り込みがかかることもない。その結果、上位タスクで参照される制御データの同時性を確実に確保できる。
【００６７】
なお、本参考例におけるＲＡＭ１３が「領域情報記憶手段」に相当する。そして、図７中に一点鎖線で示した、Ｓ５１０〜Ｓ５３０の処理が「下位更新処理」に相当し、Ｓ５４０〜Ｓ５６０の処理が「領域切換処理」に相当する。また、図８中に一点鎖線で示したＳ６００〜Ｓ６２０の処理が「上位参照処理」に相当する。
［その他］
なお、上記実施例は、下位タスクの制御データの参照処理の途中で上位タスクの割り込みによって制御データが更新される可能性のある第１のケースに対応するものであり、一方、上記参考例は、下位タスクの制御データの更新処理の途中で上位タスクの割り込みによって制御データが参照される可能性のある第２のケースに対応するものであった。
【００６８】
上記では説明を簡単にするため、実施例は第１のケースに対応するものとして、一方、参考例は第２のケースに対応するものとして説明したが、もちろん、エンジン制御処理において、第１及び第２の両方のケースが発生することが考えられる。したがって通常は、第１のケースに対応させて下位及び上位の処理プログラムを設計し、第２のケースに対応させて下位及び上位の処理プログラムを設計する。つまり、一つのエンジン制御処理の中で、ある下位タスク処理は図３に示す如くとなり、別の下位タスク処理は図７に示す如くとなる。同様に、ある上位タスク処理は図５に示す如くとなり、別の上位タスク処理は図８に示す如くとなる。
【００６９】
このように第１及び第２の両方のケースに対応させることを考えると、あるタスクが制御データを参照する場合、別のタスクによって制御データが更新される可能性があることが予め分かっているという前提の下で、その別のタスクに対して、自らが上位タスクとなるのか下位タスクとなるのかを判断することが考えられる。同様に、あるタスクが制御データを更新する場合、別のタスクによってグローバル変数が参照される可能性があることが予め分かっているという前提の下で、その別のタスクに対して、自らが上位タスクとなるのか下位タスクとなるのかを判断することが考えられる。
【００７０】
具体的には、図１中に破線で示す如く優先度に関する情報を記憶する記憶領域１３ｃをＲＡＭ１３に設け、ここに制御データＡ，Ｂ，Ｃ毎に、制御データＡ，Ｂ，Ｃの参照又は更新を行うタスクの優先度の中で最も高いものを記憶しておく。例えば図９に示す如くである。図９では、３つの制御データＡ，Ｂ，Ｃをそれぞれ処理対象とする各タスクの優先度の中で最も高い優先度がＰＡ，ＰＢ，ＰＣとして記憶された様子を示している。
【００７１】
そして、処理対象となる制御データに対応する優先度ＰＡ，ＰＢ，ＰＣと、判断対象の処理プログラムに設定された優先度Ｐとを比較することによって、下位タスク又は上位タスクのいずれに相当するかを判断する。
この判断処理を図１０のフローチャートに示した。これについて説明する。
【００７２】
処理が開始されると、判断対象のタスクの優先度Ｐを取得する（Ｓ７００）。判断対象のタスクとは現在実行中のタスクである。設定された優先度Ｐは、ＯＳのサブルーチンコールによって取得することが考えられる。
次に処理対象の制御データＡ，Ｂ，Ｃに対応する優先度ＰＡ，ＰＢ，ＰＣを取得する（Ｓ７１０）。これは、上述した記憶領域１３ｃに記憶されたものである。このとき、３つの優先度ＰＡ，ＰＢ，ＰＣの中で最も高いものを取得することが考えられる。また、３つの優先度ＰＡ，ＰＢ，ＰＣの全てを取得するようにしてもよい。
【００７３】
そして、Ｓ７００及びＳ７１０にて取得した優先度を比較して、優先度Ｐが相対的に低いか否かを判断する（Ｓ７２０）。３つの優先度ＰＡ，ＰＢ，ＰＣの中で１つでも優先度Ｐを上回るものがあれば、ここで肯定判断される。優先度Ｐが相対的に低い場合（Ｓ７２０：ＹＥＳ）、実行中のタスクを下位タスクと判断し（Ｓ７３０）、一方、優先度Ｐが相対的に低くない場合（Ｓ７２０：ＮＯ）、実行中のタスクを上位タスクと判断する（Ｓ７４０）。
【００７４】
これによって、あるタスクにて制御データＡ，Ｂ，Ｃを参照して制御データＵを算出する際、他のタスクにて制御データＡ，Ｂ，Ｃが更新される可能性があれば、上述した判断処理を予め実行することによって、図３に示す下位タスク処理、又は、図８に示す上位タスク処理を選択的に実行するようにできる。
【００７５】
同様に、あるタスクにて制御データＡ，Ｂ，Ｃを算出して制御データＡ，Ｂ，Ｃを更新する際、他のタスクにて制御データＡ，Ｂ，Ｃが参照される可能性があれば、上述した判断処理を予め実行することによって、図７に示す下位タスク処理、又は、図５に示す上位タスク処理を選択的に実行するようにできる。
【００７６】
このようにすれば、各タスクがより汎用的なものとなる点で有利である。
なお、このような構成において、マイコン１０の備えるＲＡＭ１３が「優先度記憶手段」に相当し、図１０に示した判断処理が「判断処理」に相当する。
また、ここでは図９に示すように、優先度に関する情報を、３つの制御データＡ，Ｂ，Ｃ毎に記憶した。これに対して、同時性が必要な制御データといったグローバル変数全体を一まとめにし、グローバル変数を参照・更新する可能性のあるタスクに設定された優先度の中で最も高いものを一つだけ記憶するようにしてもよい。このようにしても、図１０と同様の判断処理を予め実行することによって、下位あるいは上位のタスク処理を選択的に実行することができる。
【００７７】
ところで、上記実施例ではエンジン制御処理を行うＥＣＵ１として本発明を具体化したが、このような車両のエンジン制御に限られず、リアルタイム性を確保すべき割込処理を行うような情報処理装置全般に本発明が適用できることは言うまでもない。
【図面の簡単な説明】
【図１】実施例のＥＣＵの構成を表すブロック図である。
【図２】領域設定情報及び制御データの記憶領域を示す説明図である。
【図３】実施例の下位タスク処理を示すフローチャートである。
【図４】参照処理を示すフローチャートである。
【図５】実施例の上位タスク処理を示すフローチャートである。
【図６】更新処理を示すフローチャートである。
【図７】参考例の下位タスク処理を示すフローチャートである。
【図８】参考例の上位タスク処理を示すフローチャートである。
【図９】優先度の記録領域を示す説明図である。
【図１０】判断処理を示すフローチャートである。
【符号の説明】
１…ＥＣＵ            １０…マイコン
１１…ＣＰＵ            １２…ＲＯＭ
１３…ＲＡＭ          １３ａ…記憶領域
１３ｂ…記憶領域        １３ｃ…記憶領域
１４…Ｉ／Ｏ            ２１…入力回路
２２…出力回路          ３０…センサ
４０…アクチュエータ
【図１】
0003783553.tif 000002
【図２】
0003783553.tif 000003
【図３】
0003783553.tif 000004
【図４】
0003783553.tif 000005
【図５】
0003783553.tif 000006
【図６】
0003783553.tif 000007
【図７】
0003783553.tif 000008
【図８】
0003783553.tif 000009
【図９】
0003783553.tif 000010
【図１０】
0003783553.tif 000011