トップ :: G 物理学 :: G06 計算;計数




【発明の名称】 割込命令チェック装置及びプログラム
【発明者】 【氏名】西長 佐世子

【要約】 【課題】グローバル変数の読込処理から書込処理までの途中の割り込みによって生じる不具合に着目し、当該不具合を発生させる可能性のあるグローバル変数の干渉部分を抽出し、割込禁止/許可命令が適正位置に存在することを自動的にチェックする。

【解決手段】ソースプログラムに基づき、グローバル変数の処理記述毎に、予め定めれた条件を満たす読込処理及び書込処理を判断し、変数属性テーブルを作成する。そして、この変数属性テーブルに基づき、グローバル変数の書込処理が上位関数にあり(S120)、下位関数中に条件を満たす読込処理及び書込処理のペアがあれば(S130)、その下位関数中のペア記述位置に応じた適正位置に割込禁止/許可命令が存在することを判断し(S140〜S160)、その判断結果を出力する(S170)。
【特許請求の範囲】
【請求項1】実行単位の複数の処理プログラムからなるソースプログラムであって、前記処理プログラム毎に予め設定された優先度に基づき、当該処理プログラム間で割込処理を行い一連の機能を実現するためのソースプログラムを対象とし、前記優先度が相対的に高い上位処理プログラムに割り込まれる可能性のある前記優先度が相対的に低い下位処理プログラム中の割込禁止/許可命令をチェックする割込命令チェック装置であって、前記ソースプログラムを読み込むプログラム読込手段と、前記優先度を示す優先度情報を取得する優先度取得手段と、前記プログラム読込手段にて読み込まれたソースプログラム及び前記優先度取得手段にて取得された前記優先度情報に基づき、前記上位処理プログラムと前記下位処理プログラムとで共通に使用されるグローバル変数の書込処理が前記上位処理プログラム中にあり、かつ、前記下位処理プログラム中に、当該グローバル変数の読込処理及び書込処理のペアであって、当該読込処理によって読み出されるグローバル変数を用いた演算結果を当該書込処理で書き込む条件付ペアがある場合に、当該処理記述位置に応じた適正位置に割込禁止命令及び割込許可命令が存在することを判断する割込命令判断手段と、該割込命令判断手段による判断に基づく判断情報を出力する出力手段とを備えていることを特徴とする割込命令チェック装置。
【請求項2】請求項1に記載の割込命令チェック装置において、前記割込命令判断手段は、前記下位処理プログラム中で後に記述された書込処理とペアになる読込処理が、前記グローバル変数の代入処理を伴うものである場合に、前記条件付ペアがあると判断することを特徴とする割込命令チェック装置。
【請求項3】請求項1又は2に記載の割込命令チェック装置において、前記割込命令判断手段は、前記下位処理プログラム中で前に記述された読込処理とペアになる書込処理が、前記グローバル変数に対する固定値の代入処理でない場合に、前記条件付ペアがあると判断することを特徴とする割込命令チェック装置。
【請求項4】請求項1〜3のいずれかに記載の割込命令チェック装置において、前記割込命令判断手段は、前記処理プログラムを構成する同一の単位プログラム内に、前記条件付ペアがある場合に、前記適正位置に割込禁止命令及び割込許可命令が存在することを判断することを特徴とする割込命令チェック装置。
【請求項5】請求項1〜4のいずれかに記載の割込命令チェック装置において、前記割込命令判断手段は、前記条件付ペアを構成する読込処理記述の直前に前記割込禁止命令が存在し、かつ、書込処理記述の直後に前記割込許可命令が存在する場合に、前記適正位置に前記割込禁止命令及び前記割込許可命令が存在すると判断することを特徴とする割込命令チェック装置。
【請求項6】請求項1〜5のいずれかに記載の割込命令チェック装置において、前記割込命令判断手段は、前記プログラム読込手段にて読み込まれたソースプログラム中の前記グローバル変数を検索する変数検索手段と、前記プログラム読込手段にて読み込まれたソースプログラム中の記述を参照し、前記変数検索手段にて検索されたグローバル変数に対する処理が読込処理であるか又は書込処理であるかを判断する処理判断手段と、該処理判断手段にて判断された読込処理及び書込処理が予め定められた条件を満たすものであるか否かを判断する条件判断手段と、前記変数検索手段にて検索された前記グローバル変数が使用される前記処理プログラム又は前記処理プログラムを構成する単位プログラムを特定するプログラム特定手段と、該プログラム特定手段にて特定された前記プログラムの優先度を、前記優先度取得手段にて取得された前記優先度情報に基づいて特定する優先度特定手段とを備え、該優先度特定手段にて特定された前記優先度と、前記処理判断手段及び前記条件判断手段による判断結果とに基づき、前記適正位置に前記割込禁止命令及び前記割込許可命令が存在することを判断することを特徴とする割込命令チェック装置。
【請求項7】請求項6に記載の割込命令チェック装置において、さらに、前記単位プログラム間のコール情報を探索するコール情報探索手段を備え、前記優先度特定手段は、前記優先度情報に加え、前記コール情報探索手段にて探索された前記コール情報に基づき、前記単位プログラムの優先度を特定することを特徴とする割込命令チェック装置。
【請求項8】請求項1〜7のいずれかに記載の割込命令チェック装置において、前記優先度取得手段は、前記プログラム読込手段にて読み込まれたソースプログラムの記述に基づいて、前記優先度情報を作成して取得することを特徴とする割込命令チェック装置。
【請求項9】請求項1〜8のいずれかに記載の割込命令チェック装置において、前記出力手段は、前記判断情報を結果ファイルとして記憶手段へ出力することを特徴とする割込命令チェック装置。
【請求項10】請求項1〜9のいずれかに記載の割込命令チェック装置において、前記出力手段は、前記判断情報を表示手段へ出力することを特徴とする割込命令チェック装置。
【請求項11】請求項1〜10のいずれかに記載の割込命令チェック装置において、さらに、前記出力手段から出力される前記判断情報に基づき、前記適正位置に前記割込禁止命令又は割込許可命令の少なくともいずれか一方が存在しない場合には、前記適正位置に記述して前記ソースプログラムを修正するプログラム修正手段を備えることを特徴とする割込命令チェック装置。
【請求項12】請求項1〜11のいずれかに記載の割込命令チェック装置の前記プログラム読込手段、前記優先度取得手段、前記割込命令判断手段及び前記出力手段としてコンピュータを機能させるためのプログラム。
【発明の詳細な説明】【0001】
【発明の属する技術分野】本発明は、割込処理が実行される処理プログラム中に記述される割込禁止/許可命令のチェック技術に関する。
【0002】
【従来の技術】例えば車両に搭載される電子制御装置(以下「ECU」という。)に用いられる制御プログラムでは、制御応答性や安全性の確保等から所定の処理をリアルタイムに実行する必要性がある。そのため、このようなリアルタイム性を必要とする処理(リアルタイム処理)は、メインルーチンとは別の割込ルーチンとして用意されるのが一般的である。割り込みルーチンは、例えばイベントの発生等をトリガとしてメインルーチンの実行中に優先して実行される。優先して実行されるとは、割込ルーチンの実行により一時的にメインルーチンの実行が中断され、割込ルーチン終了後に、再びその中断位置からメインルーチンが実行されることをいう。
【0003】近年では、上述したECUの制御プログラムもOS(オペレーティング・システム)上で動作するようになっており、メインルーチンや割込ルーチン等の実行状態がタスクと呼ばれ、OSにより管理されている。このタスクには優先度を示すレベル(タスクレベル)が設定されており、このタスクレベルに基づいて上述したような割込処理を実現している。つまり、OSの管理の下、相対的にレベルの高いタスクである上位タスクは、相対的にレベルの低いタスクである下位タスクに優先する(割り込む)。上述した例で言えば、メインルーチンによる処理が下位タスクに相当し、割込ルーチンによる処理が上位タスクに相当する。
【0004】このようなタスク概念の導入は、タスクレベルを設定するという極めて簡単な情報記述だけで何等プログラム間の実行タイミング等を記述する必要をなくし、割込処理の設計を容易にした。一方、イベント発生というような、下位タスクの処理タイミングに関係しないタイミングで、上位タスクが割り込む。そのために場合によっては、上位タスクあるいは下位タスクの処理に不具合を生じることがある。
【0005】ここで、上位タスクの割り込みによって生じる不具合について1つのケースを説明する。例えば上位タスクと下位タスクとで共通の変数を操作する場合を考える。この共通の変数は、例えばプログラム全体が複数の関数にて構成されているとき、これら関数間で共通にアクセスできる記憶領域に記憶されるものであり、グローバル変数(大域変数)と呼ばれる。
【0006】このとき、下位タスクは、2つの処理ステップA,Bにてこの変数を2回読み出すものとし、2つの処理ステップA,Bにて読み出される変数が同一値であることを前提とした処理を実行するものとする。一方、上位タスクは、処理ステップCにてこの変数を書き換える。
【0007】このような前提の下、下位タスクの処理ステップAが実行された後、上位タスクが割り込むと、処理ステップCにて変数値が書き換えられてしまい、その後処理ステップBにて読み出される変数値が、処理ステップAにて読み出された変数値と異なってしまうという事態が生じる。すなわち、グローバル変数の同時性が確保されなくなってしまう。
【0008】このような不具合を回避するため、下位タスクのプログラム中には、必要に応じて割込禁止/許可命令を記述するのが、一般的であり、不可欠である。割込禁止命令は、上位タスクの割り込みを禁止するものであり、割込許可命令は上位タスクの割り込みを許可するものである。つまり、割込禁止命令と割込許可命令で挟まれた処理ステップの途中では、上位タスクは割り込めない。したがって、上述したケースでは、下位タスクのプログラム中の処理ステップAの前に割込禁止命令を記述し、処理ステップBの後に割込許可命令を記述する。このようにすれば、割込禁止命令と割込許可命令とで挟まれた処理ステップAからBまでの処理の途中で上位タスクが割り込むことがなくなり、処理ステップAにて読み出される変数値と処理ステップBにて読み出される変数値が変わってくることがなくなる。
【0009】上述したように、割込処理は、リアルタイム処理の実行には不可欠の技術であり、OSによるタスク管理といったコンピュータ技術の発達によって容易に設計されるに至った。しかしながら一方では、割込禁止/許可命令が適正に記述されないと折角の技術もその効果を発揮しないことになる。
【0010】例えば割込禁止命令が抜け落ちた場合には、上述したように不適切なタイミングで変数が書き換えられてしまう事態が生じる。また、割込許可命令が抜け落ちた場合には、上位タスクによる変数の書き換えがなされない、又は、遅れてしまうことになって、リアルタイム処理の実効が損なわれる。
【0011】これに対して、本出願人は、特願平11−295587号にて、不具合が発生する可能性を有するグローバル変数の干渉部分を抽出し、割込禁止/許可命令が適正位置に存在することをチェックする割込命令チェック装置を提案した。この割込命令チェック装置は、上位タスクによる優先的な書込処理によって不具合が発生するという事実に着目したものであり、上位タスクによる書込処理の存在を前提としている。この割込命令チェック装置によれば、上位タスクの書込処理によって生じる干渉部分に割込禁止/許可命令があるか否かをチェックでき、チェック作業の大幅な工数削減が図られる。
【0012】
【発明が解決しようとする課題】しかしながら、上述した割込命令チェック装置においても、さらに、改良の余地が残される。それは、上述した割込命令チェック装置が、下位タスクに読込処理と書込処理とが存在する場合、それぞれ個別に割込禁止命令及び割込許可命令の存在を判断している点である。
【0013】と言うのは、下位タスク中の読込処理と次の書込処理とが所定の関係を有する場合があり、その場合に、読込処理と書込処理との間で上位タスクが割り込むと、不具合が発生する状況が考えられるからである。ここで発生する不具合について、具体的に説明する。
【0014】例えば、下位タスクで同一のグローバル変数に対し、読込処理を行い、次に書込処理を行う場合の典型的な2つのコーディング例を図13に示す。図13(a)は、ステップDにてグローバル変数Valをローカル変数aに代入し、続いてローカル変数aをインクリメントして、ステップEでローカル変数aをグローバル変数Valに再び代入するものである。ここでは、ステップDの処理が読込処理に相当し、ステップEの処理が書込処理に相当する。
【0015】一方、図13(b)は、ステップFにてif文の条件式中でグローバル変数が値「0」に等しいか否かを判断し、等しい場合には、ステップGでグローバル変数Valに値「1」を代入するものである。ここでは、条件式の成立を判断するためにステップFでグローバル変数Valが読み出されることになり、そのため、ステップFの処理は読込処理に相当することになる。一方のステップGの処理は、書込処理に相当する。
【0016】このとき問題になるのは、図13(a)に示す場合である。つまり、ステップDの実行後、上位タスクが割り込んでグローバル変数Valに例えば別の値が代入されても、ステップEでローカル変数aがグローバル変数Valに代入されるため、グローバル変数Valは、下位タスクによって上書きされてしまい、上位タスクでの書込処理が意味をなさなくなってしまう。
【0017】すなわち、このような場合には、ステップDからステップEまでの期間で上位タスクの割込処理を禁止する必要がある。しかし、従来提案した割込命令チェック装置では、このような読込処理と書込処理とのペアについての判断については言及していなかった。
【0018】本発明は、読込処理から書込処理までの途中の割り込みによって生じる不具合に着目し、当該不具合を発生させる可能性のあるグローバル変数の干渉部分を抽出し、割込禁止/許可命令が適正位置に存在することを自動的にチェックすることを目的とする。
【0019】
【課題を解決するための手段及び発明の効果】上述した目的を達成するためになされた請求項1に記載の割込命令チェック装置は、実行単位となる複数の処理プログラムからなるソースプログラムを対象としている。例えばOS上でタスク管理されるプログラムであれば、この処理プログラム毎にタスクが生成されることになる。
【0020】なお、処理プログラムは、プログラムの記述単位であるとは限らない。例えば関数型のプログラムを例に挙げれば、複数の関数にて1つの処理プログラムが構成されるという具合である。本明細書では、処理プログラムを構成する記述単位となるプログラムを「単位プログラム」をいう。
【0021】このとき、上述した処理プログラム毎に実行の優先順位を示す優先度が予め設定されており、ソースプログラムに基づく処理では、この優先度に基づき処理プログラム間で割込処理が行われ、一連の機能が実現される。上述した例で言えば、タスク毎に設定されたタスクレベルがここでいう「優先度」に相当する。したがって、上位タスクが下位タスクに割り込んでリアルタイム処理を実現することによってエンジン等の制御を行う制御プログラムが、ここでいうソースプログラムの一例である。
【0022】本割込命令チェック装置は、このようなソースプログラムを対象とし、上位処理プログラムに割り込まれる可能性のある下位処理プログラム中の割込禁止/許可命令をチェックする。上述した例で言えば、上位タスクに割り込まれる下位タスクのプログラム中に記述される割込命令をチェックすることになる。
【0023】なお、上位処理プログラムとは、上述した処理プログラム中で相対的に優先度が高いものをいい、逆に、下位処理プログラムとは、上述した処理プログラム中で相対的に優先度が低いものをいう。「相対的に」であるから、ある上位処理プログラムに対し、下位処理プログラムが複数存在することが考えられる。また逆に、ある下位処理プログラムに対して上位処理プログラムが複数存在することも考えられる。さらに、ある処理プログラムに対しては上位処理プログラムとなるプログラムが、別の処理プログラムに対しては下位処理プログラムとなることも考えられる。
【0024】上述したチェックは具体的には、以下に示す各手段によってなされる。プログラム読込手段は、ソースプログラムを読み込む。このプログラム読込手段は、本装置内部の記憶手段に記憶されたソースプログラムを読み込むものとすることが考えられる。また、外部のサーバに記憶されたソースプログラムを読み込むものとしてもよい。
【0025】優先度取得手段は、上述した処理プログラム毎に予め設定された優先度を示す優先度情報を取得する。OS上でタスク管理されるプログラムであれば、上述したタスクレベルの情報を取得するという具合である。この優先度情報は、予め作成されて外部から提供されるものとしてもよいが、装置内部で作成することも考えられる。例えばC言語では定義ファイルに優先度が記述されるのが一般的だからである。したがって、請求項8に示すように、優先度取得手段が、プログラム読込手段にて読み込まれたソースプログラムの記述に基づいて、優先度情報を作成して取得するようにしてもよい。このようにすれば、優先度情報を予め作成しておく必要がなくなる。
【0026】このようにしてソースプログラムが読み込まれ優先度情報が得られると、これらの情報に基づき、割込命令判断手段が、以下に示す判断を行う。すなわち、上位処理プログラムと下位処理プログラムとで共通に使用されるグローバル変数に対する書込処理が上位処理プログラム中にあり、かつ、下位処理プログラム中に、当該グローバル変数の読込処理及び書込処理の条件付ペアがある場合に、当該処理記述位置に応じた適正位置に割込禁止命令及び割込許可命令が存在することを判断する。ここで条件付ペアというのは、その読込処理によって読み出されるグローバル変数を用いた演算結果を次の書込処理で書き込むペアをいう。
【0027】割込命令判断手段にてこのような判断がなされると、その判断に基づく判断情報を出力手段が出力する。判断に基づく判断情報とは、割込禁止/許可命令が存在するか否かという情報であることが考えられる。また、命令記述の存在の有無を示す情報に加え又は代え、その判断に際して取得可能な情報であってもよい。例えば、グローバル変数に係る処理記述がプログラムの何行目にあるか、どの単位プログラム中にあるか、割込禁止/許可命令が何行目に存在するか、あるいは、割込禁止命令、割込許可命令のいずれが抜け落ちているか、といった情報である。
【0028】すなわち、本発明の割込命令チェック装置は、下位処理プログラム中のグローバル変数に対する読込処理と次の書込処理との間に生じる割り込みによって発生する不具合に着目したものであり、上述した構成により、このような不具合を発生させる可能性のあるグローバル変数の干渉部分を抽出し、割込禁止/許可命令が適正位置に存在することを自動的にチェックできる。そして、利用者は、出力手段からの判断情報に基づいて、ソースプログラムを速やかに修正することが可能となる。その結果、チェック作業の工数削減に寄与できる。
【0029】ところで、上述した条件付ペアの存在は、具体的には請求項2に示すようにして判断することが考えられる。この場合、割込命令判断手段は、下位処理プログラム中で後に記述された書込処理とペアになる読込処理が、グローバル変数の代入処理を伴うものである場合に、読込処理及び書込処理のペアがあると判断する。下位処理プログラム中の読込処理が変数などへのグローバル変数の代入処理であれば、その後、その変数を用いた演算結果を再びグローバル変数へ書き込む可能性が高くなるからである。逆に、代入処理を伴わない処理には、if文などの条件式やswitch文の中に記述されるものが考えられる。
【0030】また、請求項3に示すようにして判断してもよい。この場合、割込命令判断手段は、下位処理プログラム中で前に記述された読込処理とペアになる書込処理が、グローバル変数に対する固定値の代入処理でない場合に、条件付ペアがあると判断する。つまり、グローバル変数への固定値の代入処理であれば、前出の読込処理との関係を否定できるからである。
【0031】なお、上述した判断手法のいずれか一方を用いて条件付ペアの存在を判断してもよいが、両方を用いてペアの存在を判断をすれば、上述した条件付ペアがより確実に抽出できるため好ましい。なお、割込命令判断手段は、処理プログラムを構成する同一の単位プログラム内に、上述した条件付ペアがある場合に、割込禁止命令及び割込許可命令の存在を判断することが考えられる(請求項4)。不具合を発生させる下位処理プログラム中の処理記述例は、図13(a)に示す如くであり、通常、処理プログラムを構成する同一単位プログラム内にこのような処理記述がなされるためである。
【0032】また、割込命令判断手段は、条件付ペアを構成する読込処理記述の直前に割込禁止命令が存在し、かつ、書込処理記述の直後に割込許可命令が存在する場合に、適正位置に存在すると判断することが望ましい(請求項5)。不具合の発生する可能性があるステップ間だけで割り込みを禁止すれば十分であり、条件付ペアを構成する読込処理から書込処理までの途中で割り込みが発生しないようにすればよいためである。つまり、読込処理の直前で割り込みを禁止し、書込処理の直後で割り込みを許可するのが、リアルタイム性の確保という観点からは有効である。
【0033】ところで、上述した割込命令判断手段を具体化した構成が、請求項6に示すものである。この構成において、割込命令判断手段は、変数検索手段、処理判断手段、条件判断手段、プログラム特定手段及び優先度特定手段の計5つの手段を備える。
【0034】変数検索手段は、プログラム読込手段にて読み込まれたソースプログラム中のグローバル変数を検索する。また、処理判断手段は、プログラム読込手段にて読み込まれたソースプログラム中の記述を参照し、変数検索手段にて検索されたグローバル変数に係る処理が読込処理であるかあるいは書込処理であるかを判断する。そして、条件判断手段は、処理判断手段にて判断された読込処理及び書込処理が予め定められた条件を満たすものであるか否かを判断する。予め定められた条件とは、請求項2に記載した構成における読込処理についての条件や、請求項3に記載した構成における書込処理についての条件とすることが考えられる。
【0035】また、プログラム特定手段は、検索されたグローバル変数が使用される処理プログラム又は単位プログラムを特定する。なお、記述単位である単位プログラムを特定することが、プログラムの修正作業を考えた場合に有利である。プログラム特定手段にて処理プログラム又は単位プログラムが特定されると、優先度特定手段が、当該プログラムの優先度を、優先度情報に基づいて特定する。これによって、検出されたグローバル変数の使用されているプログラムが上位処理プログラム(に属するもの)であるか下位処理プログラム(に属するもの)であるかが特定されることになる。
【0036】したがって割込命令判断手段は、特定された処理プログラム(又は単位プログラム)の優先度と、上述した処理判断手段及び条件判断手段による判断結果とを用い、上述した適正位置に割込禁止命令及び割込許可命令が存在することを判断する。
【0037】この構成では、グローバル変数を検索し、検索したグローバル変数を使用するプログラムを特定し、さらに、それらプログラムの優先度を特定する。つまり、各グローバル変数を基にして情報を整理するため、その処理内容が分かり易いものとなり、処理設計が簡単になる。例えば上述した各手段をコンピュータシステムの機能として実現する場合、そのプログラム設計が容易になる。また、条件判断手段をコンピュータシステムの機能として実現する場合、請求項2や3に記載した構成における判断手法、すなわち、グローバル変数の読込処理記述又は書込処理記述だけに基づく判断手法を用いれば、他の処理ステップの処理内容を判断する必要がなくなり、この点においても、プログラム設計が容易になる。
【0038】なお、優先度特定手段が単位プログラムの優先度を特定する場合、処理プログラム毎に設定された優先度が、単位プログラムの優先度となっていることを前提としている。しかしながら、処理プログラムが関数f1、関数f1からコールされる関数f11、及び関数f11からコールされる関数f12という3つの関数で構成されている場合、優先度情報は、最初に実行される関数f1のみに対応させて記述されるのが一般的である。したがって、グローバル変数が関数f11の中で使用される場合、このような優先度情報からは関数f11の優先度を特定することができない。
【0039】そこで、請求項7に示すように、さらに、単位プログラム間のコール情報を探索するコール情報探索手段を備え、優先度特定手段が、優先度情報及びコール情報探索手段にて探索されたコール情報に基づき、単位プログラムの優先度を特定するようにするとよい。
【0040】コール情報探索手段が単位プログラム間のコール情報を探索するというのは、上述した例で言えば、関数f1から関数f11がコールされ、関数f11から関数f12がコールされることを探索することをいう。すなわち、ここでいう「コール情報」とは、「f1→f11→f12」という情報であり、いわゆるコールツリーと呼ばれるものである。このようなコール情報を用いれば、関数f1に対応させて優先度が付加されている場合であっても、関数f1と関数f11の優先度は同じであることが分かるため、単位プログラムの優先度を特定することができる。
【0041】ところで、割込命令判断手段の判断に基づく判断情報を、出力手段が出力することは既に述べた。具体的に、出力手段は、例えば結果ファイルとして記憶手段へ出力することが考えられる(請求項9)。この記憶手段は、本装置内部のものであっても外部のものであってもよい。また、記憶手段への出力に加え又は代え、表示手段へ出力するようにすることが考えられる(請求項10)。
【0042】また、上述した構成では、出力手段から出力された判断情報に基づき、ソースプログラムの記述を利用者が修正することを述べた。これに対して例えば請求項11に示すように、プログラム修正手段を備え、このプログラム修正手段が、出力手段から出力される判断情報に基づき、適正位置に割込禁止命令又は割込許可命令が存在しない場合、割込禁止/許可命令が適正位置にくるように、ソースプログラムを修正するようにしてもよい。この場合、割込禁止/許可命令のチェックだけでなくプログラム修正までが自動で行われるため、利用者にとってさらに便利であり、プログラム修正工数の削減が図られる。
【0043】なお、このような割込命令チェック装置のプログラム読込手段、優先度取得手段、割込命令判断手段及び出力手段をコンピュータシステムにて実現する機能は、例えば、コンピュータで起動するプログラムとして備えることができる。すなわち、プログラムの発明としても実現できる(請求項12)。
【0044】また、このようなプログラムの場合、例えば、FD、MO、DVD−ROM、CD−ROM、ハードディスク等のコンピュータ読み取り可能な記録媒体に記録し、必要に応じてコンピュータにロードして起動することにより用いることができる。この他、ROMやバックアップRAMをコンピュータ読み取り可能な記録媒体としてこのプログラムを記録しておき、ROMあるいはバックアップRAMをコンピュータに組み込んで用いてもよい。
【0045】
【発明の実施の形態】以下、本発明を具体化した一実施例を図面を参照して説明する。図1は、本発明を具体化した割込命令チェック装置10を含むシステムの概要を示す説明図である。
【0046】本実施例の割込命令チェック装置10は、外部の記憶装置20及び表示装置30に接続されている。割込命令チェック装置10は、その内部にCPU、ROM、RAM、I/Oなどを備え、いわゆるコンピュータシステムとして構成されている。
【0047】記憶装置20は、ハードディスク装置等の大容量記憶装置である。この記憶装置20は、割込命令チェック装置10にローカルに接続されるものであってもよいが、例えばネットワークを介して接続されるものであってもよい。つまり、ネットワークを介して接続し、割込命令チェック装置10とは別のコンピュータシステムからもアクセス可能とすることが考えられる。このようにすれば、記憶装置20内のデータを他のコンピュータシステムから書き込んだり、他のコンピュータシステムで読み出したりすることができる。
【0048】表示装置30は、CRTや液晶などを用いたディスプレイ装置である。本割込命令チェック装置10は、記憶装置20に記憶されたソースプログラム21、タスクレベル表22、及び環境ファイル23を読み込み、ソースプログラム21中の適正位置に割込禁止命令及び割込許可命令が記述されていることをチェックし、そのチェック結果を結果ファイル24として記憶装置20に記憶すると共に表示装置30へ出力する。したがって、上述したように記憶装置20を他のコンピュータシステムからアクセスできるようにすれば、ソースプログラム21、タスクレベル表22、及び環境ファイル23を他のコンピュータシステムにて作成して記憶装置20へ記憶しておくことができる。また、チェック結果を他のコンピュータシステムにて参照することができる。
【0049】最初に、本割込命令チェック装置10が読み込むソースプログラム21、タスクレベル表22、及び環境ファイル23について説明する。ソースプログラム21は、最終的には、ECUなどの有する所定のマイコンに搭載されるものであり、コンパイル/リンクされてOS上で実行される。このソースプログラム21は、C言語で記述されており、複数の関数の集合体である。そして、これらの関数はいくつかの関数グループに分けられ、この関数グループの単位で実行される。この関数グループ単位の処理実行状態がタスクとして上述したOSに管理される。したがって、この関数グループが「処理プログラム」に相当し、各関数が処理プログラムを構成する「単位プログラム」に相当する。
【0050】タスクレベル表22は、上述した関数グループの「優先度」としてのタスクレベルを記述するものである。したがって、タスクレベル表22が「優先度情報」に相当する。具体的には、例えばある関数グループが関数f1、関数f1からコールされる関数f11、関数f11からコールされる関数f12及び関数f13という4つの関数で構成されている場合、最初に実行される関数f1に対してタスクレベルが記述される。なお、本明細書中では、関数グループの中で最初に実行される関数を「メイン関数」と記述し、一方、メイン関数の配下に属する関数を「サブ関数」と記述することにする。
【0051】タスクレベル表22を図2に例示した。各関数グループのメイン関数f1,f2,f3,f4,・・・にそれぞれ対応させてタスクレベルが記述されている。図2に例示したものでは、タスクレベルの数値が小さいほど優先度が高くなっているものとして以下の説明を続ける。図2では、メイン関数f1はタスクレベル「1」となっており、メイン関数f2はタスクレベル「2」となっている。同様に、メイン関数f3はタスクレベル「6」、メイン関数f4はタスクレベル「3」となっている。
【0052】したがって例えば、メイン関数f1の関数グループ(以下「関数グループ1」という。)は、メイン関数f2の関数グループ(以下「関数グループ2」という。)よりも優先度が高いことを示している。つまり、実際にOS上で実行された場合、関数グループ1に基づく処理は、関数グループ2に基づく処理に割り込み可能である。割り込み可能とは、関数グループ2に基づく処理実行中、関数グループ1に基づく処理の実行指令があると、関数グループ2に基づく処理が一旦中断されて関数グループ1に基づく処理が優先して実行され、関数グループ1に基づく処理終了後に、再び中断位置から関数グループ2に基づく処理が実行されることをいう。すなわち、関数グループ1は関数グループ2に対し「上位処理プログラム」であり、関数グループ2は関数グループ1に対し「下位処理プログラム」となっている。
【0053】なお、図2では、タスクレベルの数値が小さいほど優先度が高いことを示しているが、その逆の場合もあり、タスクレベルの数値が大きいほど優先度が高いことを示すタスクレベル表22が入力されることがあり得る。このタスクレベル表22の記述形式等を示す情報が記述されるのが、次に説明する環境ファイル23である。
【0054】環境ファイル23は、本割込命令チェック装置10の設定を行うためのファイルである。例えば上述したタスクレベル表22のタスクレベルについて言えば、数値が小さいものほど優先度が高いのか、逆に数値が大きいものほど優先度が高いのかを示す情報が記述される。本割込命令チェック装置10は、この環境ファイル23に基づいて、タスクレベル表22やソースプログラム21の記述形式の違いを吸収する。その結果、複数種類のソースプログラム21やタスクレベル表22に対して、本割込命令チェック装置10は動作する。例えば記憶装置20が異なるコンピュータシステムに接続されている場合、それらコンピュータシステムからそれぞれ出力され記憶された、異なる記述形式のソースプログラム21,タスクレベル表22に基づいて同様の処理を行うことができる。
【0055】以上本実施例の割込命令チェック装置10が読み込む情報について説明した。次に、本割込命令チェック装置10の動作を説明する。ここでは最初に本割込命令チェック装置10のチェックの目的を説明し、その後、詳細な動作説明を行うことにする。
【0056】上述したようにソースプログラム21は、関数グループ単位で実行され、関数グループ単位にタスクレベルが設定されており、関数グループ間で割込処理が実現される。このとき、タスクレベルが相対的に高い上位の関数グループと、タスクレベルが相対的に低い下位の関数グループとで、同一の変数を操作する可能性がある。この同一の変数は、グローバル変数として定義されるものであり、関数グループ間で共通に使用可能なものである。このような同一のグローバル変数を上位の関数グループと下位の関数グループとで操作すると、不具合を生じる可能性がある。そのため、下位の関数グループには、グローバル変数に係る処理記述の前後に割込禁止/許可命令を記述し、上位の関数グループの割り込みを一時的に禁止する。
【0057】本実施例の割込命令チェック装置10は、この割込禁止/許可命令が適正位置に記述されていることをチェックすることを目的としている。そして、特に本実施例の割込命令チェック装置10では、あるグローバル変数に対する読込処理と書込処理の特定条件を満たすペア(条件付ぺア)が下位の関数グループにある場合に、そのペアに対して記述されるべき割込禁止/許可命令をチェックする。
【0058】図3は、本割込命令チェック装置10の機能ブロック図である。図3に示すように、本割込命令チェック装置10は、変数テーブル作成ブロック11、コールツリー作成ブロック12、変数属性テーブル作成ブロック13及び干渉検出/チェックブロック14を備えている。以下、各ブロック11〜14の動作を説明する。
【0059】変数テーブル作成ブロック11は、ソースプログラム21に基づき、変数テーブルを作成する。変数テーブルは、図4に示すように、グローバル変数名、関数名、行数、書き込み/読み込みの区別が記述されたものである。なお、変数テーブルの左端の欄に示した(1)〜(7)の数字は、この変数テーブル中の記述を説明するために便宜上付したものである。
【0060】変数テーブル作成ブロック11は次の■〜■の手順で処理を実行する。
■ ソースプログラム21中のグローバル変数を検索する。検索されたグローバル変数は、変数テーブルの「グローバル変数名」の欄に記される。
■ 検索されたグローバル変数が使用されている関数を取得する。取得された関数が、変数テーブルの「関数名」の欄に記される。
【0061】■ グローバル変数に係る処理記述が上記■で取得された関数中(関数が記述されたファイル)の何行目に当たるかを特定する。特定された行数が変数テーブルの「行数」の欄に記される。
■ 上記■で特定された行数の処理記述がグローバル変数の書込処理であるか読込処理であるかを判断する。書込処理である場合には変数テーブルの「書き込み」の欄に「○」が記され、一方、読込処理である場合には変数テーブルの「読み込み」の欄に「○」が記される。
【0062】例えば図4の変数テーブルに示す(7)の場合について、実際のソースプログラム21から変数テーブルを作成する過程を具体的に示す。例えばソースプログラム21中に、図5に示す記述があったとして説明を続ける。このとき、ソースプログラム21中でグローバル変数Val7を検索し(上記■)、グローバル変数Val7の使用される関数を取得する(上記■)。図5から分かるように、関数f1、関数f21、及び関数f22が取得される。したがって、図4に示すように、グローバル変数Val7に対し関数名f1,f21,f22が記される。
【0063】続いて、グローバル変数に係る処理記述が関数f1,f21,f22の何行目に当たるかを特定する(上記■)。図5に示すように関数f1の5行目、関数f21の10行目及び12行目、関数f22の10行目及び12行目にその処理記述があれば、「5」,「10」,「12」,「10」,「12」が行数として特定され、変数テーブルに記される。図4に示す如くである。
【0064】そして次に、グローバル変数に係る処理記述がグローバル変数の書込処理であるか読込処理であるかを判断する(上記■)。書き込み処理である場合は「=」の左側にグローバル変数が記述されている。一方、読込処理である場合は「=」の右側にグローバル変数が記述されているか、又は、条件式などに記述されている。関数f1では「=」の左側にグローバル変数Val7が記述されているため書込処理と判断し、関数f21の10行目では「=」の右側にグローバル変数Val7が記述されているため読込処理、12行目では「=」の左側にグローバル変数Val7が記述されているため書込処理と判断する。さらに、関数f22の10行目ではif文の条件式中にグローバル変数Val7が記述されているため読込処理、12行目では「=」の左側にグローバル変数Val7が記述されているため書込処理と判断する。これによって、図4に示す変数テーブルには、関数f1の5行目、関数f21の12行目、関数f22の12行目の処理記述に対応させ「書き込み」の欄に「○」が記され、関数f21の10行目、関数f22の10行目の処理記述に対応させ「読み込み」の欄に「○」が記される。
【0065】続いて、コールツリー作成ブロック12について説明する。コールツリー作成ブロック12は、ソースプログラム21に基づき、「コール情報」としてのコールツリーを作成する。具体的には、上述したメイン関数内でサブ関数をコールする処理を検索し、サブ関数をコールする処理があれば、そのサブ関数内でさらにサブ関数をコールする処理を検索するという具合に、いわゆるネスト構造になっている関数グループ内の関係を特定する。このようにして、図6に示すようなコールツリーが作成される。図6には、作成されるコールツリーの一部を例示した。図6の上段に示すコールツリーは、関数f1から関数f11がコールされ、さらに関数f11から関数f12及び関数f13がコールされていることを示している。他の関数f2,f3についても同様である。つまり、図6中の実線で結ばれた複数の関数群が上述した関数グループを構成し、関数f1,f2,f3がメイン関数、残りの関数f11,f12,f13,f21,f22,f23,f31がサブ関数に相当する。
【0066】続いて、変数属性テーブル作成ブロック13について説明する。変数属性テーブル作成ブロック13は、変数テーブル作成ブロック11にて作成された変数テーブル(図4参照)、コールツリー作成ブロック12にて作成されたコールツリー(図6参照)、タスクレベル表22(図2参照)に基づき、変数属性テーブルを作成する。この変数属性テーブルは、図7に太枠にて示したように、変数テーブル(図4参照)に対し、関数名に対応する「タスクレベル」が追加されたものである。なお、変数属性テーブルの左端に示す(1)〜(7)の数字は、変数テーブルと同様、説明のために便宜上付したものである。
【0067】変数属性テーブル作成ブロック13は、変数テーブルの「関数名」の欄に記述された関数を1つずつ選択し、次の■及び■の処理を実行する。
■ 選択した関数がタスクレベル表22にあるか否かを判断する。タスクレベル表22には、上述のように各関数グループのメイン関数だけが記述されているため、変数テーブルから選択した関数がメイン関数であればタスクレベル表22に存在する。一方、変数テーブルから選択した関数がサブ関数であればタスクレベル表22に存在しない。
【0068】■ 上記■で存在すると判断された場合、タスクレベル表22に記述されているタスクレベルを変数属性テーブルに記す。一方、上記■で存在しないと判断された場合、その関数はサブ関数であるため、コールツリー作成ブロック12にて作成されたコールツリーを参照し、メイン関数を特定する。そして、タスクレベル表22を参照して、そのメイン関数に対応するタスクレベルを変数属性テーブルに記す。
【0069】この変数属性テーブルによれば、グローバル変数を使用する関数が上位関数であるかあるいは下位関数であるかが把握できる。つまり、割り込む側である上位の関数グループに属する関数であるか、あるいは、割り込まれる側である下位の関数グループに属する関数であるかが把握できる。
【0070】また、変数属性テーブル作成ブロック13は、作成した変数属性テーブルに対し、テーブル更新処理を実行する。図8は、テーブル更新処理を示すフローチャートである。このテーブル更新処理は、変数属性テーブルに記載された下位関数の各グローバル変数の処理記述に対して実行されるものである。
【0071】まず最初のステップ(以下、ステップを単に記号Sで示す)200において、変数属性テーブルを参照する。S210では、読込処理か否かを判断する。ここで読込処理であると判断された場合(S210:YES)、S220へ移行する。一方、書込処理であると判断された場合(S210:NO)、S240へ移行する。
【0072】読込処理である場合に移行するS220では、代入を伴う処理であるか否かを判断する。代入を伴う処理は、「=」の右側にグローバル変数が記述されている処理である。条件式中にグローバル変数が記述されている場合などは代入を伴う処理ではない。ここで代入を伴う処理であると判断された場合(S220:YES)、S230にて当該読込処理が代入を伴う読み込みであるとして情報を付加し、その後、S260へ移行する。一方、代入を伴わない処理であると判断された場合(S220:NO)、以降の処理を実行せずに、本テーブル更新処理を終了する。
【0073】書込処理である場合に移行するS240では、固定値の代入処理であるか否かを判断する。ここで固定値の代入処理でないと判断された場合(S240:NO)、S250にて当該書込処理が固定値以外の書き込みであるとして情報を付加し、その後、S260へ移行する。一方、固定値の代入処理であると判断された場合(S240:YES)、以降の処理を実行せずに、本テーブル更新処理を終了する。
【0074】S260では、S230又はS250で付加された情報を基にして、変数属性テーブルを更新する。例えば更新後の変数属性は、図9に示す如くとなる。(7)の場合について見れば、図5の処理記述から分かるように、関数f21の10行目の処理記述は、代入を伴う読込処理であるため、S210及びS220で肯定判断されることになる。このような処理記述に対応させ、変数属性テーブルの読み込みの欄に「●」を記して更新する(S230,S260)。また、関数f21の12行目の処理記述は、固定値の代入ではない書込処理である。したがって、S210及びS240で否定判断されることになる。このような処理記述に対応させ、変数属性テーブルの書き込みの欄に「●」を記して更新する(S250,S260)。
【0075】すなわち、上述したテーブル更新処理によって、予め定められた条件を満たす読込処理及び書込処理が、更新後の変数属性テーブルの書き込み及び読み込みの欄から、把握できることになる。なお、図9中の(1)〜(6)については特に更新がなかったものとしている。
【0076】続いて、干渉検出/チェックブロック14について説明する。干渉検出/チェックブロック14は、上述した変数属性テーブル作成ブロック13にて作成され更新された図9に示す変数属性テーブルに基づき、割込禁止/許可命令のチェック処理を実行し、結果ファイル24を記憶装置20に出力すると共に表示用データ31を表示装置30へ出力する。
【0077】この干渉検出/チェックブロック14にて実行されるチェック処理を図10のフローチャートに基づいて説明する。このチェック処理は、変数属性テーブルに記載された各グローバル変数毎に実行されるものである。まず最初のステップS100において、更新後の変数属性テーブルを読み込む。そして、読み込まれた変数属性テーブルに基づき、以下の処理を実行する。
【0078】続くS110では、関数毎に記述されたタスクレベルが異なるか否かを判断する。図9の変数属性テーブルに示す(1)〜(4)、(6)及び(7)の場合は、関数間でタスクレベルが異なるため、肯定判断される。一方、(5)の場合は、タスクレベルが共に「6」となっているため、否定判断される。ここでタスクレベルが異なると判断された場合(S110:YES)、S120へ移行する。一方、タスクレベルが同じであると判断された場合(S110:NO)、以降の処理を実行せず、本チェック処理を終了する。
【0079】S120では、上位関数で書き込みをするか否かを判断する。変数属性テーブルに示す(1)〜(3)及び(7)の場合は、タスクレベルの高い(数値の小さい)関数である上位関数にて書込処理を行うため、肯定判断される。一方、(4)及び(6)の場合は、上位関数にて読込処理を行うから、否定判断される。ここで上位関数で書き込みをすると判断された場合(S120:YES)、S130へ移行する。一方、上位関数で読み込みをしないと判断された場合(S120:NO)、以降の処理を実行せず、本チェック処理を終了する。
【0080】S130では、条件付ペアが下位関数にあるか否かを判断する。ここで判断されるペアは、同一下位関数内での読込処理とこれに続く書込処理のペアである。条件を満たすか否かは、図9に示す変数属性テーブルの読み込み及び書き込みの欄が「●」となっているか否かで判断する。図9に示す変数属性テーブルでは(7)の場合に、肯定判断されることになる。ここで、条件付ペアがあると判断された場合(S130:YES)、S140へ移行する。一方、条件付ペアがないと判断された場合(S130:NO)、以降の処理を実行せず、本チェック処理を終了する。
【0081】S140では、下位関数で条件付ペアとなっている読込処理記述の直前に割込禁止命令があり、かつ、書込処理記述の直後に割込許可命令があることをチェックする。例えば変数属性テーブルの(7)の場合について具体的に説明する。(7)の場合は、図5中の下位関数f21の10行目の読込処理記述の直前に割込禁止命令が存在し、12行目の書込処理記述の直後に割込許可命令が存在することをチェックする。つまり、図5に割込禁止命令を「zdi」として示し、割込許可命令を「zei」として示したが、この枠線で囲って示した割込許可/禁止命令の存在をチェックするのである。
【0082】S150では、S140のチェック結果に基づき、割込禁止/許可命令が存在するか否かを判断する。ここで存在すると判断された場合(S150:YES)、S160の処理を実行せず、S170へ移行する。一方、存在しないと判断された場合(S150:NO)、S160にてNG判定をし、エラー情報、エラーコードなどを作成して、その後、S170へ移行する。
【0083】S170では、結果出力を行う。S150にて肯定判断されてここへ移行した場合には、そのグローバル変数の処理記述位置に応じた適正位置に割込禁止/許可命令が存在する旨を、結果ファイル24として記憶装置20に記憶すると共に表示用データ31として表示装置30へ出力する。一方、S160からここへ移行した場合には、適正位置に割込禁止/許可命令が存在しない旨を示す詳細情報を含めた結果ファイル24を記憶装置20へ記憶すると共に、エラー情報及びエラーコードを表示用データ31として表示装置30へ出力する。
【0084】次に、本割込命令チェック装置10の出力情報について説明する。図10中のS170で説明したように、本実施例では、表示用データ31及び結果ファイル24を出力する(図3参照)。なおここでは、チェック結果に問題がない場合もその旨を表示するが、ここでは割込禁止/許可命令が存在しない場合の出力情報について説明する。
【0085】割込禁止/許可命令が適正位置に存在しない場合に出力される表示用データ31は、エラー情報、エラーコードである。エラー情報は、そのグローバル変数の処理記述位置に応じた適正位置に割込禁止/許可命令が存在しない旨を示す情報であり、エラーコードは、エラー情報をいくつかのケースに分類する情報である。いくつかのケースとは、例えば割込禁止/許可命令の記述が存在しないケースや、存在するが適正位置でないケースなど種々考えられる。もちろんエラー情報のみを表示するようにしてもよいが、エラーコードがあれば、ソースプログラム21の修正が容易になり、ソースプログラム21の修正工数の削減に寄与する。
【0086】一方、割込禁止/許可命令が適正位置に存在しない場合に出力される結果ファイル24を図11に例示した。この図11は、変数属性テーブルに示す(7)の場合、すなわちグローバル変数Val7についてチェックを行った結果、適正位置に存在しないと判断された際の結果ファイル24を示すものである。
【0087】まず、1行目の記述について説明する。「0001」は、シリアルナンバーであり、上述したチェック処理に対して連番で付加されるものである。「Val7(int)」は、グローバル変数Val7についてのチェック結果であることを示し、「(int)」は、このグローバル変数Val7が整数型であることを示している。
【0088】「NG」は、グローバル変数Val7についてのチェック結果に問題があることを示している。続けて2〜6行目の記述を説明する。2〜6行目は、グローバル変数に係る処理記述位置毎のチェック結果を示している。
【0089】2行目の「file10」は関数f1の記述されたファイル名を示しており、3行目の「file11」は関数f21、5行目の「file12」は関数f22の記述されたファイル名を示している。「5」(2行目),「10」(3行目),「12」(4行目),「10」(5行目)、「12」(6行目)は、ファイル内(関数内)のグローバル変数の記述位置を示している。
【0090】「0001」は、上述したシリアルナンバーであり、1行目に示したグローバル変数Val7の詳細情報であることを示している。2,5,6行目の「OK」、3,4行目の「NG」は、それぞれの関数内でのチェック結果を示している。上位関数f1については、割込禁止/許可命令のチェックを行わないため、常に「OK」が記される。
【0091】2行目の「#−f1_W」はメイン関数f1内の書込処理であることを示し、3行目の「f2−f21_R」及び4行目の「f2−f21_W」はそれぞれ、関数f2からコールされるサブ関数f21内の処理であることを示し、前者は読込処理、後者は書込処理であることを示している。5,6行目も同様である。
【0092】「Val7=a;」、「b=Val7;」、「Val7=b;」、「if(Val7==1)」及び「Val7=0;」は、それぞれのグーバル変数の処理記述そのものを示している。なお、結果ファイル24のフォーマットは、ここで説明したものに限定されない。結果ファイル24からソースプログラム21を修正することを考えれば処理記述位置を特定できる情報が付加されることが望ましいが、少なくともグローバル変数に対してのチェック結果が得られればよい。
【0093】次に、本実施例の割込命令チェック装置10の発揮する効果を説明する。本実施例の割込命令チェック装置10では、タスクレベル表22を用いて作成した変数属性テーブル(図9参照)を読み込み(図10中のS100)、グローバル変数の書込処理が上位関数にあり(S120)、かつ、下位関数中に読込処理及び書込処理の条件付ペアがあれば(S130)、当該処理記述位置に応じた適正位置に割込禁止/許可命令が存在することを判断し(S140〜S160)、その判断結果を出力する(S170)。これによって、あるグローバル変数に対する読込処理と書込処理のペアが下位の関数グループにある場合に、そのペア記述により生じ得るグローバル変数の干渉部分を抽出でき、割込禁止/許可命令が適正位置に存在することを自動的にチェックできる。結果として、割込禁止/許可命令のチェック工数の削減に寄与する。
【0094】ここで具体例を挙げて、本実施例におけるチェック処理の有効性を説明する。本実施例に記載したアルゴリズムを用いると、図12(a)に示すようなグローバル変数Val72に関する下位関数f31での処理記述は、図12(b)に示すような変数属性テーブルに表される。そして、条件を満たす読込処理とそれに続く書込処理のペアは、9、10行目のペアであると判断される。つまり、この場合9行目の直前に割込禁止命令が存在し、10行目の直後に割込許可命令が存在することをチェックする。なお、図12(a)の左端には、処理に関係しない、説明のための行数を便宜上付加した。
【0095】ここで図12(a)に示す処理記述を見ると、グローバル変数Val72によるスイッチ文が7行目に記載されており、8〜11行目、12〜15行目、16〜19行目のcase文による記述はそれぞれ独立している。そして、各case文の処理内容を見ると、割込禁止/許可命令の記述が必要となるのは、変数iにグローバル変数Val72を読み出す9行目と、変数iを用いた演算結果i+jをグローバル変数Val72に代入する10行目のペアに対してである。
【0096】従来のように個々の処理記述に対して割込禁止/許可命令をチェックすると、7,9,10,13,14,17,18行の処理記述のそれぞれに対するチェックを行ってしまうことになる。これに対して、本実施例では、9行目の直前及び10行目の直後にそれぞれ、割込禁止命令及び割込許可命令があるか否かをチェックすることができ、case文の記述に対しても適切なチェックを行えることが分かる。
【0097】なお、本実施例では、読込処理とその読込処理のすぐ次にある書込処理のペアをチェックするものであった。ただし、処理記述内容によっては、読込処理及び書込処理の条件付ペアの間に、同じグローバル変数の読込処理や書込処理が記述されている場合をチェック対象としてもよい。
【0098】また、上述のように本実施例では、下位関数中に存在するグローバル変数の処理記述で条件付ペアとなる読込処理記述の直前に割込禁止命令が存在し、書込処理記述の直後に割込許可命令が存在することを判断する(S140)。このようにしたのは、不具合の発生する可能性があるステップ間だけで割り込みを禁止すれば十分であり、条件付ペアを構成する読込処理と書込処理との途中で割り込みが発生しないようにすればよいためである。このように、読込処理の直前で割り込みを禁止し、書込処理の直後で割り込みを許可すれば、リアルタイム性確保の観点から有効である。
【0099】さらにまた、本実施例の割込命令チェック装置10では、図3に示す変数テーブル作成ブロック11が、まず最初にグローバル変数を検索し(上記■)、そのグローバル変数に関する情報を記述した変数テーブルを作成する(上記■〜■)。そして、変数属性テーブル作成ブロック13が、その変数テーブルに関数に対応するタスクレベルを追加した変数属性テーブルを作成する(上記■及び■)。さらに、変数属性テーブル作成ブロック13は、テーブル更新処理(図8参照)を実行し、読込処理及び書込処理が予め定められた条件を満たすか否かを判断して、変数属性テーブルを更新する。つまり、各グローバル変数を基にして情報を整理するため、処理内容が分かり易いものとなり、各ブロック11〜14の処理設計が容易になっている。
【0100】また、本実施例では、図3に示すコールツリー作成ブロック12がソースプログラム21に基づき、コールツリー(図6参照)を作成する。したがって、上述したように関数グループのメイン関数のみに対応させてタスクレベルが記述されたタスクレベル表22を用い、各関数グループの関数に対するタスクレベルを特定することができる(上記■及び■)。つまり、タスクレベル表22には、ソースプログラム21を構成する関数の全てに対するタスクレベルを記述しておく必要がないのである。結果として、例えばソースプログラム21の定義ファイルに記述された情報のみを用いてタスクレベル表22を作成すればよいという点で有利である。
【0101】さらにまた、表示用データ31として、チェック結果に問題があったことを示すエラー情報と、そのエラーのケースを示すエラーコードを出力するようにした。これによって利用者は、チェック結果だけでなくその内容を知ることができる。そしてまた、チェック結果に問題があった場合、結果ファイル24には、図11に示すような詳細情報を付加した形式の情報を記述する。したがって、利用者は、この結果ファイル24に基づき、速やかにソースプログラム21を修正することができる。
【0102】以上、本発明はこのような実施例に何等限定されるものではなく、本発明の主旨を逸脱しない範囲において種々なる形態で実施し得る。
(イ)上記実施例では、タスクレベル表22は、予め作成されて記憶装置20に記憶されていた。これに対して、ソースプログラム21内にタスクレベルの定義ファイルがあれば、割込命令チェック装置10が読み込んだソースプログラム21に基づき、タスクレベル表22を作成して取得するようにしてもよい。このようにすれば、タスクレベル表22を予め作成する必要がなくなる。
【0103】(ロ)また、上記実施例は結果ファイル24に基づき利用者がソースプログラム21を修正するものであったが、結果ファイル24の内容から割込命令チェック装置10が自動的にソースプログラム21を修正するように構成することも考えられる。
【0104】(ハ)さらにまた、上記実施例では、上位関数中のグローバル変数に係る処理記述の前後の割込禁止/許可命令のチェックは行っていない。これは上位関数には割込禁止/許可命令があってもなくても実質的な弊害がないからである。また、ある関数に対しての上位関数が別の関数に対する下位関数となる場合もあり得るからである。
【0105】しかし、あるグローバル変数について見た場合、どの関数よりも上位となる関数に割込禁止/許可命令が存在している場合には、その割込禁止/許可命令が不必要な割込禁止/許可命令であるとしてチェックするようにしてもよい。このチェック結果に基づけば不必要な割込禁止/許可命令を取り除くことができ、上位関数の処理実行に要する時間を短縮できることになる。
【出願人】 【識別番号】000004260
【氏名又は名称】株式会社デンソー
【出願日】 平成13年4月9日(2001.4.9)
【代理人】 【識別番号】100082500
【弁理士】
【氏名又は名称】足立 勉
【公開番号】 特開2002−312196(P2002−312196A)
【公開日】 平成14年10月25日(2002.10.25)
【出願番号】 特願2001−110075(P2001−110075)