(57)【要約】【課題】ソフトウェアの処理に影響を与えずに、ソフトウェアの動作検証を効率的に行う。【解決手段】情報処理部１１は、ソフトウェア１４を実行する実行部１１ｂと、ソフトウェア１４の実行にあたって管理される時間情報を所定の更新間隔で更新する更新部１１ｃとを備える。動作検証装置１０は、情報処理部１１に対してソフトウェア１４の動作検証を行う。そのために動作検証装置１０は、判定部１２と変更部１３とを有する。判定部１２は、ソフトウェア１４のプログラム実行状態が所定のアイドル状態であるか否かを判定する。変更部１３は、判定部１２により所定のアイドル状態であると判定された場合、所定のアイドル状態ではない場合に比して時間情報の所定の更新間隔を短くする。【選択図】図１
2014085710.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアを実行する実行部と、前記ソフトウェアの実行にあたって管理される時間情報を所定の更新間隔で更新する更新部とを備える情報処理部に対して前記ソフトウェアの動作検証を行う動作検証装置であって、
前記ソフトウェアのプログラム実行状態が所定のアイドル状態であるか否かを判定する判定部と、
前記判定部により前記所定のアイドル状態であると判定された場合、前記所定のアイドル状態ではない場合に比して前記時間情報の前記所定の更新間隔を短くする変更部と、
を備える動作検証装置。
【請求項２】
前記変更部は、タイマ割込の周期を変更することで、前記時間情報の更新間隔を短くし、
前記更新部は、変更された前記周期のタイマ割込に基づいて前記時間情報を更新する、
請求項１記載の動作検証装置。
【請求項３】
前記情報処理部は、次に実行する命令の格納場所のアドレスを記憶するアドレス記憶部を有し、
前記実行部は、
前記アドレス記憶部に設定されたアドレスに基づいて命令をフェッチし、フェッチした後に次の実行命令のアドレスに更新し、
前記判定部は、
前記アドレス記憶部に設定されたことのあるアドレスが、前記アドレス記憶部に再度設定されると、再度設定されたアドレスに対応する命令の実行回数が所定回数以上となったか否かを判定して、該判定の結果に基づいて前記所定のアイドル状態であるか否かを判定する、
請求項１または２に記載の動作検証装置。
【請求項４】
前記判定部は、タイマ割込以外の割込が発生していない期間が所定期間以上になったか否かを判定し、該判定の結果に基づいて前記所定のアイドル状態であるか否かを判定する、
請求項１乃至３のいずれかに記載の動作検証装置。
【請求項５】
前記情報処理部は、次に実行する命令の格納場所のアドレスを記憶するアドレス記憶部を有し、
前記実行部は、
前記アドレス記憶部に設定されたアドレスに基づいて命令をフェッチし、フェッチした後に次の実行命令のアドレスに更新し、
前記判定部は、
前記アドレス記憶部に設定されたことのあるアドレスが、前記アドレス記憶部に再度設定されると、再度設定されたアドレスに対応する命令の実行回数が所定回数以上となったか否かを判定すると共に、タイマ割込以外の割込が発生していない期間が所定期間以上になったか否かを判定し、
該命令の実行回数が所定回数以上であり、かつタイマ割込以外の割込が発生していない期間が所定期間以上の場合、前記所定のアイドル状態であると判定する、
請求項１乃至４のいずれかに記載の動作検証装置。
【請求項６】
前記情報処理部は、次に実行する命令の格納場所のアドレスを記憶するアドレス記憶部を有し、
前記判定部は、
前記アドレス記憶部に設定されたアドレスに対応する命令の実行により発生するループ処理で繰り返し実行される命令の数をカウントし、繰り返し実行される命令の数が最大値となるループ処理を判定し、
前記アドレス記憶部に設定されたアドレスに対応する命令が、繰り返し実行される命令の数が最大値となるループ処理に含まれ、かつ該アドレスに対応する命令の実行回数が所定回数以上であり、かつタイマ割込以外の割込が発生していない期間が所定期間以上の場合に、前記所定のアイドル状態であると判定する、
請求項１乃至５のいずれかに記載の動作検証装置。
【請求項７】
前記判定部は、タイマ割込に応じた割込処理を実行中の命令については、再度設定されたアドレスに対応する命令の実行回数の判定の対象から除外する、
請求項３，５または６に記載の動作検証装置。
【請求項８】
前記変更部は、前記判定部により前記所定のアイドル状態ではないと判定された場合、前記所定のアイドル状態の場合に比して前記時間情報の前記所定の更新間隔を長くする、
請求項１乃至７のいずれかに記載の動作検証装置。
【請求項９】
前記情報処理部は、前記ソフトウェアが動作可能な環境を模倣するエミュレータである、
請求項１乃至８のいずれかに記載の動作検証装置。
【請求項１０】
ソフトウェアを実行する実行部と、前記ソフトウェアの実行にあたって管理される時間情報を所定の更新間隔で更新する更新部とを備える情報処理部に対して前記ソフトウェアの動作検証を行う動作検証装置が、
前記ソフトウェアのプログラム実行状態が所定のアイドル状態であるか否かを判定し、
前記所定のアイドル状態であると判定された場合、前記所定のアイドル状態ではない場合に比して前記時間情報の前記所定の更新間隔を短くする、
制御方法。
【請求項１１】
ソフトウェアを実行する実行部と、前記ソフトウェアの実行にあたって管理される時間情報を所定の更新間隔で更新する更新部とを備える情報処理部に対する前記ソフトウェアの動作検証を、コンピュータに実行させる動作検証プログラムであって、
前記コンピュータに、
前記ソフトウェアのプログラム実行状態が所定のアイドル状態であるか否かを判定し、
前記所定のアイドル状態であると判定された場合、前記所定のアイドル状態ではない場合に比して前記時間情報の前記所定の更新間隔を短くする、
処理を実行させる動作検証プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアの動作検証を行う動作検証装置、制御方法、および動作検証プログラムに関する。
【背景技術】
【０００２】
ソフトウェアの動作検証のために、そのソフトウェアの動作のシミュレーションが行われることがある。シミュレーションでは、様々な条件でソフトウェアを実行し、ソフトウェアが想定通りに動作するか否かが検証される。例えば、ソフトウェアを実行する装置に、様々な入力を行い、入力に応じた正しい動作が行われているかどうかが検証される。以下、このようなシミュレーション機能を備えた装置をシミュレータと呼ぶ。
【０００３】
ソフトウェアを実行させる装置が既に存在する場合、シミュレータは、その装置にソフトウェアを実行させて、動作検証を行う。一方、装置が開発途中であるなどの理由で、ソフトウェアを実行させる装置を準備できない場合がある。この場合、エミュレータが用いられる。エミュレータは、ソフトウェアを実行する装置の機能を、異なる装置で再現したものである。エミュレータにより、ソフトウェアを動作可能な環境が模倣される。エミュレータは、例えば、エミュレーション用のソフトウェアをコンピュータが実行することによって実現される。また、ＦＰＧＡ（Field Programmable Gate Array）などのハードウェアを用いてエミュレータを実現することもできる。エミュレータでは、例えば、ＣＰＵ（Central Processing Unit）、メモリなどのハードウェアの機能や、そのハードウェア上で動作するＯＳ（Operating System）の機能などが再現される。
【０００４】
シミュレータを用いてソフトウェアの動作検証を行う検証項目の中には、検証に長い時間を要するものがある。そこで、ソフトウェアの動作検証時間の短縮のため、様々な技術が考えられている。例えば、倍速値の内容に応じて加速または減速する基準時間信号を出力することができ、この基準時間信号を用いてアプリケーションプログラムの試験を行う技術が提案されている。また、動作中のプロセッサの周波数を変化させることにより、検証者が迅速かつ、効率の良い検証を行う技術が提案されている。さらに、周辺装置の状態を待ち条件とするループ部分を自動的に検出し、プログラム上の周辺装置の状態を、ループを抜ける状態に設定して、開発プログラムを先に進める技術が提案されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平７−３６７３８号公報
【特許文献２】特開２００３−１６２４２５号公報
【特許文献３】特開２０１０−２１８１４３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、動作検証の時間短縮のために、ソフトウェアの実行環境の処理速度を上げると、実行タイミングを考慮した処理が正常に動作しなくなる場合がある。例えば、ＨＤＤ（Hard Disk Drive）などのハードウェアからの応答を一定時間待つ処理を検証する場合が挙げられる。この場合、シミュレーション上のソフトウェアの実行環境の時間を、現実の時間より早く進めると、検証対象のソフトウェアが、ハードウェアから応答される前に一定時間経過したとみなし、予期せぬ動作をするおそれがある。このように、ソフトウェアの実行環境の処理速度を上げたことで、ソフトウェアの動作が変わったのでは、動作検証の精度が低下してしまう。そのため、現状では、動作検証の精度低下を避けるため、ソフトウェアの実行環境の処理速度を単純に上げることはできず、ソフトウェアの動作検証の時間を十分に短縮することができない。
【０００７】
本発明はこのような点に鑑みてなされたものであり、ソフトウェアの処理に影響を与えずに、ソフトウェアの動作検証を効率的に行うことができるソフトウェアの動作検証装置、制御方法、および動作検証プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
一側面では、ソフトウェアを実行する実行部と、ソフトウェアの実行にあたって管理される時間情報を所定の更新間隔で更新する更新部とを備える情報処理部に対してソフトウェアの動作検証を行う動作検証装置であって、ソフトウェアのプログラム実行状態が所定のアイドル状態であるか否かを判定する判定部と、判定部により所定のアイドル状態であると判定された場合、所定のアイドル状態ではない場合に比して時間情報の所定の更新間隔を短くする変更部と、を備える動作検証装置が提供される。
【発明の効果】
【０００９】
ソフトウェアの処理に影響を与えずに、ソフトウェアの動作検証を効率的に行うことができる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態の動作検証装置を示す図である。
【図２】第２の実施の形態のシミュレータのハードウェア例を示すブロック図である。
【図３】シミュレータの機能例を示すブロック図である。
【図４】ＣＰＵ処理の手順例を示すフローチャートである。
【図５】割込ハンドラ呼び出し処理の手順例を示すフローチャートである。
【図６】リターン命令実行処理の手順例を示すフローチャートである。
【図７】タイマデバイス処理の手順例を示すフローチャートである。
【図８】繰り返し状態を検出する例を示す図である。
【図９】繰り返し状態を検出する例を示す図（続き）である。
【図１０】繰り返し状態を検出する例を示す図（続き２）である。
【図１１】ＰＣパターン判定処理の手順例を示すフローチャートの前半である。
【図１２】ＰＣ値を判定する手順例を示すフローチャートの後半である。
【図１３】割込を判定する手順例を示すフローチャートである。
【図１４】検証時間の短縮効果を示す図である。
【発明を実施するための形態】
【００１１】
以下、本実施の形態を図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の動作検証装置を示す図である。動作検証装置１０は、情報処理部１１に対してソフトウェア１４の動作検証を行う。動作検証装置１０は、例えばコンピュータである。
【００１２】
検証対象のソフトウェア１４は、更新部１１ｃで更新される時間情報を利用して、処理の進行を制御する命令を含む。例えばソフトウェア１４には、タイマ割込を利用して処理の実行タイミングを制御する命令が含まれる。例えば、日時やタイムアウト監視に関係するソフトウェアが、検証対象のソフトウェア１４に相当する。検証対象のソフトウェア１４の例としては、ＯＳのカーネルやドライバがある。
【００１３】
このようなソフトウェア１４は、各種プログラムを実行する際に時間情報を参照する。この時間情報は、例えばソフトウェア１４の実行にあたって日時などの時間を管理する時間カウンタの値であり、ソフトウェア１４に対応付けられたメモリ空間上で管理される。また、この時間情報は、例えばタイマ割込に応じた割込処理により更新される。時間情報の更新により、ソフトウェア１４は時間の経過を認識することができる。
【００１４】
このようなソフトウェア１４の動作検証には、時間がかかるものがある。例えば、所定のアクセス要求に対してディスクドライブから一定時間内に応答がなされない場合にドライバは再度アクセス要求を行い、それでもディスクドライブから応答がなされない時にエラー処理を行う。所定時間以内に応答がないことは、例えば応答時間を計測する時間カウンタのオーバフローによって検出される。このような時間カウンタがオーバフローするときの動作検証を行う場合、時間カウンタがオーバフローするまで時間が経過するのを待つこととなり、検証に何時間もかかる場合がある。
また、例えば、曜日や時間帯によりエコモードに遷移し消費電力を抑えるようなソフトウェア１４の検証を行う場合がある。この場合、ソフトウェア１４を動作させてモードの切り替えが設定した時間に行われたかどうかを検証するのに数十時間から１週間かかっていた。
【００１５】
そこで、動作検証装置１０は、ソフトウェア１４の動作検証を効率よく実行するために、情報処理部１１、判定部１２、および変更部１３を有している。なお、情報処理部１１は、動作検証装置１０に外部接続されていてもよい。
【００１６】
情報処理部１１は、動作検証対象のソフトウェア１４を実行する。情報処理部１１は、ソフトウェア１４を実行するために、記憶部１１ａ、実行部１１ｂ、更新部１１ｃ、およびアドレス記憶部１１ｄを有する。
【００１７】
記憶部１１ａは、ソフトウェア１４を記憶する。記憶部１１ａは、単位記憶領域のごとにアドレスが割り振られている。そして記憶部１１ａは、指定されたアドレスに格納された情報（命令やデータ）を出力する。
【００１８】
実行部１１ｂは、記憶部１１ａに格納されたソフトウェア１４を実行する。実行部１１ｂは、例えば情報処理部１１が有するプロセッサである。プロセッサとしては、ＣＰＵやＤＳＰ（Digital Signal Processor）などがある。また実行部１１ｂには、アドレス記憶部１１ｄが接続されている。アドレス記憶部１１ｄは、次に実行する命令の格納場所のアドレスを記憶する。アドレス記憶部１１ｄは、例えばプログラムカウンタと呼ばれる。例えば実行部１１ｂは、ソフトウェア１４の実行開始時に、ソフトウェア１４の所定の命令の格納場所を示すアドレスをアドレス記憶部１１ｄに格納する。次に実行部１１ｂは、アドレス記憶部１１ｄに格納されたアドレスに対応する記憶部１１ａ内の記憶領域から、ソフトウェア１４内の命令を読み出す。このような命令の読み出し処理は、フェッチと呼ばれる。そして実行部１１ｂは、読み出した命令を実行する。１つの命令を実行すると、実行部１１ｂは、アドレス記憶部１１ｄの内容を、次に実行する命令のアドレスに更新する。その後、実行部１１ｂは、アドレス記憶部１１ｄを参照し、命令を順次フェッチし、フェッチした命令を実行する。このようにして、実行部１１ｂは、アドレス記憶部１１ｄのアドレスを更新しながら、ソフトウェア１４を実行する。
【００１９】
また、実行部１１ｂは、更新部１１ｃで更新される時間情報に基づいて、時間の進行を認識する。例えば実行部１１ｂは、ソフトウェア１４において、第１のイベントの発生から所定期間経過後に第２のイベントを発生するような命令があった場合、更新部１１ｃで更新される時間情報に基づいて、第１のイベントの発生からの経過時間を認識する。
【００２０】
更新部１１ｃは、ソフトウェア１４の実行にあたって管理される時間情報を、所定の更新間隔で更新する。例えば、更新部１１ｃは、変更部１３から指示された更新間隔で、時間情報を所定時間ずつ進める。時間情報の更新は、例えばタイマ割込を用いて行われる。タイマ割込を用いれば、割込処理により、時間情報の更新タイミングに少ない遅延で時間情報を更新できる。タイマ割込を利用する場合、更新部１１ｃは、変更部１３から指示された時間間隔でタイマ割込を発生させる。次に、更新部１１ｃはタイマ割込時の処理（タイマ割込ハンドラ）を実行する。タイマ割込ハンドラは、例えばタイマ割込がある度に、ソフトウェア１４の実行時に参照する時間情報を、所定時間ずつ進める処理である。更新部１１ｃが、時間情報を所定時間進めることで、実行部１１ｂで実行されているソフトウェア１４の処理上の時間が進められる。
【００２１】
判定部１２は、ソフトウェア１４のプログラム実行状態が所定のアイドル状態であるか否かを判定する。ここでアイドル状態とは、例えば定常的な処理を繰り返している状態である。スクリーンセーバの動作中やスリープ状態も、アイドル状態の一種である。
【００２２】
例えば判定部１２は、アドレス記憶部１１ｄに設定されたことのあるアドレスが、アドレス記憶部１１ｄに再度設定されると、再度設定されたアドレスに対応する命令の実行回数が所定回数以上となったか否かを判定する。このような判定を行うために、例えば判定部１２は、アドレスと、そのアドレスに対応する命令の実行回数とを示す実行回数情報１２ａを有する。判定部１２は、アドレス記憶部１１ｄにアドレスが設定されると、設定されたアドレスに対応する、実行回数情報１２ａ内の実行回数をカウントアップする。そして判定部１２は、カウントアップ後の実行回数が所定回数以上となったか否かを判定する。そして判定部１２は、命令の実行回数の判定の結果に基づいて、ソフトウェア１４のプログラム実行状態が所定のアイドル状態であるか否かを判定する。なお、アドレス記憶部１１ｄに設定されたことのあるアドレスが、アドレス記憶部１１ｄに再度設定される場合とは、例えばループ処理が実行されている場合である。すなわち、判定部１２による命令の実行回数の判定により、ループ処理のループ回数が判別されることとなる。
【００２３】
また判定部１２は、タイマ割込以外の割込が発生していない期間が所定期間以上になったか否かを判定し、この判定の結果に基づいて所定のアイドル状態であるか否かを判定することもできる。例えば判定部１２は、発生した割込の種別と、その割込の発生時刻とが登録された履歴情報１２ｂを有する。判定部１２は、履歴情報１２ｂを参照し、タイマ割込以外の割込が発生してから所定期間以上経過したか否かを判定できる。
【００２４】
判定部１２は、命令の実行回数の判定と、タイマ割込以外の割込が発生していない期間の判定とを組み合わせて、アイドル状態であるか否かを判定してもよい。例えば判定部１２は、アドレス記憶部１１ｄに設定されたアドレスで示される命令の実行回数が所定回数以上であり、かつタイマ割込以外の割込が発生していない期間が所定期間以上の場合に、所定のアイドル状態であると判定する。このとき、判定部１２は、アイドル状態の間でも、タイマ割込に応じた割込処理（タイマ割込ハンドラ）を実行中の命令については、再度設定されたアドレスに対応する命令の実行回数の判定の対象から除外することができる。これにより、アドレスに対応する命令の実行回数の判定処理の効率化が図れる。
【００２５】
さらに判定部１２は、命令の実行により発生するループ処理における、ループ処理内の命令数が最大となるループ処理内の命令がフェッチされた場合に、アイドル状態であると判定することもできる。例えば判定部１２は、アドレス記憶部１１ｄにアドレスが設定されるごとに、設定されたアドレスに対応する命令の実行により発生するループ処理で繰り返し実行される命令の数をカウントする。そして判定部１２は、繰り返し実行される命令の数が最大値となるループ処理を判定する。そして判定部１２は、次の３つの条件がすべて満たされたときに、所定のアイドル状態であると判定する。第１の条件は、アドレス記憶部１１ｄに設定されたアドレスに対応する命令が、繰り返し実行される命令の数が最大値となるループ処理に含まれることである。第２の条件は、アドレス記憶部１１ｄに設定されたアドレスに対応する命令の実行回数が所定回数以上であることである。第３の条件は、タイマ割込以外の割込が発生していない期間が所定期間以上であることである。
【００２６】
なお、判定部１２は、実行回数情報１２ａや履歴情報１２ｂを、記憶装置に格納する。その記憶装置は、ＲＡＭ（Random Access Memory）などの揮発性メモリでもよいし、ＨＤＤやフラッシュメモリなどの不揮発性記憶装置でもよい。
【００２７】
変更部１３は、判定部１２により所定のアイドル状態であると判定された場合、所定のアイドル状態ではない場合に比して時間情報の更新間隔を短くする。例えば変更部１３は、情報処理部１１の更新部１１ｃに対して、更新間隔の変更指示を送信する。例えば変更部１３は、タイマ割込周期の変更指示を更新部１１ｃに送信する。変更部１３がタイマ割込の周期の短縮の指示を更新部１１ｃに送信することで、時間情報の更新間隔を短くすることができる。また変更部１３は、判定部１２により所定のアイドル状態ではないと判定された場合、所定のアイドル状態の場合に比して時間情報の更新間隔を長くする。
【００２８】
このような動作検証装置１０によれば、情報処理部１１が検証対象のソフトウェア１４の実行中に、所定のアイドル状態になると、判定部１２において、アイドル状態になったと判定される。すると、変更部１３により、アイドル状態ではない場合に比して、時間情報の更新間隔が短くされる。時間情報の更新間隔が短くなると、実行部１１ｂによる、ソフトウェア１４の実行における時間の進行が速くなる。
【００２９】
このように第１の実施の形態では、実行部１１ｂがアイドル状態になると、時間の進行が速くなる。アイドル状態の間は、実行部１１ｂでは、例えば定常的な処理が繰り返されている。このような定常的な繰り返し処理中は、時間進行を早めても、ソフトウェアの処理には影響を与えずに済む。その結果、ソフトウェアの処理に影響を与えずに、ソフトウェアの動作検証を効率的に行うことができる。
【００３０】
以下、命令の実行回数の判定と、タイマ割込以外の割込が発生していない期間の判定とを組み合わせて、アイドル状態であるか否かを判定する場合を想定し、動作検証装置１０における処理を詳細に説明する。また、変更部１３は、タイマ割込の周期を変更することで時間情報の更新間隔を変更し、更新部１１ｃは、変更された周期のタイマ割込を発生させることで、時間情報を更新するものとする。アイドル状態ではないときのタイマ割込の周期を「２Ｔ」（Ｔは正の実数）とする。
【００３１】
ここで、実行部１１ｂがソフトウェア１４を実行中に処理がループ状態となり、ループ処理が所定回数以上繰り返されると、アドレス記憶部１１ｄには、同じアドレスが所定回数以上設定される。すると判定部１２により、アドレス記憶部１１ｄに設定された値に対応する命令の実行回数が所定回数以上になったと判定される。また実行部１１ｂがソフトウェア１４の実行中に、タイマ割込以外の割込が発生していない期間が所定期間以上継続すると、そのことが判定部１２で判定される。すると、判定部１２により、実行部１１ｂの状態が所定のアイドル状態になったと判定する。
【００３２】
実行部１１ｂがアイドル状態になると、変更部１３により、タイマ割込周期が、短く変更される。例えば、アイドル状態になる以前は、「２Ｔ」だったタイマ割込周期が、「Ｔ」に変更される。周期「Ｔ」は、それ以前の周期「２Ｔ」よりも短いため、検証対象のソフトウェア１４は、タイマ割込を利用した処理においてタイマ割込を待つ時間が短くなる。その結果、周期「Ｔ」に変更された期間について、時間が早く進んだように見せかけることができ、タイマ割込を周期「２Ｔ」のままで継続して処理を進行させた場合に比べ、ソフトウェア１４の処理時間を短縮することができる。
【００３３】
例えばソフトウェア１４の実行が時刻ｔ０に開始されたものとする。ここで実時間において、時刻ｔ０からＴ時間ごとの時刻を、ｔ１，ｔ２，・・・とする。
ソフトウェア１４の実行開始直後はアイドル状態ではないため、情報処理部１１の内部の時間情報も、実時間と同じ速度で進む。例えばタイマ割込の発生周期が２Ｔであれば、時間情報は、ｔ０の２Ｔ経過後にｔ２となり、さらに２Ｔ経過後にｔ４となる。
【００３４】
実時間がｔ４のときに更新間隔の変更が行われ、タイマ割込の周期が２ＴからＴに変更されると、以後、更新部１１ｃは、周期Ｔでタイマ割込を発生させる。一方、ソフトウェア１４では、タイマ割込が周期２Ｔで発生することを前提として時間を進行させるように、プログラムが組まれている。そのため、実時間ｔ５にタイマ割込が発生すると、実行部１１ｂでは、ソフトウェア１４の実行にあたって管理される時間情報を、ｔ４から２Ｔ経過後のｔ６に進める。以後同様に、実時間ｔ６には時間情報ｔ８となり、実時間ｔ７には時間情報ｔ１０となる。このように、アイドル状態の間は、ソフトウェア１４の実行にあたって管理される時間情報が実時間よりも速く進行することとなる。その結果、ソフトウェア１４の動作を検証する時間が短縮される。
【００３５】
しかも、動作検証対象のソフトウェア１４に何ら手を加えずに、そのソフトウェア１４が動作するハードウェア（シミュレータ）上の時間を早くして検証を効率化することができる。そのため、検証精度の低下が抑止される。
【００３６】
なお、情報処理部１１として、検証対象のソフトウェア１４を動作させる装置の機能を再現するエミュレータを用いてもよい。その場合、検証用のソフトウェア１４は、エミュレータ上で実行される。また、その場合、実行部１１ｂは、エミュレータにより再現される装置のプロセッサの機能となる。
【００３７】
なお、判定部１２において、ループ処理が複数検出される場合もある。その場合、判定部１２は、例えば、繰り返し実行される命令の数が最大値となるループ処理を判定する。このような場合、変更部１３は、繰り返し実行される命令の数が最大値となるループ処理中を、アイドル状態と判定することができる。これにより、繰り返し実行される命令の数が最大となるループ処理が実行されているときにタイマ割込の周期を短縮することができ、より多くの期間で処理の高速化を図ることができる。その結果、ソフトウェアの動作検証時間の短縮効果も向上する。
【００３８】
［第２の実施の形態］
次に、第２の実施の形態として、エミュレータを用いてソフトウェアの動作を検証するシミュレーションについて説明する。
【００３９】
図２は、第２の実施の形態のシミュレータのハードウェア例を示すブロック図である。シミュレータ１００は、ＣＰＵ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、ディスクドライブ１０６および通信インタフェース１０７を有する。上記の各ユニットは、シミュレータ１００が備えるバス１０８に接続されている。
【００４０】
ＣＰＵ１０１は、プログラムの命令を実行する演算器を含むプロセッサである。ＣＰＵ１０１は、ＨＤＤ１０３に記憶されているプログラムやデータの少なくとも一部をＲＡＭ１０２にロードし、プログラムを実行する。なお、ＣＰＵ１０１は複数のプロセッサコアを備えてもよく、シミュレータ１００は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列実行してもよい。
【００４１】
ＲＡＭ１０２は、ＣＰＵ１０１が実行するプログラムや計算に用いられるデータを一時的に記憶する揮発性メモリである。なお、シミュレータ１００は、ＲＡＭ以外の種類のメモリを備えてもよく、複数の揮発性メモリを備えてもよい。
【００４２】
ＨＤＤ１０３は、ＯＳやファームウェアやアプリケーションソフトウェアなどのソフトウェアのプログラムおよびデータを記憶する不揮発性の記憶装置である。なお、シミュレータ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【００４３】
画像信号処理部１０４は、ＣＰＵ１０１からの命令に従って、シミュレータ１００に接続されたディスプレイ２１に画像を出力する。ディスプレイ２１としては、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４４】
入力信号処理部１０５は、シミュレータ１００に接続された入力デバイス２２から入力信号を取得し、ＣＰＵ１０１に通知する。入力デバイス２２としては、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４５】
ディスクドライブ１０６は、記録媒体２３に記録されたプログラムやデータを読み取る駆動装置である。記録媒体２３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。ディスクドライブ１０６は、ＣＰＵ１０１からの命令に従って、記録媒体２３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００４６】
通信インタフェース１０７は、ネットワーク３０を介して他のコンピュータと通信を行うインタフェースである。通信インタフェース１０７は、有線網に接続する有線インタフェースでもよいし、無線網に接続する無線インタフェースでもよい。
【００４７】
ただし、シミュレータ１００は、ディスクドライブ１０６および通信インタフェース１０７を備えていなくてもよく、専ら他のコンピュータからアクセスされる場合には、画像信号処理部１０４や入力信号処理部１０５を備えていなくてもよい。
【００４８】
図３は、シミュレータの機能例を示すブロック図である。シミュレータ１００は、ソフトウェアの動作を検証する。シミュレータ１００は、シミュレーション制御部１１０、ソフトウェア３００およびエミュレータ２００を有する。
【００４９】
ソフトウェア３００は、仮想メモリ部２１０にロードされた検証対象のソフトウェアである。ソフトウェア３００は、プログラム３１０およびデータ３２０を有する。プログラム３１０は、仮想ＣＰＵ部２２０がソフトウェア３００を実行するための命令の集合である。データ３２０は、仮想ＣＰＵ部２２０がソフトウェア３００の実行時に参照するデータの集合である。
【００５０】
エミュレータ２００は、ソフトウェア３００が動作可能な環境を模倣する。例えばエミュレータ２００は、ソフトウェア３００を動作させる装置を再現するソフトウェアを、シミュレータ１００が実行することによって実現される。また、エミュレータ２００は、アイドル状態の判定機能を有効とするか無効とするかを指定できる。アイドル状態とは、ソフトウェア３００がループ処理の状態であり、かつ、エミュレータ２００においてタイマ割込以外の割込が発生していない状態である。アイドル状態の判定機能の有効・無効は、例えば、ユーザにより、エミュレータ２００の実行時にパラメータで指定される。アイドル状態の判定機能の有効・無効を示す情報は、エミュレータ２００の所定の記憶領域に記憶される。なお、アイドル状態の判定機能の有効・無効を示す情報は、予めエミュレータ２００の所定の記憶領域に記憶することで指定してもよい。エミュレータ２００は、仮想メモリ部２１０、仮想ＣＰＵ部２２０、アイドル状態判定部２３０、仮想割込コントローラ部２４０、仮想シリアルデバイス部２５０、仮想ＳＡＴＡ（Serial Advanced Technology Attachment）デバイス部２６０および仮想タイマデバイス部２７０を有する。
【００５１】
仮想メモリ部２１０は、ソフトウェア３００を動作させる装置のメモリの機能を再現する。仮想メモリ部２１０は、検証対象のソフトウェアを実行するために、ソフトウェア３００を一時的に記憶する。ソフトウェア３００は、一連の命令を記述されたプログラム３１０と、プログラム３１０中の命令の実行に用いられるデータ３２０とを含む。
【００５２】
仮想ＣＰＵ部２２０は、ソフトウェア３００を動作させる装置のＣＰＵの機能を再現する。仮想ＣＰＵ部２２０は、図示していないが、スタックレジスタなどのレジスタの機能を有する。以下、仮想ＣＰＵ部２２０が有するスタックの機能を仮想スタックレジスタと記載する。仮想ＣＰＵ部２２０は、仮想スタックレジスタを用いて、レジスタの値の退避などを行う。例えば仮想ＣＰＵ部２２０は、タイマ割込などの割込要求を受け取ると、そのときの仮想ＣＰＵ部２２０内の各レジスタの値を、メモリに退避する。そして仮想ＣＰＵ部２２０は、退避先のメモリのアドレスを、仮想スタックレジスタに設定する。次に仮想ＣＰＵ部２２０は、割込要求に応じた実行する処理に応じた値（仮想ＰＣ値を含む）を、仮想ＣＰＵ部２２０内のレジスタに設定し、仮想ＰＣ２２１に設定されたアドレスの命令からプログラムを実行する。
【００５３】
仮想ＣＰＵ部２２０は、仮想ＰＣ２２１、仮想ＣＰＵ処理部２２２、割込処理部２２３およびリターン処理部２２４を有する。
仮想ＰＣ２２１は、エミュレータ２００によって再現されたプログラムカウンタである。プログラムカウンタは、仮想ＣＰＵ処理部２２２が次に実行する命令のアドレスが設定されるレジスタである。アドレスは、仮想メモリ部２１０における記憶場所を特定する。
【００５４】
仮想ＣＰＵ処理部２２２は、エミュレータ２００によって再現されたＣＰＵである。仮想ＣＰＵ処理部２２２は、プログラム３１０（バイナリコード）を読み取り、アセンブラ命令を翻訳し、その命令に従った処理を実行する。仮想ＣＰＵ処理部２２２は、プログラム３１０の命令の実行後、更新した仮想ＰＣ２２１の値（以下、仮想ＰＣ値）を、ＰＣパターン判定部２３１に出力する。
【００５５】
なお、仮想ＣＰＵ処理部２２２は、タイマ割込に応じた処理の実行中については、仮想ＰＣ値の出力を行わない。これにより、命令の実行回数が所定回数以上となったか否かの判定では、タイマ割込に応じた割込処理を実行中の命令については、判定の対象から除外される。これは、タイマ割込に応じた処理の実行中の仮想ＰＣ値を用いたループ状態の判定処理を容易にするためである。すなわち第２の実施の形態では、アイドル状態中でもタイマ割込は許容される。そのため、ＰＣパターン判定部２３１では、例えばループ状態の間にタイマ割込が発生しても、ループ状態が継続していると判定することとなる。仮想ＣＰＵ処理部２２２からＰＣパターン判定部２３１に、タイマ割込処理中の仮想ＰＣ値を送信すると、ＰＣパターン判定部２３１では、タイマ割込処理中の仮想ＰＣ値なのか否かの判断が難しいことから、ループ処理の適切な判断が困難となる。他方、仮想ＣＰＵ処理部２２２が、タイマ割込に応じた処理実行中の仮想ＰＣ値を送信しなければ、ＰＣパターン判定部２３１では、タイマ割込の存在を考慮せずにループ処理中か否かを判定できる。その結果、ＰＣパターン判定部２３１における、ループ処理中なのか否かの判定が容易となる。
【００５６】
割込処理部２２３は、仮想割込コントローラ部２４０が出力した割込に関する情報を割込判定部２３３に送信する。また、割込処理部２２３は、タイマ割込時の処理を開始することを仮想ＣＰＵ処理部２２２に通知する。リターン処理部２２４は、仮想ＣＰＵ処理部２２２がリターン命令を実行するときに、仮想ＰＣ値を関数の呼び出される前の状態に戻す。リターン命令とは、割込処理などプログラム３１０に含まれる関数を終了させる命令である。また、リターン処理部２２４は、タイマ割込時の処理が終了したことを仮想ＣＰＵ処理部２２２に通知する。
【００５７】
アイドル状態判定部２３０は、実行中のソフトウェア３００がアイドル状態であるか判定する。アイドル状態判定部２３０は、ＰＣパターン判定部２３１、ＰＣ状態記憶部２３２、割込判定部２３３および割込履歴記憶部２３４を有する。
【００５８】
ＰＣパターン判定部２３１は、仮想ＣＰＵ処理部２２２から受信したＰＣ値と、ＰＣ状態記憶部２３２に記憶された情報とに基づいて、ソフトウェア３００がループ処理の状態であるかを判定する。ＰＣパターン判定部２３１は、ソフトウェア３００がループ処理の状態である場合、高速モードの状態となり、ソフトウェア３００がループ処理の状態でない場合、通常モードの状態となる。ＰＣパターン判定部２３１におけるモードの状態を示す情報は、ＰＣパターン判定部２３１が有する記憶領域の一部に保存される。ＰＣ状態記憶部２３２は、仮想ＣＰＵ処理部２２２が実行したＰＣ値に関する情報を記憶する。
【００５９】
割込判定部２３３は、割込処理部２２３から受信した割込の情報と、割込履歴記憶部２３４に記憶された割込の履歴情報に基づいて、タイマ割込以外の割込が発生していない状態か判定する。割込判定部２３３は、タイマ割込以外の割込が発生していない状態である場合、高速モードの状態となり、タイマ割込以外の割込が発生している状態の場合、通常モードの状態となる。割込判定部２３３におけるモードの状態を示す情報は、割込判定部２３３が有する記憶領域の一部に保存される。割込履歴記憶部２３４は、一定期間内における、エミュレータ２００が有するデバイスの機能（例えば、仮想シリアルデバイス部２５０）から発生した割込の履歴情報を記憶する。
【００６０】
仮想割込コントローラ部２４０は、ソフトウェア３００を動作させる装置の割込コントローラの機能を再現する。仮想割込コントローラ部２４０は、仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０および仮想タイマデバイス部２７０から発生した割込を受信し、仮想ＣＰＵ処理部２２２に適切なタイミングで送信する。
【００６１】
仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０、仮想タイマデバイス部２７０といった仮想デバイスは、エミュレータ２００によって再現されたデバイスである。仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０、仮想タイマデバイス部２７０は、それぞれ所定のハードウェアデバイスの機能を模倣した動作をする。これにより仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０、仮想タイマデバイス部２７０から仮想ＣＰＵ部２２０に対し、物理的なハードウェアデバイスが接続されている場合と同等の入出力を行うことができる。
【００６２】
仮想シリアルデバイス部２５０は、ソフトウェア３００を動作させる装置のシリアルデバイスの機能を再現する。仮想ＳＡＴＡデバイス部２６０は、ソフトウェア３００を動作させる装置とＳＡＴＡ仕様で接続されたＨＤＤの機能を再現する。仮想タイマデバイス部２７０は、ソフトウェア３００を動作させる装置のタイマの機能を再現する。仮想タイマデバイス部２７０は、周期的にタイマ割込を発生させる。タイマ割込が発生した場合、割込処理部２２３によりタイマ割込ハンドラが実行される。割込処理部２２３により実行されたタイマ割込ハンドラは、エミュレータ２００上の時間を進める。仮想タイマデバイス部２７０のタイマ割込の周期は、通常時において、実時間と同じ早さでエミュレータ２００上の時間が進むように設定される。仮想タイマデバイス部２７０は、ＰＣパターン判定部２３１および割込判定部２３３による判定結果を周期的に参照する。仮想タイマデバイス部２７０は、ＰＣパターン判定部２３１が高速モード、かつ、割込判定部２３３が高速モードの場合、ソフトウェア３００がアイドル状態と判定する。仮想タイマデバイス部２７０は、ソフトウェア３００がアイドル状態と判定した場合、エミュレータ２００におけるタイマ割込を通常時より短い周期（例えば、通常時の１／１００の周期）で発生させる。仮想タイマデバイス部２７０は、ソフトウェア３００がアイドル状態と判定しなかった場合、エミュレータ２００におけるタイマ割込を通常時の周期で発生させる。
【００６３】
なお、エミュレータ２００は、仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０および仮想タイマデバイス部２７０以外に、再現したデバイスの機能を有してもよい。その際、エミュレータ２００におけるデバイスから発生した割込は、仮想割込コントローラ部に送信される。
【００６４】
シミュレーション制御部１１０は、エミュレータ２００に対してソフトウェア３００の実行を指示し、ソフトウェア３００が正常に動作したか否かを検証する。例えばシミュレーション制御部１１０は、ソフトウェア３００を実行中のエミュレータ２００に対して、外部入力に相当する信号入力を行い、その信号入力に応じた処理の実行結果をエミュレータ２００から取得する。そしてシミュレーション制御部１１０は、取得した実行結果を検証し、入力信号に応じた処理が正しく実行されたか否かを判断する。また、シミュレーション制御部１１０は、ソフトウェア３００が正しく動作したかどうかの検証結果を、例えばシミュレータ１００のディスプレイ２１に出力する。
【００６５】
このような機能を有するシミュレータ１００によって、エミュレータ２００を用いたソフトウェア３００の動作シミュレーションが行われる。シミュレーション実行時には、エミュレータ２００によってソフトウェア３００が実行される。
【００６６】
次に、エミュレータ２００がソフトウェア３００を実行する処理手順について説明する。
図４は、ＣＰＵ処理の手順例を示すフローチャートである。
【００６７】
（ステップＳ１１）仮想ＣＰＵ処理部２２２は、エミュレータ２００において例外が発生しているか判定する。例外が発生している場合、処理をステップＳ１２へ進める。例外が発生していない場合、処理をステップＳ１３へ進める。
【００６８】
（ステップＳ１２）仮想ＣＰＵ処理部２２２は、エミュレータ２００における例外処理を実行する。
（ステップＳ１３）仮想ＣＰＵ処理部２２２は、仮想割込コントローラ部２４０から割込が発生しているか判定する。割込が発生している場合、処理をステップＳ１４へ進める。割込が発生していない場合、処理をステップＳ１５へ進める。
【００６９】
（ステップＳ１４）割込処理部２２３は、割込ハンドラ呼び出し処理を実行する。割込処理の詳細は後述する（図５参照）。なお、割込ハンドラとは、割込発生時に割込を実行する処理機能である。割込ハンドラは、割込の種類ごとに用意される。例えばタイマ割込に対応付けて、タイマ割込ハンドラが設けられる。
【００７０】
（ステップＳ１５）仮想ＣＰＵ処理部２２２は、仮想ＰＣ値を更新する。例えば仮想ＣＰＵ処理部２２２は、次の命令を順次実行する場合、現在の仮想ＰＣ値に所定の値を加算する。なお直前の命令が分岐命令の場合など、その命令によって指定された値に、仮想ＰＣ値を更新する。
【００７１】
（ステップＳ１６）仮想ＣＰＵ処理部２２２は、エミュレータ２００におけるアイドル状態の判定機能が有効であるか判定する。具体的には、仮想ＣＰＵ処理部２２２は、エミュレータ２００が有する記憶領域に記憶されたアイドル状態の判定機能の有無を示す情報に基づいて判定する。パラメータで指定されたアイドル状態の判定機能が有効の場合、処理をステップＳ１７へ進める。アイドル状態の判定機能が無効の場合、処理をステップＳ１９へ進める。
【００７２】
（ステップＳ１７）仮想ＣＰＵ処理部２２２は、タイマ割込ハンドラフラグがＯＦＦであるか判定する。タイマ割込ハンドラフラグは、エミュレータ２００においてタイマ割込ハンドラが実行中か否か示す。タイマ割込ハンドラフラグがＯＦＦの場合、処理をステップＳ１８へ進める。タイマ割込ハンドラフラグがＯＮである場合、処理をステップＳ１９へ進める。このようにタイマ割込ハンドラフラグのＯＮの間は、仮想ＰＣ値の送信処理をスキップさせることで、タイマ割込に応じた処理中の仮想ＰＣ値を、ＰＣパターン判定部２３１に送らずに済む。その結果、ＰＣパターン判定部２３１では、タイマ割込に応じた処理の存在を意識せずに、ＰＣ値によるループ状態の判定を行うことができる。
【００７３】
（ステップＳ１８）仮想ＣＰＵ処理部２２２は、ＰＣパターン判定部２３１へ更新後の仮想ＰＣ値を出力する。仮想ＰＣ値の出力は、例えば、ＰＣパターン判定部２３１が参照できる記憶領域に確保したバッファに仮想ＰＣ値を出力することで実現できる。この場合、出力先のＰＣパターン判定部２３１は、バッファから仮想ＰＣ値を確認する。
【００７４】
（ステップＳ１９）仮想ＣＰＵ処理部２２２は、仮想ＰＣ値を基に、エミュレータ２００で実行する命令を仮想メモリ部２１０からフェッチし、その命令をデコードする。
（ステップＳ２０）仮想ＣＰＵ処理部２２２は、デコードした命令を実行する。そして、処理をステップＳ１１へ進める。
【００７５】
このようにしてソフトウェア３００がエミュレータ２００で実行される。ソフトウェア３００の実行中に割込が発生すると、割込処理部２２３によって割込ハンドラ呼び出し処理が実行される。
【００７６】
図５は、割込ハンドラ呼び出し処理の手順例を示すフローチャートである。図５のフローチャートが示す処理は、上記のステップＳ１４において実行される。
（ステップＳ１４１）割込処理部２２３は、仮想割込コントローラ部２４０が出力した割込番号を確認する。
【００７７】
（ステップＳ１４２）割込処理部２２３は、エミュレータ２００におけるアイドル状態の判定機能が有効であるか判定する。例えば割込処理部２２３は、エミュレータ２００が有する記憶領域に記憶されたアイドル状態の判定機能の有効・無効を示す情報に基づいて判定する。アイドル状態の判定機能が有効の場合、処理をステップＳ１４３へ進める。アイドル状態の判定機能が無効の場合、処理をステップＳ１４７へ進める。
【００７８】
（ステップＳ１４３）割込処理部２２３は、ステップＳ１４１で確認した割込番号と、現在時刻を設定した割込発生時刻を割込判定部２３３へ出力する。この際、ステップＳ１８と同様、割込判定部２３３が参照できるバッファを用いてもよい。
【００７９】
（ステップＳ１４４）割込処理部２２３は、確認した割込番号がタイマ割込を示すかを判定する。割込番号がタイマ割込を示す場合、処理をステップＳ１４５へ進める。割込番号がタイマ割込以外の割込を示す場合、処理をステップＳ１４７へ進める。
【００８０】
（ステップＳ１４５）割込処理部２２３は、タイマ割込実行前の仮想スタックレジスタのポインタ（以下、仮想スタックポインタ）の値を記憶する。
（ステップＳ１４６）割込処理部２２３は、タイマ割込ハンドラフラグをＯＮに設定する。タイマ割込ハンドラフラグをＯＮにすることで、タイマ割込ハンドラ実行中であることを、仮想ＣＰＵ処理部２２２が認識できる。
【００８１】
（ステップＳ１４７）割込処理部２２３は、仮想ＣＰＵ部２２０における各レジスタの内容を仮想スタックレジスタにプッシュする。プッシュとは、後入れ先出し方式で管理される記憶領域（例えば、スタック）にデータを書き込み、追加することである。
【００８２】
（ステップＳ１４８）割込処理部２２３は、仮想ＰＣ値を、エミュレータ２００における、割込番号に対応した割込ハンドラ（例えば、タイマ割込ハンドラ）の実行アドレスに更新する。これにより、割込ハンドラが呼び出され、割込処理が仮想ＣＰＵ処理部２２２で実行される。
【００８３】
このように、割込ハンドラ呼び出し処理では、タイマ割込が発生したときに、タイマ割込ハンドラフラグがＯＮに設定することで、仮想ＣＰＵ処理部２２２にタイマ割込ハンドラ実行中であることが通知される。タイマ割込などの割込処理が終了すると、リターン命令が実行される。リターン命令とは、割込ハンドラなどの処理を終了させる命令である。
【００８４】
図６は、リターン命令実行処理の手順例を示すフローチャートである。
（ステップＳ２１）リターン処理部２２４は、仮想スタックレジスタからポップした内容を、仮想ＣＰＵ部２２０における各レジスタに設定する。ポップとは、後入れ先出し方式で管理される記憶領域（例えば、スタック）から最後にプッシュされたデータを読み出し、読み出したデータを削除することである。
【００８５】
（ステップＳ２２）リターン処理部２２４は、エミュレータ２００におけるアイドル状態の判定機能が有効であるか判定する。アイドル状態の判定機能が有効の場合、処理をステップＳ２３へ進める。アイドル状態の判定機能が無効の場合、処理を終了する。
【００８６】
（ステップＳ２３）リターン処理部２２４は、仮想スタックポインタの値がタイマ割込発生前の値であるか判定する。すなわち、リターン処理部２２４は、仮想スタックポインタの値がステップＳ１４５で設定した値であるか判定する。仮想スタックポインタの値がタイマ割込発生前の値である場合、処理をステップＳ２４へ進める。仮想スタックポインタの値がタイマ割込発生前の値でない場合、処理を終了する。
【００８７】
（ステップＳ２４）リターン処理部２２４は、タイマ割込ハンドラフラグをＯＦＦに設定する。タイマ割込ハンドラフラグをＯＦＦにすることで、タイマ割込ハンドラが実行中でないことを、仮想ＣＰＵ処理部２２２が認識できる。
【００８８】
このように、リターン時の処理では、タイマ割込ハンドラが終了したときに、タイマ割込ハンドラフラグをＯＦＦにすることで、仮想ＣＰＵ処理部２２２にタイマ割込ハンドラが実行中でないことを通知する。
【００８９】
図４〜図６に示したように、仮想ＣＰＵ部２２０による処理の実行内容は、割込の発生の有無によって変化する。割込は、仮想シリアルデバイス部２５０、仮想ＳＡＴＡデバイス部２６０、仮想タイマデバイス部２７０などが発生させる。各種の割込のうち、ソフトウェア３００の処理の実行タイミングの制御に用いられるタイマ割込は、仮想タイマデバイス部２７０によるタイマデバイス処理によって発行される。
【００９０】
図７は、タイマデバイス処理の手順例を示すフローチャートである。図７に示すタイマデバイス処理は、エミュレータ２００の起動時に開始される。
（ステップＳ３１）仮想タイマデバイス部２７０は、タイマ割込の周期を通常の周期に設定する。通常の周期とは、例えばエミュレータ２００による再現対象であるタイマデバイスの設計上規定された周期である。
【００９１】
（ステップＳ３２）仮想タイマデバイス部２７０は、エミュレータ２００におけるタイマ機能（タイマデバイスのエミュレーション）を開始する。
（ステップＳ３３）仮想タイマデバイス部２７０は、現在時刻に割込周期を加算し、次のタイマ割込発生時刻を算出する。タイマ割込発生時刻は、エミュレータ２００上の時刻ではなく、実際の時刻である。
【００９２】
（ステップＳ３４）仮想タイマデバイス部２７０は、エミュレータ２００における割込マスクの設定を参照することで、タイマ割込が有効か判定する。割込マスクとは、割込毎に、割込の発生を禁止することである。割込マスクは、割込の種別毎に設定できる。エミュレータ２００におけるタイマ割込が有効である場合、処理をステップＳ３５へ進める。エミュレータ２００におけるタイマ割込が無効である場合、処理をステップＳ３４へ進める。
【００９３】
（ステップＳ３５）仮想タイマデバイス部２７０は、現在時刻がタイマ割込発生時刻後であることを確認する。現在時刻がタイマ割込発生時刻後である場合、処理をステップＳ３６へ進める。現在時刻がタイマ割込発生時刻後でない場合、処理をステップＳ３４へ進める。
【００９４】
（ステップＳ３６）仮想タイマデバイス部２７０は、エミュレータ２００におけるタイマ割込を発生させる。
（ステップＳ３７）仮想タイマデバイス部２７０は、ＰＣパターン判定部２３１が高速モードの状態か判定する。具体的には、仮想タイマデバイス部２７０は、ＰＣパターン判定部２３１に記憶されたＰＣパターン判定部２３１におけるモードの状態を示す情報に基づいて高速モードの状態か判定する。ＰＣパターン判定部２３１が高速モードの状態の場合、処理をステップＳ３８へ進める。ＰＣパターン判定部２３１が高速モード以外の状態の場合、処理をステップＳ３９へ進める。
【００９５】
（ステップＳ３８）仮想タイマデバイス部２７０は、割込判定部２３３が高速モードの状態か判定する。具体的には、仮想タイマデバイス部２７０は、割込判定部２３３に記憶された割込判定部２３３におけるモードの状態を示す情報に基づいて高速モードの状態か判定する。割込判定部２３３が高速モードの状態の場合、処理をステップＳ４０へ進める。割込判定部２３３が高速モード以外の状態の場合、処理をステップＳ３９へ進める。
【００９６】
（ステップＳ３９）仮想タイマデバイス部２７０は、タイマ割込の周期を通常の周期に設定する。通常の周期とは、実時間と同じ早さでエミュレータ２００上の時間が進む周期である。
【００９７】
（ステップＳ４０）仮想タイマデバイス部２７０は、タイマ割込の周期を通常の周期÷規定値ｎに設定する。規定値ｎは、１より大きな実数である。規定値ｎは、エミュレータ２００に予め記憶されていてもよいし、ユーザにより変更可能なパラメータにしてもよい。
【００９８】
（ステップＳ４１）仮想タイマデバイス部２７０は、現時点の割込発生時刻に割込周期を加算した時刻をタイマ割込発生時刻に設定する。そして、処理をステップＳ３４へ進める。
【００９９】
このように、ＰＣパターン判定部２３１と割込判定部２３３とが共に高速モードになると、割込周期が通常の周期の１／規定値ｎの周期に変更される。またＰＣパターン判定部２３１と割込判定部２３３との少なくとも一方が通常モードになると、割込周期が通常の周期に変更される。
【０１００】
ＰＣパターン判定部２３１が高速モードになるのは、ループ処理を所定回数以上繰り返して実行しているときである。ループ処理が繰り返して実行されていることは、仮想ＰＣ値に基づいたＰＣパターン判定処理によって検出される。そこで、仮想ＰＣ値に対応する命令が、ループ処理を実行中である繰り返し状態に該当するか検出する方法について、以下に説明する。
【０１０１】
図８は、繰り返し状態を検出する例を示す図である。図８において、状態と経路（矢印）を用いて、繰り返し状態を説明する。
状態とは、仮想ＰＣ値に対応する命令実行後の状態である。状態番号は、状態を識別する番号である。初期状態において、状態番号には「＃１」が設定される。実行回数は、対応する状態に遷移した回数、すなわち、状態へ遷移する際に実行された仮想ＰＣ値に対応する命令の実行回数を示す。初期状態および状態の生成時において、実行回数には１が設定される。
【０１０２】
経路は、状態の遷移元と遷移先を結ぶ経路（矢印）である。経路に記載されている値は遷移条件である。遷移条件は、遷移先の状態に遷移するために実行される命令に対応する仮想ＰＣ値である。
【０１０３】
最長ループ幅は、経路のループ幅が最大となるときの値である。ループ幅とは、１回のループ処理で実行される命令の数である。例えば、＃２の状態から＃１の状態へ戻る経路の場合、ループ幅は１となる。ループ状態群は、最長ループ幅に対応する経路において、遷移元から遷移先までの状態の集合である。
【０１０４】
状態を示す状態情報、経路を示す経路情報、最長ループ幅を示す情報およびループ状態を示す情報は、ＰＣ状態記憶部２３２に記憶される。状態情報には、状態番号、実行回数および状態に対応する仮想ＰＣ値の項目を含む情報が登録される。経路情報には、遷移元の状態番号、遷移先の状態番号および遷移先の状態に対応する仮想ＰＣ値の項目を含む情報が登録される。
【０１０５】
図８において、ＰＣパターン判定部２３１が、初期状態から、仮想ＰＣ値＝０ｘ１０００＿００００に対応する命令を実行した場合について記載する。以後、状態を（状態番号、実行回数）で表し、経路を（遷移元の状態番号、遷移先の状態番号、状態に対応する仮想ＰＣ値）で表す。
【０１０６】
まず、初期状態において、（＃１，１）の状態が状態情報に登録されており、経路情報は登録されていない。また、最長ループ幅＝「なし」、ループ状態＝「なし」が設定されている。
【０１０７】
この状態で、エミュレータ２００が、仮想ＰＣ値＝０ｘ１０００＿００００に対応する命令を実行する。このとき、ＰＣパターン判定部２３１は、０ｘ１０００＿００００に対応する命令を実行した状態が存在しないため、新たに（＃２，１）の状態を生成する。ＰＣパターン判定部２３１は、生成した状態と状態に対応する仮想ＰＣ値を含む情報を状態情報に登録する。
【０１０８】
そして、（＃１，１）から（＃２，１）への経路が経路情報に存在しないため、ＰＣパターン判定部２３１は、（＃１，＃２，０ｘ１０００＿００００）の経路を生成し、経路情報に登録する。最長ループ幅、ループ状態については、この経路が順次命令によるもので、状態が戻っていないため、いずれも「なし」のままとなる。
【０１０９】
図９は、繰り返し状態を検出する例を示す図（続き）である。図９において、ＰＣパターン判定部２３１が、初期状態（＃１，１）から、５回の順次命令された状態で、繰り返し命令を実行した場合について記載する。
【０１１０】
まず、状態情報には、（＃１，１）、（＃２，１）、（＃３，１）、（＃４，１）、（＃５，１）、（＃６，１）の状態が、状態情報に登録されている。経路情報には、（＃１，＃２，０ｘ１０００＿００００）、（＃２，＃３，０ｘ１０００＿０００２）、（＃３，＃４，０ｘ１０００＿０００４）、（＃４，＃５，０ｘ１０００＿０００６）、（＃５，＃６，０ｘ１０００＿０００８）の経路が登録されている。最長ループ幅＝「なし」、ループ状態＝「なし」が設定されている。
【０１１１】
この状態で、エミュレータ２００が、仮想ＰＣ値＝０ｘ１０００＿０００４に対応する命令を実行する。この場合、仮想ＰＣ値＝０ｘ１０００＿０００４に対応する状態（＃４，１）が存在する。状態情報の（＃４，１）の状態を、実行回数をインクリメントして（＃４，２）に更新する。一方、ＰＣパターン判定部２３１は、＃６から＃４に遷移する経路がないため、（＃６，＃４，０ｘ１０００＿０００４）の経路を生成し、経路情報に登録する。そして、この経路は、繰り返し命令により＃６から＃４に遷移しており、＃４から＃６までのループ処理に含まれる命令の数は２である。したがって、最長ループ幅＝２、ループ状態＝＃４，＃５，＃６に更新される。
【０１１２】
図１０は、繰り返し状態を検出する例を示す図（続き２）である。図１０では、図８の状態から０ｘ１０００＿００００→０ｘ１０００＿０００２→０ｘ１０００＿０００４から０ｘ１０００＿０００ｃまでの命令を１０回ループ→０ｘ１０００＿０００ｅの順に対応する命令を実行された状態である。０ｘ１０００＿０００４から０ｘ１０００＿０００ｃまでの命令は、０ｘ１０００＿０００４→０ｘ１０００＿０００６と０ｘ１０００＿０００８の命令を２回ループ→０ｘ１０００＿０００ａ→０ｘ１０００＿０００ｃの順に実行される命令である。繰り返し命令による経路は、＃８から＃３への経路と、＃６から＃４への経路がある。このうち、ループ幅は、＃８から＃３への経路に含まれる命令の数の方が多いため、最長ループ幅＝５、ループ状態＝＃３，＃４，＃５，＃６，＃７，＃８となる。
【０１１３】
ＰＣパターン判定部２３１は、遷移後の状態がループ状態に含まれ、かつ、実行後の状態の実行回数が閾値以上である場合、プログラム３１０をループ状態と判定する。例えば、遷移後の状態が＃７で、閾値が１０の場合、＃７の実行回数は１０のため、ＰＣパターン判定部２３１は、プログラム３１０をループ状態と判定し、高速モードの状態となる。
【０１１４】
図８〜図１０に示したように、第２の実施の形態では、ループ処理が複数存在する場合、最長ループ幅となるループ処理が検出される。そして、最長ループ幅となるループ処理が所定回数以上繰り返されると、そのループ処理に含まれる命令が実行されている間は、ＰＣパターン判定部２３１が高速モードに設定される。以下、ＰＣパターン判定部２３１によるＰＣパターン判定処理について説明する。
【０１１５】
図１１は、ＰＣパターン判定処理の手順例を示すフローチャートの前半である。
（ステップＳ５１）ＰＣパターン判定部２３１は、仮想ＣＰＵ処理部２２２から出力された仮想ＰＣ値を確認する。
【０１１６】
（ステップＳ５２）ＰＣパターン判定部２３１は、確認した仮想ＰＣ値が一致する遷移先の状態をＰＣ状態記憶部２３２の状態情報から検索する。また、ＰＣパターン判定部２３１は、仮想ＰＣ値に対応する経路をＰＣ状態記憶部２３２の経路情報から検索する。
【０１１７】
（ステップＳ５３）ＰＣパターン判定部２３１は、遷移先の状態が状態情報に存在するか判定する。遷移先の状態が状態情報に存在する場合処理をステップＳ５７へ進める。遷移先の状態が状態情報に存在しない場合、処理をステップＳ５４へ進める。
【０１１８】
（ステップＳ５４）ＰＣパターン判定部２３１は、遷移先の状態を生成し、生成した遷移先の状態を状態情報に登録する。このとき、生成・登録した状態の実行回数に１を設定する。
【０１１９】
（ステップＳ５５）ＰＣパターン判定部２３１は、経路を生成し、生成した経路を経路情報に登録する。
（ステップＳ５６）ＰＣパターン判定部２３１は、生成した経路を経由し、生成した遷移先の状態へ遷移する。その後、処理をステップＳ７１（図１２参照）に進める。
【０１２０】
（ステップＳ５７）ＰＣパターン判定部２３１は、遷移先の経路が存在するか判定する。遷移先の経路が存在する場合、処理をステップＳ７２（図１２参照）へ進める。遷移先の経路が存在しない場合、処理をステップＳ５８へ進める。
【０１２１】
（ステップＳ５８）ＰＣパターン判定部２３１は、経路を生成し、生成した経路を経路情報に登録する。
（ステップＳ５９）ＰＣパターン判定部２３１は、仮想ＰＣ値に対応する命令が繰り返し命令の場合、ループ幅を算出する。
【０１２２】
（ステップＳ６０）ＰＣパターン判定部２３１は、算出したループ幅がＰＣ状態記憶部２３２に記憶された最長ループ幅より大きいか判定する。算出したループ幅がＰＣ状態記憶部２３２に記憶された最長ループ幅より大きい場合、処理をステップＳ６１へ進める。算出したループ幅がＰＣ状態記憶部２３２に記憶された最長ループ幅より小さい場合、処理をステップＳ６３へ進める。
【０１２３】
（ステップＳ６１）ＰＣパターン判定部２３１は、ＰＣ状態記憶部２３２に記憶された最長ループ幅を算出したループ幅に更新する。
（ステップＳ６２）ＰＣパターン判定部２３１は、ＰＣ状態記憶部２３２に記憶されたループ状態群を、遷移元から遷移先までに存在する状態の集合に更新する。
【０１２４】
（ステップＳ６３）ＰＣパターン判定部２３１は、生成した経路を経由し、遷移先の状態へ遷移する。
（ステップＳ６４）ＰＣパターン判定部２３１は、ＰＣ状態記憶部２３２に記憶された状態情報において、遷移先の状態の実行回数をインクリメントした値に更新する。その後、処理をステップＳ７１（図１２参照）に進める。
【０１２５】
図１２は、ＰＣ値を判定する手順例を示すフローチャートの後半である。
（ステップＳ７１）ＰＣパターン判定部２３１は、ＰＣパターン判定部２３１を通常モードの状態に設定する。ＰＣパターン判定部２３１の状態を示す情報は、エミュレータ２００が有する記憶領域に記憶する。
【０１２６】
（ステップＳ７２）ＰＣパターン判定部２３１は、経路を経由し、遷移先の状態へ遷移する。
（ステップＳ７３）ＰＣパターン判定部２３１は、ＰＣ状態記憶部２３２に記憶された状態情報の遷移先の状態の実行回数をインクリメントした値に更新する。
【０１２７】
（ステップＳ７４）ＰＣパターン判定部２３１は、遷移先の状態の状態番号がループ状態群に含まれているか判定する。遷移先の状態の状態番号がループ状態群に含まれている場合、処理をステップＳ７５へ進める。遷移先の状態の状態番号がループ状態群に含まれていない場合、処理をステップＳ７１へ進める。
【０１２８】
（ステップＳ７５）ＰＣパターン判定部２３１は、遷移先の状態の実行回数が閾値以上であるか判定する。遷移先の状態の実行回数が閾値以上の場合、処理をステップＳ７６へ進める。遷移先の状態の実行回数が閾値未満の場合、処理をステップＳ７１へ進める。
【０１２９】
（ステップＳ７６）ＰＣパターン判定部２３１は、ＰＣパターン判定部２３１を高速モードの状態に設定する。
このようにして、ループ処理の実行回数が所定の閾値以上となると、ＰＣパターン判定部２３１が高速モードとなる。また、ループ処理から抜けた場合、ステップＳ７４において、最長ループの遷移先がループ状態群に含まれないと判断され、ＰＣパターン判定部２３１が通常モードとなる。このように、第２の実施の形態では、仮想ＰＣ値を解析することで、ループ処理を検出することができる。そのため、プログラムコードを解析することによるループ処理の検出に比べ、ループ処理を確実に検出できる。またプログラム言語などに依存せずにループ処理を検出でき、汎用性が高い。
【０１３０】
次に、所定時間以内のタイマ割込以外の割込の有無を判定する処理について説明する。
図１３は、割込を判定する手順例を示すフローチャートである。この処理は、割込処理部２２３から割込判定部２３３へ、割込番号と割込発生時刻とが出力されたときに実行される。
【０１３１】
（ステップＳ８１）割込判定部２３３は、割込処理部２２３が出力した割込番号および割込発生時刻を確認する。割込発生時刻は、エミュレータ２００上の時刻ではなく、実時刻である。
【０１３２】
（ステップＳ８２）割込判定部２３３は、確認した割込番号および割込発生時刻を含む割込情報を、割込履歴記憶部２３４の割込履歴情報に登録する。
（ステップＳ８３）割込判定部２３３は、履歴情報にタイマ割込以外の割込が登録されているか判定する。履歴情報にタイマ割込以外の割込情報が登録されていれば、処理をステップＳ８４へ進める。履歴情報にタイマ割込以外の割込情報が登録されていなければ、処理をステップＳ８５へ進める。
【０１３３】
（ステップＳ８４）割込判定部２３３は、割込判定部２３３を通常モードの状態に設定する。割込判定部２３３の状態を示す情報は、エミュレータ２００が有する記憶領域に記憶する。
【０１３４】
（ステップＳ８５）割込判定部２３３は、割込判定部２３３を高速モードの状態に設定する。
（ステップＳ８６）割込判定部２３３は、割込発生時刻が現在時刻から所定の時間以上前である割込情報を割込履歴情報から削除する。
【０１３５】
このように第２の実施の形態では、発生した割込に関する割込情報が割込履歴情報に記録され、割込発生から所定の時間以上経過した割込情報が割込履歴情報から削除される。そのため割込履歴情報に、タイマ割込以外の割込情報があるか否かによって、所定時間内にタイマ割込以外の割込が発生したか否かを判断できる。そして所定時間内にタイマ割込以外の割込が発生していなければ、割込判定部２３３が高速モードに設定される。また所定時間内にタイマ割込以外の割込が発生すれば、割込判定部２３３が通常モードに設定される。
【０１３６】
以上説明したように、第２の実施の形態によれば、ソフトウェア３００実行時のループ処理の繰り返し回数が所定回数以上であり、かつ所定の期間にタイマ割込以外の割込が発生していない場合に、ソフトウェア３００がアイドル状態であると判定される。これにより、ソフトウェアの処理への影響が少ないアイドル状態を精度よく判別できる。そして、ソフトウェア３００がアイドル状態の場合のみ、通常の周期より短い周期でタイマ割込を発生させることで、ソフトウェア３００を動作させるハードウェア上の時間を早く進めることができる。これにより、検証の精度への影響をより少なくソフトウェア３００の検証時間を短縮できる。
【０１３７】
また、ソフトウェア３００の検証時間を短縮する機能を、ソフトウェア３００を動作させるエミュレータ２００により実現する。これにより、エミュレータ２００上で実行されるソフトウェア３００の検証においても、検証の精度への影響が少ない状態で、検証時間が短縮できる。
【０１３８】
図１４は、検証時間の短縮効果を示す図である。ｔｓは、ソフトウェア３００を動作させるエミュレータにおけるタイマの周期である。ｔは、ソフトウェア３００を動作させる予定の装置において、設計上規定されたタイマ割込の周期（通常の周期）である。すなわち、ソフトウェア３００は、装置から通常の周期でタイマ割込が発生することを前提に、プログラムが記述されている。
【０１３９】
図１４の上段には、第２の実施の形態の技術を適用せずに、タイマ割込周期ｔｓを通常の周期に固定した場合における、エミュレータ２００内部の時間進行と実時間の進行との比較例が示されている。タイマ割込周期ｔｓが通常の周期であれば、実時間がｔ進行するごとに、エミュレータ２００の内部時間もｔと同じｔｓだけ進行する。
【０１４０】
ここで、シミュレータ１００が、１秒間に１回カウントアップする１６ｂｉｔカウンタのオーバフロー時のエミュレータ２００の動作を検証する場合を想定する。この１６ｂｉｔカウンタは、例えば、あるイベントが発生してからの経過時間を示す時間情報を表すカウンタである。タイマ割込周期ｔｓを通常の周期に固定した場合、１６ｂｉｔカウンタがオーバフローするまで２16＝６５５３６秒≒１８時間かかる。すなわち、シミュレータ１００は、目的の動作検証に１８時間以上の時間を要する。
【０１４１】
一方、図１４の下段に、第２の実施の形態の技術を適用し、アイドル状態中のタイマ割込周期を短縮した場合における、エミュレータ２００内部の時間進行と実時間の進行との比較例が示されている。ここでは、エミュレータ２００はアイドル状態時のタイマ割込の周期を、通常の周期の１／１００にしている。この場合、エミュレータ２００は、アイドル状態において、ソフトウェア３００を動作させる装置と比べ１００倍の回数だけタイマ割込が発生する。すると、エミュレータ２００の内部時間が、実時間の１００倍の早さで進行する。
【０１４２】
ここで、エミュレータ２００が、１秒間に１回カウントアップする１６ｂｉｔカウンタのオーバフロー時の動作を検証する場合を想定する。タイマ割込周期ｔｓが通常の周期の１００倍になった場合、１６ｂｉｔカウンタがオーバフローするまで２16／１００≒６５５秒≒１０分の時間で済む。すなわち、動作検証時間が約１８時間から約１０分に短縮される。
【０１４３】
また第２の実施の形態では、エミュレータ２００でソフトウェア３００を実行し、ソフトウェア３００の動作検証を行っている。すなわち、仮想ＣＰＵ部２２０などのソフトウェア３００の実行環境自体が、ソフトウェアによって再現されたものである。そのため、仮想ＰＣ２２１の値や割込履歴の採取も、ソフトウェア的な処理で行うことができ、これらの情報の採取が容易である。その結果、アイドル状態か否かの判定も容易となる。
【０１４４】
なお、前述のように、第１の実施の形態の情報処理は、動作検証装置１０にプログラムを実行させることで実現でき、第２の実施の形態の情報処理は、シミュレータ１００にプログラムを実行させることで実現できる。このようなプログラムは、コンピュータ読み取り可能な記録媒体（例えば、記録媒体２３）に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、ＦＤおよびＨＤＤが含まれる。光ディスクには、ＣＤ、ＣＤ−Ｒ（Recordable）／ＲＷ（Rewritable）、ＤＶＤおよびＤＶＤ−Ｒ／ＲＷが含まれる。
【０１４５】
プログラムを流通させる場合、例えば、当該プログラムを記録した可搬記録媒体が提供される。また、プログラムを他のコンピュータの記憶装置に格納しておき、ネットワーク３０経由でプログラムを配布することもできる。コンピュータは、例えば、可搬記録媒体に記録されたプログラムまたは他のコンピュータから受信したプログラムを、記憶装置（例えば、ＨＤＤ１０３）に格納し、当該記憶装置からプログラムを読み込んで実行する。ただし、可搬記録媒体から読み込んだプログラムを直接実行してもよく、他のコンピュータからネットワーク３０を介して受信したプログラムを直接実行してもよい。また、上記の情報処理の少なくとも一部を、ＤＳＰ、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）等の電子回路で実現することも可能である。
【符号の説明】
【０１４６】
１０  動作検証装置
１１  情報処理部
１１ａ  記憶部
１１ｂ  実行部
１１ｃ  更新部
１１ｄ  アドレス記憶部
１２  判定部
１２ａ  実行回数情報
１２ｂ  履歴情報
１３  変更部
１４  ソフトウェア
【図１】
2014085710.tif 000003
【図２】
2014085710.tif 000004
【図３】
2014085710.tif 000005
【図４】
2014085710.tif 000006
【図５】
2014085710.tif 000007
【図６】
2014085710.tif 000008
【図７】
2014085710.tif 000009
【図８】
2014085710.tif 000010
【図９】
2014085710.tif 000011
【図１０】
2014085710.tif 000012
【図１１】
2014085710.tif 000013
【図１２】
2014085710.tif 000014
【図１３】
2014085710.tif 000015
【図１４】
2014085710.tif 000016