(57)【要約】      （修正有）【課題】無限ループ中に外部割込み処理を含むことによるバス・リソースの過度な消費を回避し、ＣＰＵ負荷が軽減されるシミュレーション・プログラムを提供する。【解決手段】処理プログラムは前処理で、ソースコードに無限ループがあり且つ、外部割込み以外にその無限ループから脱出するコードがなく、ループの外部に対して副作用をもつコードもなければ、無限ループ中の外部割込み処理の戻り番地をマップに追加する。次にシミュレーション・プログラムがコンピュータ・システム上で動作して、その無限ループに差し掛かり、無限ループ中の外部割込み処理のコードに到達すると、シミュレーション・プログラムは、外部割込み処理を行う。割込みチェックの結果、外部割込み処理が行われ、その外部割込み処理から戻る場合、その外部割込み処理の戻り番地が、マップにあるかどうかをチェックし、もしあれば、そのシミュレーション・プログラムのスレッドを停止する。【選択図】図５
2010113619.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータの処理によって、プログラムの動作を制御する方法であって、
プログラムの制御フローのループを見出すステップと、
前記ループに、外部割込み以外に前記ループから脱出するコード、または前記ループの外部に対して副作用をもつコードがないかどうかを確認し、外部割込み以外に前記ループから脱出するコードも、前記ループの外部に対して副作用をもつコードもないことに応答して、該外部割込み処理の戻り番地を登録するステップと、
前記プログラムの実行時に、外部割込み処理が行われることに応答して、該外部割込み処理の戻り番地が登録されているかどうか確認し、登録されていることに応答して、前記プログラムの実行処理を停止するステップと、
前記実行処理を停止されたプログラムの処理における前記外部割込みが発生したことに応答して、前記プログラムの実行処理を再開するステップを有する、
制御方法。
【請求項２】
前記プログラムの制御フローのループを見出すステップが、制御フローのバックエッジを見出すステップと、制御フローの強い連結成分を見出すステップを含む、請求項１の制御方法。
【請求項３】
前記実行処理の単位がスレッドである、請求項１の制御方法。
【請求項４】
前記プログラムが、シミュレーション・プログラムである、請求項１の制御方法。
【請求項５】
コンピュータの処理によって、プログラムの動作を制御する方法であって、
プログラムの制御フローの、外部割込み以外にループから脱出するコードがなく、該ループの外部に対して副作用をもつコードもない前記ループにおける、該外部割込み処理の戻り番地を登録したテーブルを、前記コンピュータが読取り可能に用意するステップと、
前記プログラムの実行時に、外部割込み処理が行われることに応答して、該外部割込み処理の戻り番地が前記テーブルに登録されているかどうか確認し、登録されていることに応答して、前記プログラムの実行処理を停止するステップと、
前記実行処理を停止されたプログラムの処理における前記外部割込みが発生したことに応答して、前記プログラムの実行処理を再開するステップを有する、
制御方法。
【請求項６】
前記実行処理の単位がスレッドである、請求項５の制御方法。
【請求項７】
前記プログラムが、シミュレーション・プログラムである、請求項５の制御方法。
【請求項８】
コンピュータの処理によって、プログラムの動作を制御するシステムであって、
プログラムの制御フローの、外部割込み以外にループから脱出するコードがなく、また該ループの外部に対して副作用をもつコードももたない前記ループにおける、該外部割込み処理の戻り番地を登録したテーブルを、前記コンピュータが読取り可能に保持する手段と、
前記プログラムの実行時に、外部割込み処理が行われることに応答して、該外部割込み処理の戻り番地が前記テーブルに登録されているかどうか確認し、登録されていることに応答して、前記プログラムの実行処理を停止する手段と、
前記実行処理を停止されたプログラムの処理における前記外部割込みが発生したことに応答して、前記プログラムの実行処理を再開する手段を有する、
制御システム。
【請求項９】
前記実行処理の単位がスレッドである、請求項８の制御システム。
【請求項１０】
前記プログラムが、シミュレーション・プログラムである、請求項８の制御システム。
【請求項１１】
プログラムの動作を制御する制御プログラムであって、
コンピュータに、
プログラムの制御フローのループを見出すステップと、
前記ループに、外部割込み以外に前記ループから脱出するコード、または前記ループの外部に対して副作用をもつコードがないかどうかを確認し、外部割込み以外に前記ループから脱出するコードも、前記ループの外部に対して副作用をもつコードもないことに応答して、該外部割込み処理の戻り番地を登録するステップと、
前記プログラムの実行時に、外部割込み処理が行われることに応答して、該外部割込み処理の戻り番地が登録されているかどうか確認し、登録されていることに応答して、前記プログラムの実行処理を停止するステップと、
前記実行処理を停止されたプログラムの処理における前記外部割込みが発生したことに応答して、前記プログラムの実行処理を再開するステップを実行させる、
制御プログラム。
【請求項１２】
前記プログラムの制御フローのループを見出すステップが、制御フローのバックエッジを見出すステップと、制御フローの強い連結成分を見出すステップを含む、請求項１１の制御プログラム。
【請求項１３】
前記実行処理の単位がスレッドである、請求項１１の制御プログラム。
【請求項１４】
前記プログラムが、シミュレーション・プログラムである、請求項１１の制御プログラム。
【請求項１５】
プログラムの動作を制御する制御プログラムであって、
コンピュータに、
プログラムの制御フローの、外部割込み以外にループから脱出するコードがなく、該ループの外部に対して副作用をもつコードもない前記ループにおける、該外部割込み処理の戻り番地を登録したテーブルを、前記コンピュータが読取り可能に用意するステップと、
前記プログラムの実行時に、外部割込み処理が行われることに応答して、該外部割込み処理の戻り番地が前記テーブルに登録されているかどうか確認し、登録されていることに応答して、前記プログラムの実行処理を停止するステップと、
前記実行処理を停止されたプログラムの処理における前記外部割込みが発生したことに応答して、前記プログラムの実行処理を再開するステップを有する、
制御プログラム。
【請求項１６】
前記実行処理の単位がスレッドである、請求項１５の制御プログラム。
【請求項１７】
前記プログラムが、シミュレーション・プログラムである、請求項１５の制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、組込みシステムなどのシステムの上で動くプログラムをシミュレーションするためのシステム、方法及びプログラムに関するものである。
【背景技術】
【０００２】
近年、携帯電話、デジカメ、エレベータ、自動車のＥＣＵ、エンジン・シミュレータ、産業用ロボットなど、マイクロコンピュータによってハードウェアを直接制御する組込みシステムが日常的に使用される頻度が高まってきた。
【０００３】
一般的なコンピュータ・プログラムもそうあるが、特に組込みシステムでは、作成したプログラムが、正しく動作するかどうかを、さまさざまな状況毎にテストする必要がある。
【０００４】
このようなテストにために従来行われている技法として、ＨＩＬＳ(Hardware In the Loop Simulation)がある。特に、自動車全体の電子制御システムをテストする環境は、フルビークルＨＩＬＳと呼ばれる。フルビークルＨＩＬＳにおいては、実験室内で、本物のＥＣＵが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ＥＣＵからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【０００５】
しかし、ＨＩＬＳは、専用のハードウェア装置を使い、それと本物のＥＣＵの間を物理的に配線しなくてはならないので、準備が大変である。また、別のＥＣＵに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のＥＣＵを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、ＨＩＬＳのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
【０００６】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、全てをソフトウェアで構成する手法が提案されている。この手法は、ＳＩＬＳ(Software In the Loop Simulation)と呼ばれ、電子制御システムに使用されるマイクロコンピュータ、入出力回路、制御のシナリオなどを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、組込みシステムのハードウェアが存在しなくても、テストを実行可能である。
【０００７】
ＳＩＬＳにおいては、ハードウェアの制御をエミュレートするプログラムや、ハードウェアの動作そのものの挙動をシミュレートするプログラムが、テスト用のコンピュータ・システム上で動作するように用意される。
【０００８】
特に、シミュレーションにかかる時間を短縮するために、テスト用のコンピュータ・システムとしては、近年、マルチプロセッサの高速なコンピュータ・システムが使用されるようになってきている。このようなシステムにおいては、シミュレーション・プログラムの動作を高速化するために、シミュレーションの複数の処理が、個別のプロセスや個別のスレッドとして、並列的に実行される。
【０００９】
ところで、実際の組込みシステムのプログラムは、ハードウェアを制御するために外部割込みを利用するものが多い。すると、割込みがあったことに応答して、直ちに処理を開始しなくてはならないので、外部割込みの待ち状態が無限ループで表現されていることが多い。それは、組込みシステムのプログラムでは、割込みに対する応答にリアルタイム性が重視され、スタンバイやスリープで割り込み待ちしないのは、そこからの復帰に時間がかかってしまうからである。
【００１０】
このような組込みシステムのプログラムを、ソフトウェア的にシミュレーションする場合、もとのプログラムのロジックをなるべく正確に実現するために、無限ループは、そのまま無限ループとして実行されることになる。その際、シミュレーション・プログラムでは、ハードウェアの外部割込みを実際に引き起こすことができないので、そこのところは、外部割込みをチェックする処理と、割込みがあったと判定されたときに行われる外部割込みをシミュレートする処理に置き換えられる。
【００１１】
ところが、ソフトウェアでシミュレーションする際に、無限ループ内で外部割込みをチェックする処理を行うと、短い時間の間に外部割込みをチェックするメモリ・アクセスが頻繁に行われ、そのことがバス・リソースを奪うため、並列動作中の別プロセッサの円滑な動作を阻害する、という問題がある。
【００１２】
特開２００３−１８６９３６号公報は、シミュレーション制御部の制御によって、Ｉ／Ｏモデル部が動作した後の所定タイミング（アドレス値）で、ＣＰＵモデル部をモデル動作設定部が待機状態に設定してシミュレーションを省略し、次に、Ｉ／Ｏモデル部からの割り込みを含むイベント通知をモデル動作設定部が認識した後にＣＰＵモデル部をモデル動作設定部によって動作状態に戻してシミュレーションを再開することを開示する。このようにして、ＣＰＵモデル部が、Ｉ／Ｏモデル部からの割り込みの待機状態において、処理上で意味のないループを処理している場合に、ＣＰＵモデル部のシミュレーションを省略するようにされる。
【００１３】
【特許文献１】特開２００３−１８６９３６号公報
【発明の開示】
【発明が解決しようとする課題】
【００１４】
特開２００３−１８６９３６号公報が開示する技術においては、Ｉ／Ｏモデル部からの割り込みの待機状態において、処理上で意味のないループを処理している場合に、ＣＰＵモデル部のシミュレーションが省略され、それによって動作検証シミュレーションが高速化されるが、この技法においては、依然として、処理がループを廻りながら、ＣＰＵモデル部が動作中かどうかの判断処理が継続的に行われるので、依然として、バス・リソースの占有の問題は、残る。
【００１５】
従って、この発明の目的は、無限ループ中に外部割込みの処理を含むプログラムが、バス・リソースを過度に消費してしまう問題を解決することにある。
【課題を解決するための手段】
【００１６】
この発明によればまず、シミュレーション・プログラムが、ソースコード・レベルで、本発明の解析処理プログラムによって解析される。もし、バイナリ・コードしか入手できないなら、ソースコード・レベルを生成するために、必要に応じて、逆アセンブルまたは、逆コンパイル処理が行われる。
【００１７】
ソースコードの解析は、無限ループを見つけ出すことと、外部割込み以外にその無限ループから脱出するコードがあるかどうか、更には、ループの外部に対して副作用をもつ命令があるかどうかを確認することである。ここで、外部割込み以外にその無限ループから脱出するコードとは例えば、Ｃ言語を例にとると、while () { }ループの中のbreak;や、goto LABEL;などのことである。また、ループの外部に対して副作用をもつ命令とは、エラーを起こし得る可能性がある命令（不正なメモリアクセス、０による除算など）、他スレッドと同期をとる命令などのことである。すなわち、これらの命令の場合、ループから一旦出ると、ループ内に戻ってこれる保証がない。一方、外部割込みの場合、ＲＴＩ(return from interrupt)という仕組みで、ループ内に戻ることができる。
【００１８】
無限ループがなく、あるいは無限ループがあっても、外部割込み以外にその無限ループから脱出するコードまたは、ループの外部に対して副作用をもつ命令があれば、本発明の処理プログラムは、何もしない。
【００１９】
もし無限ループがあり且つ、外部割込み以外にその無限ループから脱出するコードも、ループの外部に対して副作用をもつ命令もなければ、処理プログラムは、無限ループ中の、外部割込みを行う箇所の戻り番地をマップに追加する。このマップとは、好適には、共有メモリ領域に配置される。
【００２０】
このように処理プログラムにより前処理が行われると、シミュレーション・プログラムがコンピュータ・システム上で動作して、その無限ループに差し掛かり、無限ループ中の外部割込み処理のコードに到達すると、シミュレーション・プログラムは、外部割込み処理を行う。すると、本発明の実行チェック・プログラムが、その外部割込み処理の戻り番地が、マップにあるかどうかをチェックし、もしあれば、そのシミュレーション・プログラムのスレッドを停止する。そして、処理は、管理スレッドへと引き渡される。このようにシミュレーション・プログラムのスレッドが停止されることで、無限ループ内で繰り返し頻繁に外部割込みのためメモリにアクセスすることが防止され、これによって、ＣＰＵの負荷が軽減される。
【００２１】
その間、管理スレッドは、外部割込みがあったかどうかをチェックし、もし外部割込みがあると、外部割込みフラグをセットして、シミュレーション・プログラムのスレッドを再開する。すると、シミュレーション・プログラムは、その外部割込みをチェックする外部割込み処理を呼び出す次のコードに、ＲＴＩ(return from interrupt)復帰する。
【発明の効果】
【００２２】
この発明によれば、無限ループ中の、外部割込み処理の戻り番地をマップに追加し、シミュレーション・プログラムの実行時に、処理プログラムが、外部割込み処理の戻り番地がマップに存在しているかどうかを確認し、もしそうなら、シミュレーション・スレッドを停止するようにしたので、割込みチェック処理によるメモリへの頻繁なアクセスが回避され、ＣＰＵの負荷が軽減される、という効果が得られる。このことは、シミュレーション・プログラム全体の速度向上につながる。
【発明を実施するための最良の形態】
【００２３】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００２４】
先ず、図１を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図１において、ホスト・バス１０２には、複数のＣＰＵ０  １０４ａ、ＣＰＵ１  １０４ｂ、ＣＰＵ２  １０４ｃ、ＣＰＵ３  １０４ｄが接続されている。ホスト・バス１０２にはさらに、ＣＰＵ０  １０４ａ、ＣＰＵ１  １０４ｂ、ＣＰＵ２  １０４ｃ、ＣＰＵ３  １０４ｄがプログラムをロードしたり作業領域を確保したりするためのメイン・メモリ１０６が接続されている。
【００２５】
一方、Ｉ／Ｏバス１０８には、キーボード１１０、マウス１１２、ディスプレイ１１４及びハードティスク・ドライブ１１６が接続されている。Ｉ／Ｏバス１０８は、Ｉ／Ｏブリッジ１１８を介して、ホスト・バス１０２に接続されている。キーボード１１０及びマウス１１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ１１４は、必要に応じて、後述する本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００２６】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ０  １０４ａ、ＣＰＵ１  １０４ｂ、ＣＰＵ２  １０４ｃ、ＣＰＵ３  １０４ｄは、例えば、インテル（Ｒ）Ｃｏｒｅ  ２  ＤＵＯであり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ１１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ１１６からメイン・メモリ１０６に読み込まれる。
【００２７】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用してもよい。
【００２８】
本発明の処理を実施するために、マルチプロセッサであることは必須ではなく、単一プロセッサのシステムであってもよいが、オペレーティング・システムが、マルチタスクまたはマルチスレッド対応である必要はある。
【００２９】
ハードディスク・ドライブ１１６にはさらに、特に図示しないが、逆アセンブリまたは逆コンパイラ・プログラム、後述する本発明に係る処理プログラム、及び本発明に係る処理プログラムが適用されるシミュレーション・プログラム等が格納され、キーボード１１０及びマウス１１２によって起動操作可能である。
【００３０】
図２は、本発明に係る処理プログラムのうち、シミュレーション・プログラムをソースコードのレベルで解析して、無限ループを検出し、検出されたループ内の、外部割込みを行う箇所の戻り番地をマップに登録する処理を行う部分の処理をフローチャートを示すものである。
【００３１】
図２の処理は、シミュレーション・プログラムのソースコードが入手可能であることを前提とした処理である。実行すべきシミュレーション・プログラムが、オブジェクトコードや実行可能なバイナリ形式でしか提供されていない場合には、一旦、ニーモニックからなるアセンブラ・ソースコードあるいは、Ｃなどの高級言語のソースコードに変更するために使用される。なお、逆アセンブリ・プログラムが利用する技術は、例えば、特開昭５９−７１５４６号公報などに記述されている。また、逆コンパイル・プログラムが利用する技術は、例えば、特開昭６４−５４５３７号公報、特開２００５−８５０５１号公報などに記述されている。本発明では、ごく一般的な逆アセンブリ・プログラムまたは、逆コンパイル・プログラムを使用することができ、そのための機能は、本発明にとって本質的ではないので、これ以上詳述しない。
【００３２】
ステップ２０２では、シミュレーション・プログラムのソースコードに対して、コンパイラの技術で確立されている、コントロール・フローの解析処理が行われる。この解析結果に基づき、以下の判断ステップに基づき処理が行われる。
【００３３】
すなわち、ステップ２０４では、バックエッジが存在するかどうかが判断される。バックエッジとは、プログラムの制御の流れを表したグラフに対する深さ優先探索において、深さが浅くなる方向を向いたエッジのことである。
【００３４】
もしバックエッジが存在するなら、ステップ２０６に進み、そこで、強連結成分が存在するかどうかが判断される。ここで強連結であるとは、コントロール・フローを有向グラフとみたとき、グラフ上の任意の２点間に有向路が存在することをいう。なお、コントロール・フローにおいて強連結成分を見出す技法については、例えば、本出願人に係る特開平９−３１９７２２号公報、及び特開２００４−２７２８２６号公報などを参照されたい。
【００３５】
もし強連結成分が存在するなら、ステップ２０８に進む。ステップ２０８まで到達したということは、バックエッジが存在し、且つ強連結成分が存在する、ということで、コントロール・フローにループが検出されたことを意味する。
【００３６】
ステップ２０８では、見つかったループに関して、外部割込み以外に強連結成分から飛び出せるかどうかが判断される。ここで、外部割込み以外に強連結成分から飛び出せることとは、Ｃ言語における、while () { }ループの中のbreak;や、goto LABEL;が例である。それ以外に、エラーを起こし得る可能性がある命令（不正なメモリアクセス、０による除算など）、他スレッドと同期をとる命令がある場合も含まれる。これらを総称して、ループの外部に対して副作用をもつ命令と呼ぶこともできる。すなわち、これらの命令の場合、ループから一旦出ると、ループ内に戻ってこれる保証がない。一方、外部割込みの場合、ＲＴＩ(return from interrupt)という仕組みで、ループ内に戻ることができる。
【００３７】
ステップ２０８で、見つかったループに関して、外部割込み以外に強連結成分から飛び出す命令がなく、ループの外部に対して副作用をもつコードもないと判断されると、ステップ２１０で、ループ内にある外部割込み処理の戻り番地が、マップに登録される。ここで、戻り番地とは、好適には、外部割込みのルーチンが配置されている次の命令の番地である。
【００３８】
コントロール・フローに複数のループが見つかった場合は、その各々のループについて、同様の判断と処理が行われることを理解されたい。
【００３９】
ここで、外部割込みを行う箇所の戻り番地について、説明を補足する。下記のような例において、#0x1000などは、プログラムがロードされるメモリのアドレスである。
#0x1000 label: infinite_loop
#0x1004 if interrupted
#0x1008  then call interrupt_handler /* 外部割込み処理呼び出し */
#0x100c jump infinite_loop
...
#0x2000 ... /* 外部割込み処理開始アドレス */
...
#0x2100 ret /* 呼び出し箇所の次のアドレスへリターン */
【００４０】
この例では、マップには、call interrupt_handlerが配置されたアドレスの次のアドレスである、#0x100cが登録される。ループ内に複数のcall interrupt_handlerがある場合は、その各々について、同様のアドレスの登録が行われる。図３にその様子を示す。すなわち、ソースコード３０２における外部割込み処理を行うコードが配置されたアドレスの次のアドレスが順次、マップ３０４に登録される。マップ３０４の領域は、好適には共有メモリとして、メイン・メモリ１０６内に確保される。
【００４１】
なお、シミュレーション・プログラムとしてバイナリ・コードしかない場合、それを単に逆コンパイルまたは逆アセンブルしてコードを眺めても、データ部分とプログラム部分を切り分けることが難しいことがある。そのため、場合によって、バイナリ・コードを逆コンパイルまたは逆アセンブルするために、エントリ・ポイントを明示的に指定する必要があるが、そのようなエントリ・ポイントは、プログラムの作者から入手するかまたは、インタプリタなどで実際に実行して検出する必要がある場合があることを理解されたい。
【００４２】
interrupt_handlerは、典型的には、後述する外部割込みフラグが立っていたら呼び出され外部割込みに応じた処理ルーチンへ飛び、そうでないならば呼び出されない関数である。interrupt_handler関数によって呼び出される処理ルーチンの具体例としては、エンジンのインジェクターが次回供給する燃料量の計算や、スパーク・プラグのスパーク・タイミングの計算などが挙げられる。原則的に、interrupt_handler関数は、ソフトウェア割込みというよりも、寧ろハードウェア割込みをシミュレートする関数である。
【００４３】
図４は、本発明の処理プログラムが、シミュレーション・スレッドの開始と停止、及びＲＴＩライブラリの開始と終了に関する処理のフローチャートである。ステップ４０２から処理を開始する。
【００４４】
ステップ４０４では、パワーオン・リセット処理が行われる。パワーオン・リセット処理は、本発明に従う制御プログラムのメイン・メモリ１０６へのロード、シミュレーション・プログラムのメイン・メモリ１０６へのロード、図２のフローチャートの処理で得られた、ループ内にある外部割込みを行う箇所の戻り番地を、メイン・メモリ１０６中のマップ３０４に登録すること、ＲＴＩライブラリのセットアップ等を含む。
【００４５】
本発明に従う制御プログラムは、オペレーティング・システム上に常駐し、シミュレーション・プログラムの外部割込み処理からの戻りをフックし、あるいは、シミュレーション・プログラムを走らせるためのシミュレータの一部として組み込む方法などで、シミュレーション・プログラムを制御する。
【００４６】
なお、シミュレーション・プログラムは実際は様々な処理を行うが、以下では説明の便宜上、その無限ループ内での割込みチェック処理及び外部割込み処理から戻る処理に限定して処理を記述していることに留意されたい。
【００４７】
そのループ内の処理として、ステップ４０６では、無限ループ内にあって確実にシミュレーション時間が進められるように、シミュレーション時間の更新処理が行われる。
【００４８】
ステップ４０８では、割込みチェックが行われる。これは、図３に示すif interruptedの処理のことである。
【００４９】
ステップ４１０では、外部割込みフラグが立っているかどうかが判断される。もしそうでなければ、外部割込みは何もしないので、ステップ４１２の判断に進む。
【００５０】
ステップ４１２では、シミュレーション・スレッドが停止されたかどうかが判断される。もしそうなら、シミュレーション・プログラムは、ステップ４１４で、スレッドを停止して待機する。
【００５１】
ステップ４１２で、シミュレーション・スレッドが停止されていないと判断されると、シミュレーション時間の更新処理４０６に戻り、無限ループが継続される。
【００５２】
ステップ４１０に戻って、外部割込みフラグが立っていると判断されると、ステップ４１６で、interrupt_handlerによって、所定の割込み処理が行われ、ステップ４１８から、ＲＴＩライブラリが呼び出される。
【００５３】
ＲＴＩライブラリは、マップ３０４と同様に、本発明の処理プログラムの一部であり、以下その処理について説明する。ステップ４２０からＲＴＩライブラリが開始され、ＲＴＩライブラリは、ステップ４２２で、外部割込み処理の戻り番地がマップ３０４に登録されているかどうかを判断する。
【００５４】
もし、外部割込み処理の戻り番地がマップ３０４に登録されていないなら、直ちにステップ４２４に行って、ループ内の外部割込み処理の次の命令に戻る。そしてステップ４２６で、ＲＴＩライブラリは、終了となり、ステップ４１２の判断に進む。
【００５５】
ステップ４２２で、外部割込み処理の戻り番地がマップ３０４に登録されていると判断されたなら、ステップ４２８では、タイマ割込みのみかどうかが判断される。もしそうなら、ステップ４３０で、次回のタイマ割込みの時間へシミュレーション時間を更新してから、ステップ４２４に行く。換言すると、タイマ割込みは、シミュレーション時間に関与するので、普通の外部割込みとは別扱いである。
【００５６】
ステップ４２８で、タイマ割込みのみでないと判断されると、ステップ４３２に行き、そこで、制御プログラムは、シミュレーション・スレッドを停止させる。この際、各種のパラメータなど、必要な値が所定のメモリ領域に退避される。
【００５７】
シミュレーション・スレッドを停止させると、処理は、ステップ４３４で管理スレッドに渡される。ステップ４３６で、管理スレッドは、シミュレーション時間を更新し、ステップ４３８で、外部割込みが起こったかどうかを判断する。そして、もしそうでなければ、ステップ４３４に戻って、ここで説明を省略するさまざまな管理的な処理を行う。
【００５８】
ステップ４３８で、管理スレッドによって外部割込みが起こったと判断されると、ステップ４４０で、外部割込みフラグへの反映が行われ、すなわち、その外部割込みに関する外部割込みフラグが立てられる。
【００５９】
ステップ４４２では、外部割込みフラグが立てられたこと関連して、ステップ４３２で停止されていたシミュレーション・スレッドが再開される。すなわち、ステップ４４６で、退避されていたパラメータなどが復帰され、停止した場所から、シミュレーション・スレッドが再開される。次に、ステップ４２４に進み、ループ内の外部割込み処理の次の命令に戻る。そしてステップ４２６で、ＲＴＩライブラリは、終了となり、ステップ４１２の判断に戻る。
【００６０】
図５は、図４のフローチャートにおける、シミュレーション・スレッドの停止処理を説明する概要図である。
【００６１】
図５において、パワーオン・リセット５０２の後、ステップ５０４で、ゲストすなわち、シミュレーションされるもともとのコードの命令列から実行時間を推測して、シミュレーション時間が更新される、という処理が行われる。これは、図４のステップ４０６の処理と同じである。
【００６２】
ステップ５０６で外部割込みフラグが立っていた場合、外部割込みチェック処理から、外部割込み処理５０８が呼び出される。そこまでは、従来の処理と同じだが、本発明によれば、外部割込み処理５０８に、ＲＴＩ呼び出しのコード５１０が付加され、ＲＴＩライブラリ５１２が呼ばれる。このことは、図４では、ステップ４２０に対応する。
【００６３】
ＲＴＩライブラリ５１２は、外部割込み処理の戻り番地が、マップ３０４に登録されているかどうか確認し、もしそうなら、制御プログラムは、ステップ５０４及び５０６を含むループに関連する処理スレッドを停止する。そして、処理は、管理スレッド５１４に委ねられる。すると、この時点では、ステップ５０４が実行されず、すなわち、シミュレーション時間が更新されないので、管理スレッド５１４が代わりに、シミュレーション時間５１６を更新する。これは、図４のフローチャートでは、ステップ４３６に相当する。
【００６４】
図６は、図４のフローチャートにおける、シミュレーション・スレッドの再開処理を説明する概要図である。図６において、管理スレッド５１４は、外部割込みを監視している。そして、外部割込みが発生すると、管理スレッド５１４は、その外部割込みに対応する外部割込みフラグ６０２をセットし、ＲＴＩライブラリ５１２を呼び出す。ＲＴＩライブラリ５１２は、必要に応じてマップ３０４を参照し、停止されていたシミュレーション・スレッドの戻り番地を確認し、図示されているように、外部割込み５０６内にある外部割込み処理を呼び出した命令の次の命令に戻る。こうして、シミュレーション・スレッドが再開される。
【００６５】
図７は、図４のフローチャートにおける、タイマ割込み処理を説明する概要図である。図５で説明した場合と同様に、タイマ割込みの場合にも、外部割込み処理５０６から、ＲＴＩライブラリ５１２が呼び出される。しかし、図４のステップ４２８及び４３０から見て取れるように、タイマ割込み処理であると判別された場合は、シミュレーション・スレッドの停止処理４３２には行かず、ステップ４３０で、ＲＴＩライブラリ５１２が、図７に示す未来のタイマイベント７０２のエントリを参照して、次回のタイマ割込みの時間を取得し、その時間にシミュレーション時間を更新する。そしてＲＴＩライブラリ５１２は、外部割込み処理５０６内にある外部割込み処理を呼び出した命令の次の命令に戻る。この場合、シミュレーション・スレッドは停止されていないので、処理はそのまま進行する。
【００６６】
以上、本発明は、組込みシステムのシミュレーション・プログラムに関する特定の実施例について説明してきたが、本発明はこの特定の実施例のみに限定されるものではなく、また特定のプログラミング言語や処理環境に拘わらず、制御ループの中に外部割込みを含む任意のプログラムの制御に適用可能であることを、この分野の当業者なら理解するであろう。
【００６７】
さらに、上記説明の処理では、スレッド単位で、停止及び再開をコントロールしているが、プロセス単位など、任意の処理単位での制御に、本発明を適用可能である。
【図面の簡単な説明】
【００６８】
【図１】本発明を実施するためのハードウェア構成の概要ブロック図である。
【図２】ループ内の外部割込み処理の戻り番地を確認する処理のフローチャートである。
【図３】ループ内の外部割込み処理の戻り番地を確認する処理を説明する概要図である。
【図４】シミュレーション・スレッドの停止及び再開処理のフローチャートである。
【図５】シミュレーション・スレッドの停止処理を説明するための概要図である。
【図６】シミュレーション・スレッドの再開処理を説明するための概要図である。
【図７】タイマ割込み処理を説明するための概要図である。
【符号の説明】
【００６９】
１０４ａ、１０４ｂ、１０４ｃ、１０４ｄ・・・ＣＰＵ
１１６・・・ＨＤＤ
３０２・・・ソースコード
３０４・・・マップ
５１２・・・ＲＴＩライブラリ
【図１】
2010113619.tif 000003
【図２】
2010113619.tif 000004
【図３】
2010113619.tif 000005
【図４】
2010113619.tif 000006
【図５】
2010113619.tif 000007
【図６】
2010113619.tif 000008
【図７】
2010113619.tif 000009