(57)【要約】【課題】アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムにおいて、命令間に挿入される同期関数がシミュレーションのホスト計算機の実実行時間に及ぼす影響を低減する。【解決手段】このシミュレーションプログラム生成装置は、実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段と、アプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成する処理手段とを具備する。【選択図】図６
2008112243.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成装置であって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段と、
前記格納手段からアプリケーションプログラムを読み出し、読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成する処理手段と、
を具備するシミュレーションプログラム生成装置。
【請求項２】
前記関数が、フリーラン期間の残り時間が正の値でないときに、割込みの有無を判定して割込みが有る場合には割込み処理を実行するように前記ホストＣＰＵを制御し、その後に残りの処理と外部同期命令を実行するように前記ホストＣＰＵを制御する関数である、請求項１記載のシミュレーションプログラム生成装置。
【請求項３】
前記処理手段が、外部同期命令の実行に伴って同期関数が実行されるようにシミュレーションプログラムを生成し、前記同期関数が、前記タスクの処理を待機状態にするように前記ホストＣＰＵを制御し、設定された時間の経過後又はタスク起動要求があった場合に前記タスクの処理を起動するように前記ホストＣＰＵを制御する関数である、請求項１又は２記載のシミュレーションプログラム生成装置。
【請求項４】
アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成方法であって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段からアプリケーションプログラムを読み出すステップと、
読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成するステップと、
を具備するシミュレーションプログラム生成方法。
【請求項５】
アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成プログラムであって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段からアプリケーションプログラムを読み出す手順と、
読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成する手順を、
ＣＰＵに実行させるシミュレーションプログラム生成プログラム。
【請求項６】
アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムであって、
前記実ＣＰＵ上で動作可能なアプリケーションプログラムに含まれているタスクの外部同期命令を実行する手順と、
前記外部同期命令の実行が完了した後に、設定されたフリーラン期間において、内部処理命令とフリーラン期間の残り時間を求める関数とを交互に実行する手順と、
フリーラン期間の残り時間が正の値でないときに、割込みの有無を判定して割込みが有る場合には割込み処理を実行し、その後に外部同期命令を実行する手順を、
前記ホストＣＰＵに実行させるシミュレーションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、機器組込み用のアプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレータ（シミュレーションプログラム）に関し、さらに、そのようなシミュレーションプログラムを生成する装置及び方法及びプログラムに関する。
【背景技術】
【０００２】
従来より、機器組込み用のアプリケーションプログラムを開発する場合には、開発対象であるターゲットＣＰＵ（「実ＣＰＵ」ともいう）とシミュレーションを行うホストＣＰＵとが異なる種類のＣＰＵであるようなクロス開発環境において、実ＣＰＵの機能やタイミングを検証するためのシミュレーションを行う手法が用いられている。そのようなシミュレーションにおいて、実ＣＰＵと等価な処理を行うＩＳＳ（Instruction Set Simulator：命令セットシミュレータ）に、アプリケーションプログラムを読み込ませて処理を行う方法が知られている。
【０００３】
図１５は、ＩＳＳを用いて機器組込み用のアプリケーションプログラムを開発する方法を説明するための図である。組込みアプリケーションプログラムの開発においては、ホストＣＰＵが搭載された汎用コンピュータ上の組込みアプリケーション開発環境５００において、アプリケーションプログラムのソースコード５０１が作成され、実ＣＰＵ用のクロスコンパイラ５０２を用いてソースコード５０１をコンパイルすることにより、実ＣＰＵにおいて実行可能なアプリケーションプログラムのバイナリコードを含むバイナリ形式の実行ファイル５０３が生成される。
【０００４】
次に、ＩＳＳ５１０が、ホストＣＰＵに実ＣＰＵの動作をシミュレートさせることにより、実ＣＰＵの動作の検証が行われる。ＩＳＳ５１０の制御の下で、ホストＣＰＵは、実行ファイル５０３に含まれている命令を１つずつ読み取って、実ＣＰＵにおける命令コードのフェッチ５０４、デコード５０５、実行５０６のステージをシミュレートすることにより、アプリケーションプログラムを実行する。
【０００５】
ところで、ＩＳＳを用いるシミュレーションにおいては、ＩＳＳが、他のソフトウェアやハードウェア等の外部モジュールのシミュレーションモデルとイベント同期を確立しながら、協調動作を行い、シミュレーションを安定的に進行させて行く。ここで、ＩＳＳと外部モジュールとのイベント同期に着目する。
【０００６】
図１６は、ＩＳＳと外部モジュールとのイベント同期を示す図である。図１６において、ＩＳＳ６００には、複数のタスク６０１が含まれており、各タスク６０１には、複数の命令が含まれている。また、外部モジュール６１０は、ＩＳＳ以外のモジュールを表している。ＩＳＳ以外のモジュールとは、例えば、ハードウェアであっても良いし、ＳｙｓｔｅｍＣ言語等で記述されたシミュレーションカーネル（中核部分）であっても良い。なお、ＳｙｓｔｅｍＣ言語とは、Ｃ言語系のシステムレベル記述言語の１つであり、Ｃ＋＋言語の文法を守った上で、ハードウェアやシステムを記述するために必要な言語使用を拡張したものである。
【０００７】
ＩＳＳ６００は、命令単位毎に処理を実行して行くサイクルアキュレート型のシミュレーションプログラムである。図１６に示すように、従来、タスク６０１における命令間には、外部モジュール６１０との間でイベントの同期をとるために、処理進行中のタスク６０１を、一旦、待機状態に移行させる関数（以下、「同期関数」という）が挿入されている。同期関数としては、例えば、ＳｙｓｔｅｍＣ言語におけるＷａｉｔ関数が該当する。このような同期関数の機能により、モジュール間の同期が確立し、協調動作が可能となり、シミュレーションを安定的に行うことができる。
【０００８】
このように、タスク６０１において命令間毎に同期関数を挿入することにより、外部モジュール６１０からの予測できない割込み要求があった場合に、その時点で、処理進行中のタスク６０１を待機状態として、プログラムの暴走等を予防することができる。
【０００９】
しかしながら、必ずしも、同期関数が挿入されているタイミングにおいて、外部モジュール６１０からの割込み要求が常にあるとは限らない。割込み要求がない場合でも、同期関数は実行されるが、一般に、同期関数の実行に要する実時間（ホストＣＰＵが処理に要する実時間をいう。以降、ホスト計算機が実際の処理にかかる時間は、特に、実時間とする。）は、タスク６０１に含まれている個々の命令の実行に要する実時間よりもかなり大きいので、不要な同期関数の実行はホストＣＰＵが処理する時間を増大させる原因となってしまう。
【００１０】
一般に、ＩＳＳは、ＣＰＵ又はＤＳＰ（Digital Signal Processor：デジタルシグナルプロセッサ）の組込みアプリケーションプログラムを開発するためのエミュレーションツールとしての役割を有しており、ＩＳＳの動作の高速化は、アプリケーションプログラムの開発期間の短縮に大きな効果がある。従って、ＩＳＳによるアプリケーションプログラムのシミュレーションを高速化するために、様々な技術が開発されている。
【００１１】
下記の特許文献１には、キャッシュ解析の可能な抽象度を保った性能検証を、ＩＳＳを必要とせずに、単一の検証プラットフォームにより高速に行うことが可能なシミュレーション装置が開示されている。このシミュレーション装置は、検証処理を実行する検証実行プロセッサを備え、検証対象システムが有する検証対象プロセッサの機能をシミュレートするプロセッサモデルと、前記検証対象システムにおける前記検証対象プロセッサの周辺ハードウェアの機能をシミュレートするハードウェアモデルとを、前記検証実行プロセッサ上で動作させることにより、前記検証対象システムをシミュレートする。
【００１２】
このシミュレーション装置によれば、検証対象システムにおいてソフトウェア実装される機能を、検証実行プロセッサ上で動作するソフトウェアモデルによってシミュレートすることによって、ＩＳＳを用いずに済むので、高速な性能検証が可能となる。しかしながら、特許文献１には、シミュレーションプログラムにおいて命令間に挿入される同期関数がシミュレーション時間（ホストＣＰＵが処理にかかる実時間）に及ぼす影響を低減することに関しては、特に開示されていない。
【００１３】
また、特許文献２には、システム構成要素の種々の並列動作タイミングに対応して、ソフトウェアの総合的な論理検証を行うことができるシミュレータ装置が開示されている。このシミュレータ装置は、実ＣＰＵとは異なるホストＣＰＵ上で実ＣＰＵの命令実行過程を試行するためのＣＰＵシミュレーション装置と、当該命令実行過程と同期して並列動作するシステム構成要素とを有し、前記システム構成要素の並列動作タイミングを変更するための手段を備えている。
【００１４】
このシミュレータ装置によれば、周辺Ｉ／Ｏ装置等のシステム構成要素の動作タイミングを任意に変更することができるので、システム構成要素の種々の並列動作タイミングを網羅したソフトウェアの総合的な論理検証を行うことができる。しかしながら、特許文献２において、システム構成要素の並列動作タイミングを変更するための手段とはＩＳＳそのものを指しており、ＩＳＳにおいて命令間に挿入される同期関数がシミュレーション時間（ホストＣＰＵが処理にかかる実時間）に及ぼす影響を低減することに関しては、特に開示されていない。
【特許文献１】特開２００４−１３２２７号（第１−２頁、図１）
【特許文献２】特開２０００−２０３４８号（第１−２頁、図１）
【発明の開示】
【発明が解決しようとする課題】
【００１５】
そこで、上記の点に鑑み、本発明は、機器組込み用のアプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムにおいて、命令間に挿入される同期関数がシミュレーション時間（ホストＣＰＵが処理にかかる実時間）に及ぼす影響を低減することを目的とする。
【課題を解決するための手段】
【００１６】
上記課題を解決するため、本発明の１つの観点に係るシミュレーションプログラム生成装置は、アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成装置であって、実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段と、格納手段からアプリケーションプログラムを読み出し、読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成する処理手段とを具備する。
【００１７】
ここで、上記関数として、フリーラン期間の残り時間が正の値でないときに、割込みの有無を判定して割込みが有る場合には割込み処理を実行するようにホストＣＰＵを制御し、その後に外部同期命令を実行するようにホストＣＰＵを制御する関数を用いるようにしても良い。
【００１８】
また、処理手段が、外部同期命令の実行に伴って同期関数が実行されるようにシミュレーションプログラムを生成するようにしても良く、上記同期関数として、タスクの処理を待機状態にするようにホストＣＰＵを制御し、設定された時間の経過後又はタスク起動要求があった場合にタスクの処理を起動するようにホストＣＰＵを制御する関数を用いるようにしても良い。
【００１９】
本発明の１つの観点に係るシミュレーションプログラム生成方法は、アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成方法であって、実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段からアプリケーションプログラムを読み出すステップと、読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成するステップとを具備する。
【００２０】
本発明の１つの観点に係るシミュレーションプログラム生成プログラムは、アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムを生成するシミュレーションプログラム生成プログラムであって、実ＣＰＵ上で動作可能なアプリケーションプログラムを格納する格納手段からアプリケーションプログラムを読み出す手順と、読み出されたアプリケーションプログラムに含まれているタスクの内部処理命令と外部同期命令とに基づいて、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成する手順とをＣＰＵに実行させる。
【００２１】
本発明の１つの観点に係るシミュレーションプログラムは、アプリケーションプログラムの稼動環境における実ＣＰＵの命令実行過程のシミュレーションをホストＣＰＵに行わせるシミュレーションプログラムであって、実ＣＰＵ上で動作可能なアプリケーションプログラムに含まれているタスクの外部同期命令を実行する手順と、外部同期命令の実行が完了した後に、設定されたフリーラン期間において、内部処理命令とフリーラン期間の残り時間を求める関数とを交互に実行する手順と、フリーラン期間の残り時間が正の値でないときに、割込みの有無を判定して割込みが有る場合には割込み処理を実行し、その後に外部同期命令を実行する手順とをホストＣＰＵに実行させる。
【発明の効果】
【００２２】
本発明によれば、命令実行時間を考慮して命令実行タイミングのスケジューリングを行うことにより、外部同期命令の実行が完了してから次に外部同期命令を実行するまでのフリーラン期間を定め、該フリーラン期間において内部処理命令とフリーラン期間の残り時間を求める関数とが交互に実行されるようにシミュレーションプログラムを生成するようにしたので、命令間に挿入される同期関数がシミュレーション時間に及ぼす影響を低減することができる。
【発明を実施するための最良の形態】
【００２３】
以下に、本発明を実施するための最良の形態について、図面を参照しながら詳しく説明する。なお、同一の構成要素には同一の参照番号を付して、説明を省略する。
図１は、本発明の一実施形態に係るシミュレーションプログラム生成装置の構成を示す図である。このシミュレーションプログラム生成装置１は、汎用のコンピュータ２と、外部入出力装置９とによって構成されている。コンピュータ２は、ホストＣＰＵとしてのＣＰＵ３と、ＲＯＭ４と、ＲＡＭ５と、ハードディスク６と、インタフェース（Ｉ／Ｆ）７とを有している。ＣＰＵ３、ＲＯＭ４等は、バス８を介して互いに接続されている。
【００２４】
ＣＰＵ３は、ＲＡＭ５又はハードディスク６に格納されたアプリケーションプログラムを読み出し、読み出されたアプリケーションプログラムに対して所定の処理を実行することにより、アプリケーションプログラムを実ＣＰＵで動作させたときの動きをシミュレートするためのシミュレーションプログラムを生成して、生成されたシミュレーションプログラムを再びＲＡＭ５又はハードディスク６に格納する。
【００２５】
外部入出力装置９は、インタフェース（Ｉ／Ｆ）７に接続されており、コンピュータ２に対する指示を行う入力装置としてのキーボードや、コンピュータ２の動作状況を表示する表示装置としてのディスプレイ等を含んでいる。シミュレーションプログラムの生成をＣＰＵ３に実行させるシミュレーションプログラム生成プログラムは、予め、ハードディスク６又はＲＡＭ５に格納されるようにしても良い。
【００２６】
シミュレーションプログラム生成装置１において、ＣＰＵ３が、バス８を介してハードディスク６又はＲＯＭ４に格納されたシミュレーションプログラム生成プログラムを読み出し、読み出されたシミュレーションプログラム生成プログラムを所定のオペレーティングシステムの下で実行することによって、シミュレーションプログラムを生成する。
【００２７】
図２は、本発明の一実施形態におけるプログラム開発手順を示す図である。
図２に示すように、このプログラム開発手順は、組込みアプリケーションプログラム開発環境１０と、シミュレーションプログラム生成環境１１と、ＳｙｓｔｅｍＣ言語を用いるシミュレーション環境１２とにおいて実施される。組込みアプリケーションプログラム開発環境１０において、ＡＮＳＩ−Ｃ言語で記述されたソースコード１３がクロスコンパイラ１４でコンパイルされることによって、機器に組み込まれる実ＣＰＵにおいて実行可能なアプリケーションプログラム実行ファイル１５が生成される。本実施形態においては、コンパイラ１４として、例えば、汎用ＣＰＵであるＣ３３ＰＥ用のコンパイラが使用される。なお、ＡＮＳＩ−Ｃ言語とは、ＡＮＳＩ（アメリカ規格協会）規格に準拠したＣ言語のことである。
【００２８】
組込みアプリケーションプログラム開発環境１０において生成されたアプリケーションプログラム実行ファイル１５に基づいて、シミュレーションプログラム生成環境１１において、ＡＮＳＩ−Ｃ言語で記述されたシミュレーションプログラムコード１６が生成される。シミュレーションプログラムコード１６は、シミュレーション環境１２において、ホストＣＰＵのコンパイラ１７によってコンパイルされて、ホストＣＰＵ上において実ＣＰＵの動作をシミュレートするためのシミュレーションプログラム実行ファイル１８が生成される。
【００２９】
図３は、本発明の一実施形態に係るシミュレーションプログラム生成装置の動作を示すフローチャートである。組込みアプリケーションプログラム開発環境において生成されたアプリケーションプログラム実行ファイルは、シミュレーションプログラム生成装置のＲＡＭ又はハードディスク等の格納部に格納されている。シミュレーションプログラム生成装置は、ステップＳ１０において、格納部からアプリケーションプログラム実行ファイルを読み出し、ステップＳ１１において、アプリケーションプログラム実行ファイルのバイナリコードを解析して所望の機能を追加し、ステップＳ１２において、ＡＮＳＩ−Ｃ言語で記述されたシミュレーションプログラムコードを生成する。
【００３０】
ステップＳ１１は、例えば、ステップＳ１０において読み込まれたアプリケーションプログラム実行ファイルの命令を解析し、命令コードを再構成することを含んでいる。ステップＳ１１において、冗長な命令を省略する等の命令コードの再構成を行うことにより、スリム化されたシミュレーションプログラムコードを生成することができる。
【００３１】
図４は、本実施形態におけるシミュレーション環境を示す図である。本実施形態において、生成されたシミュレーションプログラムコードは、ＳｙｓｔｅｍＣ言語の環境で実行される。図４に示すように、このシミュレーション環境においては、モジュールとして、シミュレーションプログラム３０と、ハードウェア３１と、シミュレーションカーネル３２とが存在する。本実施形態において、ハードウエア３１とシミュレーションカーネル３２は、ＳｙｓｔｅｍＣ言語で記述されている。
【００３２】
シミュレーションプログラム３０には、複数のスレッド（ソフトウェアの実行単位）が存在するが、タスク単位のスレッド制御が行われるので、以下においてはスレッドのことをタスクと称する。モジュール間又はタスク間における矢印は、イベントの送受信を表している。例えば、シミュレーションプログラム３０の割込みインタフェースタスク３７は、シミュレーションプログラム３０におけるその他のタスクを制御する。
【００３３】
タスクには、実行状態と、待機状態と、割込み状態との３種類の状態が存在し、最初に、全てのタスクが待機状態になっているものとする。図４において、タスク３３が実行される場合には、割込みインタフェースタスク３７が、タスク３３に対してイベントを送信し、タスク３３を起動する。タスク３３はイベントを受信すると、待機状態から実行状態に移行する。タスク３３が実行を終了した場合には、タスク３３は、割込みインタフェースタスク３７にイベントを送信し、タスク３３の終了を通知する。この時、タスク３３は、実行状態から待機状態に移行する。
【００３４】
タスク３３から終了通知を受信した割込みインタフェースタスク３７は、タスク３３の次に優先順位が高いタスク３４を起動する。タスク３４の起動は、タスク３３の場合と同様に、タスク３４にイベントを送信することによって行う。
【００３５】
割込みインタフェースタスク３７は、タスクの優先順位に基づいて、それぞれのタスクを順次起動することによりタスク管理を行っている。また、シミュレーションカーネル３２からシミュレーションプログラム３０に割込み要求があった場合にも、割込みインタフェースタスク３７が、割込み要求イベントを受信し、例えば、待機状態の割込み処理タスク３５にイベントを送信して起動させる。割込み処理タスク３５は、イベントを受信すると、待機状態から実行状態に移行して割込み処理を行う。
【００３６】
一般に、割込み処理タスクは通常のタスクより優先順位が高いので、通常のタスクの処理が進行中に、割込み処理タスクを実行することになる。通常のタスクの進行中に割込み処理タスクが実行される場合には、通常のタスクは、実行状態から、一旦、割込み状態に移行する。割込み処理タスクは、待機状態から実行状態に移行して、割込み処理が行われる。割込み処理が終了すると、通常のタスクは、割込み状態から実行状態に移行して処理を再開する。
【００３７】
再び図２を参照すると、シミュレーションプログラム生成環境１１において生成されたシミュレーションプログラムコード１６は、ホストＣＰＵにおいて使用できる命令群（命令セット）によって構成されている。従来のＩＳＳにおいては、外部モジュールとの間で同期を確立するために、命令と命令との間にＳｙｓｔｅｍＣ言語のＷａｉｔ関数が挿入されていた。
【００３８】
ＳｙｓｔｅｍＣ言語のＷａｉｔ関数は、システム全体の同期をとる機能を有し、処理を進行するために必要な入力を得るまで該当タスクを待機状態とする関数である。命令と命令との間にＷａｉｔ関数が挿入されていることにより、他のモジュールからの割込み要求イベントを受信した場合に、該当するタスクがＷａｉｔ関数を実行することにより、ＩＳＳは、外部モジュール（ソフトウェアやハードウェア等の他のモジュール）との同期をとることができるので、シミュレーションが安定的に実行される。
【００３９】
しかしながら、各タスクの命令間に挿入されたＷａｉｔ関数のタイミングにおいて、必ずしも、外部モジュールからの予測できない要求（割込み等）が常にあるとは限らないので、Ｗａｉｔ関数は、外部モジュールからの要求に対して利用されるとは限らない。しかしながら、その場合においても、Ｗａｉｔ関数は実行され、タスクは待機状態に移行する。一般に、ＳｙｓｔｅｍＣ言語で使用されるＷａｉｔ関数は、ＡＮＳＩ−Ｃ言語で記述された命令の実行時間の１００倍程度にも達するので、Ｗａｉｔ関数を無駄に実行するための時間は、シミュレーション時間増大の大きな原因となる。
【００４０】
そこで、本実施形態においては、ＡＮＳＩ−Ｃ言語を用いて、新たにｔｅｓｔ＿ｓｙｎｃ関数が定義される。これにより、従来、ＩＳＳにおいて各タスクの内部処理命令間に挿入されていたＷａｉｔ関数を除去し、ｔｅｓｔ＿ｓｙｎｃ関数が挿入されたＡＮＳＩ−Ｃコードを新たなシミュレーションプログラムコードとして生成することが可能となる。
【００４１】
シミュレーションプログラムにおいて用いられる命令は、外部モジュールとの通信の有無を基準にすると、内部処理命令と外部同期命令とに大きく分けることができる。内部処理命令とは、例えばＡｄｄ命令等のように、シミュレーションプログラムのモジュール内部で処理され、外部モジュールとの同期通信を必要としない命令のことである。言い換えると、ＣＰＵ等のレジスタ間演算等が内部処理命令に相当する。一方、外部同期命令とは、外部モジュールとの間で、データの送受信を行なう入出力命令やメモリアクセス命令等が相当する。即ち、外部同期命令は、同期通信を行う命令のことであり、外部同期命令が実行される場合には、シミュレーションプログラムと外部モジュールとの間で同期をとることが必要となる。
【００４２】
従って、シミュレーションプログラムが外部同期命令を実行するときには、それと共にＷａｉｔ関数を実行することにより、処理進行中の該当タスクを待機状態として、外部モジュールからのイベント返信を待つ。外部同期命令としては、例えば、Ｗｒｉｔｅ命令や、Ｉｎｔ命令や、Ｈａｌｔ命令や、Ｒｅｔｉ命令等が該当する。
【００４３】
図５は、本実施形態においてスケジューリングされたタスクの命令構成を示す図である。本実施形態に係るシミュレーションプログラムの内部においては、内部処理命令をスケジューリングすることができるので、そのスケジューリングに基づいて、シミュレーションプログラムから外部モジュールに外部同期命令を送信するタイミングを予測することができる。
【００４４】
例えば、図５において、ポイントＡからポイントＢまでの処理時間が予測可能である。従って、ポイントＡからポイントＢまでの期間においては、割込みがない場合に、外部同期命令が実行されないので、タスクの命令間にＷａｉｔ関数を挿入する必要はないと判断できる。即ち、従来においては命令間に挿入されていたＷａｉｔ関数を除去することができる。ここで、タスクの命令間にＷａｉｔ関数が挿入されていない期間を「フリーラン期間」と定義する。本実施形態において、フリーラン期間中、内部処理命令の後にセットで、ｔｅｓｔ＿ｓｙｎｃ関数が挿入される。
【００４５】
図６は、ｔｅｓｔ＿ｓｙｎｃ関数が挿入されたタスクの命令構成を示す図である。本実施形態によれば、シミュレーションプログラム内部の内部処理命令のスケジューリングと、それぞれの内部処理命令の処理時間と、外部モジュールとイベント通信する外部同期命令のタイミングとに基づいて、タスクにおけるフリーラン期間を予測することができる。さらに、特定の内部処理命令から外部同期命令までのフリーラン期間も予測することができる。
【００４６】
例えば、図６に示すように、シミュレーションプログラム生成装置が、内部処理命令Ａの実行開始からｔｅｓｔ＿ｓｙｎｃ関数Ｄの実行終了までのフリーラン期間を「１０」（任意単位）であると予測した場合について説明する。ここで、スケジューリングされた内部処理命令Ａ〜Ｄについては、内部処理命令Ａの処理時間（シミュレーション上の仮想時間）が「１」、内部処理命令Ｂの処理時間（シミュレーション上の仮想時間）が「２」、内部処理命令Ｃの処理時間（シミュレーション上の仮想時間）が「３」、内部処理命令Ｄの処理時間（シミュレーション上の仮想時間）が「４」と予測されている。なお、ｔｅｓｔ＿ｓｙｎｃ関数の実行に要する時間は計算機上の実時間である。従って、ｔｅｓｔ＿ｓｙｎｃ関数の実行に要する時間は、前記シミュレーション上の仮想時間とは別であり区別される。
【００４７】
その場合に、ｔｅｓｔ＿ｓｙｎｃ関数Ａにおいて、内部処理命令Ａの実行終了後のフリーラン期間Ａは、フリーラン期間「１０」から内部処理命令Ａの処理時間「１」を減じた「９」となる（本願において、この減算を「タイムアップ時間の更新」という）。また、ｔｅｓｔ＿ｓｙｎｃ関数Ｂにおいて、内部処理命令Ｂの実行終了後のフリーラン期間Ｂは、フリーラン期間Ａの「９」から内部処理命令Ｂの処理時間「２」を減じた「７」となる。同様に、ｔｅｓｔ＿ｓｙｎｃ関数Ｃにおいて、フリーラン期間Ｃは、「７」から「３」を減じた「４」となる。
【００４８】
また、ｔｅｓｔ＿ｓｙｎｃ関数Ｄにおいて、フリーラン期間Ｄは、同様の計算によると、フリーラン期間Ｃの「４」から内部処理命令Ｄの処理時間「４」を減じた「０」となる。これは、フリーラン期間の終了を意味し、ｔｅｓｔ＿Ｓｙｎｃ関数Ｄにおいて、フリーラン期間は、「タイムアップ」と判断される。
【００４９】
このようにして、ｔｅｓｔ＿ｓｙｎｃ関数において、タイムアップ時間の更新の結果が「０」となった場合（一般的には、「０」以下の場合）に、フリーラン期間がタイムアップしたと判断される。また、フリーラン期間が「０」でない場合（一般的には、正の値の場合）には、フリーラン期間中であると判断される。
【００５０】
本発明は、不要なＷａｉｔ関数を除去し、ｔｅｓｔ＿ｓｙｎｃ関数を挿入することによって、命令のフリーラン実行を実現するものである。ここで、命令のフリーラン実行は、内部処理命令の後に挿入されているｔｅｓｔ＿ｓｙｎｃ関数がフリーラン期間の残り時間を計算することによって実現される。
【００５１】
図７は、ｔｅｓｔ＿ｓｙｎｃ関数の処理フローを示すフローチャートである。内部処理命令の実行の後でｔｅｓｔ＿ｓｙｎｃ関数が実行された場合に、ステップＳ２０において、ｔｅｓｔ＿ｓｙｎｃ関数によって、フリーラン期間のタイムアップ時間の更新が行われる。
【００５２】
次に、ステップＳ２１において、更新されたタイムアップ時間に基づいて、処理がフリーラン期間中であるか、又は、フリーラン期間がタイムアップになったかが判断される。ここで、フリーラン期間中であると判断されると、ｔｅｓｔ＿ｓｙｎｃ関数の実行は終了し、次の内部処理命令に移行する。
【００５３】
ステップＳ２１において、フリーラン期間がタイムアップした（即ち、フリーラン期間が終了した）と判断された場合には、処理がステップＳ２２に進む。ステップＳ２２においては、外部モジュールからの割込みの有無が判断される。外部モジュールからの割込みが無いと判断された場合には、処理がステップＳ２３に進み、ホストＣＰＵが、外部同期命令及びＷａｉｔ関数を実行して、ｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００５４】
また、ステップＳ２２において、外部モジュールからの割込みが有ると判断された場合には、ステップＳ２４において割込み処理が行われる。割込み処理が終了すると、処理がステップＳ２３に進み、ホストＣＰＵが、外部同期命令及びＷａｉｔ関数を実行して、ｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００５５】
図８に示すように、ステップＳ２２において外部モジュールからの割込みが有ると判断された場合に、ステップＳ３０において、割込みの優先順位を判断するようにしても良い。ステップＳ３０において、割込みの優先順位を判断し、当該タスクよりも割込みの優先順位が低い場合には、割込み処理をしないで処理をステップＳ２３に進め、外部同期命令及びＷａｉｔ関数を実行して、ｔｅｓｔ＿ｓｙｎｃ関数を終了する。一方、当該タスクよりも割込みの優先順位が高い場合には、処理をステップＳ２４に進め、割込み処理をした後、ステップＳ２３において、外部同期命令及びＷａｉｔ関数を実行して、ｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００５６】
外部モジュールは、シミュレーションプログラムからイベントを受信すると、受信したイベントに対応した一定の処理をした後に、シミュレーションプログラムに対してイベントを返信する。シミュレーションプログラムに基づいて動作するホストＣＰＵは、その一定の処理にかかる時間をあらかじめ予測し、その予測時間をＷａｉｔ関数に盛り込むことができる。Ｗａｉｔ関数は、タイマーで指定された予測時間だけ、当該タスク自身を待機状態にする。タイマーで指定された予測時間が経過すると、当該タスクは、待機状態から起動して実行状態に移行する。
【００５７】
当該タスクが起動すると、スケジューリングされた複数の内部処理命令の実行に要する期間をフリーラン期間として、それらの内部処理命令がフリーラン実行される。しかしながら、フリーラン期間において、外部モジュールから割込み要求を受信した場合には、受信した割込み要求に対して、シミュレーションプログラムにおいて割込み処理を実行しなければならない。そこで、本実施形態においては、Ｗａｉｔ関数の設定において、予測された時間（設定された時間）をタイマー指定する他に、タスク起動要求がされた場合には常に当該タスクを起動して実行状態に移行させる指定が可能となっている。
【００５８】
図９は、ｔｅｓｔ＿ｓｙｎｃ関数のプログラム例を示す図である。図９に示すプログラムにおいては、ｔｅｓｔ＿ｓｙｎｃ関数が、ｔｅｓｔ＿ｓｙｎｃ（  ）として定義されている。本プログラムの第５行において、フリーラン期間のタイムアップの更新を行うようにしている。
【００５９】
また、第８行のｉｆ文は、フリーラン期間がタイムアップしたか否かの判断を行っている。第８行のｉｆ文の条件は、フリーラン期間から内部処理命令の処理時間を減じた結果に基づいて、フリーラン期間の残り時間が正の値であるか否か、即ち、フリーラン期間がタイムアップしたか否かを判断している。即ち、図７のステップＳ２１における判断がなされる。第８行のｉｆ文において、フリーラン期間の残り時間が正の値である場合に、ホストＣＰＵは、処理がフリーラン期間中であると判断し、ｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００６０】
一方、第８行のｉｆ文において、フリーラン期間の残り時間が正の値でない場合、即ち、フリーラン期間がタイムアップした場合に、ホストＣＰＵは、第９行のｅｌｓｅ文以下を実行する。第１４行から第２２行までのｗｈｉｌｅ文において、割込みの優先順位が低い場合には、ホストＣＰＵが、ｗｈｉｌｅ文を終了し、第２８行のＷａｉｔ関数を実行してｔｅｓｔ＿ｓｙｎｃ関数を終了する。一方、割込みの優先順位が高い場合には、ホストＣＰＵが、割込み処理（第１９行のＶ＿ｖｅｃ＿０６関数）を実行した後、第２８行のＷａｉｔ関数を実行してｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００６１】
図１０Ａ〜図１０Ｃは、ｔｅｓｔ＿ｓｙｎｃ関数が内部処理命令間に挿入されたシミュレーションプログラムの一部の例を示す図である。図１０Ａ〜図１０Ｃに示す第１３３行〜第１９２行までの内で、第１３７行、第１４５行、第１５１行、第１５９行、第１６７行、第１７３行、第１７９行、及び、第１８７行に、ｔｅｓｔ＿ｓｙｎｃ関数が挿入されている。
【００６２】
また、第１３８行〜第１４４行、第１４６行〜第１５０行、第１５２行〜第１５８行、第１６０行〜第１６６行、第１６８行〜第１７２行、第１７４行〜第１７８行、及び、第１８０行〜第１８６行が、内部処理命令を表している。
【００６３】
ここで、第１６８行〜第１７２行は、内部処理命令の一例であるが、第１７０行のコメント欄のアセンブラ言語で記述された「ｌｄ．ｗ  ％ｒ３，０ｘ１６」が命令の内容を表している。即ち、第１６８行〜第１７２行の内部処理命令は、「ｒ３に０ｘ１６をロードせよ」というロード命令を表している。
【００６４】
このようなアセンブラコードを、シミュレーションプログラム生成装置が解釈した結果、第１７１行のｒｅｇ［３］＝０ｘ９６として、ＡＮＳＩ−Ｃコードが生成される。アセンブラ命令を静的に解析して、かつ、アセンブラコードを見かけ上、ＡＮＳＩ−Ｃコードとして実行させることによって、シミュレーションの高速化を図ることは、一般に知られている。
【００６５】
ｔｅｓｔ＿ｓｙｎｃ関数は、フリーラン期間と命令処理時間の引数を有する。例えば、第１６７行のｔｅｓｔ＿ｓｙｎｃ（１５，４）において、引数「１５」は外部同期命令までのフリーラン期間を表しており、引数「４」は、内部処理命令自身の処理に要するシミュレーション時間を表している。
【００６６】
ここで、第１６７行〜第１８７行の処理の流れを説明する。まず、第１６７行において、ｔｅｓｔ＿ｓｙｎｃ（１５，４）とあるが、これは、次の外部同期命令までのフリーラン期間が「１５」であることを意味している。即ち、シミュレーションプログラム生成装置が、内部処理命令をスケジューリングすることによって、シミュレーションプログラムが外部モジュールに外部同期命令を発信するタイミングを予測し、フリーラン期間を「１５」に設定したということである。
【００６７】
第１６７行のｔｅｓｔ＿ｓｙｎｃ（１５，４）の引数「４」は、第１６０行から第１６６行までの内部処理命令の処理時間を意味している。このｔｅｓｔ＿ｓｙｎｃ関数において、処理がフリーラン期間中であるか否かが判断される。フリーラン期間が「１５」であり、内部処理命令（１６０行〜１６６行）の処理時間が「４」であるから、フリーラン期間の残り時間は、「１５」と「４」の差である「１１」となる。即ち、現在の処理がフリーラン期間中であると判断され、次の内部処理命令（第１６８行〜第１７２行）が実行される。
【００６８】
また、第１６８行〜第１７２行の内部処理命令の処理時間は「３」である。よって、第１７３行のｔｅｓｔ＿ｓｙｎｃ関数において、フリーラン期間の引数は、前回の残り時間「１１」と、内部処理命令期間の「３」となる。第１７３行のｔｅｓｔ＿ｓｙｎｃ関数においては、「１１」と「３」の差である「８」に基づいて、現在の処理がフリーラン期間中であると判断され、次の内部処理命令（第１７４行〜第１７８行）が実行される。
【００６９】
また、第１７４行〜第１７８行の内部処理命令の処理時間は「３」である。よって、第１７９行のｔｅｓｔ＿ｓｙｎｃ関数において、フリーラン期間の引数は、前回の残り時間「８」と、内部処理命令期間の「３」となる。第１７９行のｔｅｓｔ＿ｓｙｎｃ関数においては、「８」と「３」の差である「５」に基づいて、現在の処理がフリーラン期間中であると判断され、次の内部処理命令（第１８０行〜第１８６行）が実行される。
【００７０】
また、第１８０行〜第１８６行の内部処理命令の処理時間は「５」である。よって、第１８７行のｔｅｓｔ＿ｓｙｎｃ関数において、フリーラン期間の引数は、前回の残り時間「５」と、内部処理命令期間の「５」となる。第１８７行のｔｅｓｔ＿ｓｙｎｃ関数においては、「５」と「５」の差である「０」に基づいて、フリーラン期間が終了したと判断される。
【００７１】
ここで、図７の処理フローによると、外部モジュールからの割込みの有無が判断される。ホストＣＰＵは、割込みが無ければ、予測されたフリーラン期間経過後の外部同期命令及びＷａｉｔ関数を実行してｔｅｓｔ＿ｓｙｎｃ関数を終了し、割込みが有れば、割込み処理をした後、フリーラン期間経過後の外部同期命令及びＷａｉｔ関数を実行してｔｅｓｔ＿ｓｙｎｃ関数を終了する。
【００７２】
従来は、ＩＳＳの内部処理命令の実行毎に、Ｗａｉｔ関数を実行するようにしていた。即ち、図１０Ａ〜図１０Ｃに示すプログラム例で説明すると、ｔｅｓｔ＿ｓｙｎｃ関数の替わりにＷａｉｔ関数を実行することによって、外部モジュールからの割込み要求に対応していた。ＡＮＳＩ−Ｃ言語で記述された内部処理命令の計算機上の実処理時間は、およそ２０ナノ秒〜８０ナノ秒である一方、ＳｙｓｔｅｍＣ言語のＷａｉｔ関数の計算機上の実処理時間は、１０００ナノ秒程度である。従って、従来のＩＳＳにおけるように、Ｗａｉｔ関数を全ての内部処理命令の後に挿入することは、無駄なＷａｉｔ関数の計算機上の実実行時間を発生させることになり、シミュレーションの計算機上の実実行時間が大幅に増大する原因となる。
【００７３】
本実施形態においては、シミュレーションプログラムの命令セットにフリーラン期間という概念を持たせることにより、シミュレーション速度の高速化を実現している。また、ホストＣＰＵは、シミュレーションプログラムの該当タスクにおいて、外部モジュールに対して外部同期命令を実行すると、ＳｙｓｔｅｍＣ言語のＷａｉｔ関数を実行し、該当タスク自身を待機状態にして、以降の処理を実行させない。
【００７４】
図１１は、シミュレーションプログラムの実行におけるフリーラン期間について説明するための図である。図１１において、上段は、外部モジュールがシミュレーションプログラムに対して割込み要求をしなかった場合のタスクのフリーラン期間を表しており、下段は、外部モジュールがシミュレーションプログラムに対して割込み要求をした場合のタスクのフリーラン期間を表している。
【００７５】
また、Ａ点は、タスクがＷａｉｔ関数を実行したポイントを表している。Ａ点において、タスクが外部モジュールに対して外部同期命令を実行し、同時に、当該タスク自身の処理を待機状態にして、以降の処理を停止する。タスクは、予測された時間（ｔｉｍｅ）の経過後又はタスク起動要求（ｅｖｅｎｔ）があった場合に、当該タスクを待機状態から起動して実行状態に移行する。図１１において、点線矢印は、タスクの待機状態を表し、矢印は、タスクの実行状態を表している。Ｗａｉｔ関数は、Ｗａｉｔ（ｔｉｍｅ，ｅｖｅｎｔ）と表され、Ｗａｉｔ関数における引数ｔｉｍｅ及びｅｖｅｎｔは、予測された時間（ｔｉｍｅ）の経過後又はタスク起動要求（ｅｖｅｎｔ）のいずれかの指定があった場合に当該タスクを待機状態から起動するという内容を表している。
【００７６】
図１１の上段について説明する。タスクは、Ａ点においてＷａｉｔ関数を実行すると、点線矢印に示されるように、予測された時間（ｔｉｍｅ）が経過するまで、待機状態となる。予測された時間（ｔｉｍｅ）が経過するとＢ点においてタスクが起動して、矢印に表されるように、スケジューリングされた期間（フリーラン期間）経過後の同期通信の時点（Ｃ点）まで内部処理命令を実行する。Ｃ点において、タスクは、外部同期命令を実行する。ここで、予測された時間（ｔｉｍｅ）の経過後にタスクが起動してフリーラン実行する内部処理命令列の処理単位を、「同期までの実行単位」と呼ぶことにする。
【００７７】
図１１の下段について説明する。タスクは、Ａ点において、Ｗａｉｔ関数を実行する。上段と同様に、タスクは、Ａ点において、外部モジュールに対して外部同期命令を実行すると共に、タスク自身の処理を待機状態にして以降の処理を進行させない。外部モジュールは、シミュレーションプログラムからイベントを受信して所定の処理を開始するが、ある時点（割込み到達ポイントＤ点）において、シミュレーションプログラムに対して割込み要求を送信する。割り込み要求を受信したシミュレーションプログラムは、待機状態となっているタスクを起動する。
【００７８】
即ち、下段の場合において、タスクがＥ点において起動を開始してからフリーラン実行が可能であるのは、割込み到達ポイントＤ点までの処理に対応したものであるといえる。タスクが起動してから割込み到達ポイントＤ点までの期間を、「割込みまでの実行単位」とする。タスクが、Ｗａｉｔ関数実行後にタスク起動要求（ｅｖｅｎｔ）を受信した場合、タスクは、フリーラン期間を「同期までの実行単位」期間から「割込みまでの実行単位」期間に短縮する。シミュレーションプログラムにおいては、短縮された「割込みまでの実行単位」が、該当タスクでフリーラン実行され、割込み到達ポイントＦ点まで処理した後、外部モジュールからの割込み要求された割込み処理を行う。
【００７９】
このように、ＳｙｓｔｅｍＣ言語のＷａｉｔ関数におけるタスクの起動条件を、ｔｉｍｅ指定とｅｖｅｎｔ指定とのＯＲ条件とすることによって、フリーラン実行の動作を維持しつつ、外部モジュールからの割込み要求に対応することができる。
【００８０】
同期までの実行単位及び割り込みまでの実行単位は、内部処理命令を実行前に静的にスケジューリングすることによって決定される。しかしながら、例えば、バス調停によるストール等が発生した場合のように、静的にスケジューリングが行うことができない場合、即ち、動的にスケジューリングすることが必要な場合が考えられる。このような場合において、シミュレーションプログラムは、同期までの実行単位又は割り込みまでの実行単位を実行する前に、外部モジュールとの通信プロトコルマクロファイルを実行することにより外部モジュールからのイベント受信情報を得て、動的にスケジューリングを行うようにしてもよい。
【００８１】
ここで、シミュレーションプログラムは、命令セットをサイクルアキュレートに処理するソフトウェアであり、一方、ＳｙｓｔｅｍＣ言語は、イベント発生に応じて外部との同期をとりながらシミュレーションを行うソフトウェアである。このような異なる性質をもったモジュール間の同期通信手法として、本実施形態においては、ＣＳＰ理論として知られているランデブー同期を採用している。
【００８２】
本発明は、フリーラン期間を設定することによって不要なＷａｉｔ関数を除去できるようにするものであるが、異なる処理体系のソフトウェアが混在する環境においても、ランデブー同期の手法を取り入れることにより、シミュレーションプログラムのサイクルアキュレートな処理の手法を維持したまま、シミュレーションの高速化を実現することができる。
【００８３】
図１２は、本実施形態に係るシミュレーションプログラムの動作を説明するための図である。図１２の第１列は、モジュールの種別を表している。本実施形態において、存在するモジュールは、外部モジュールとシミュレーションプログラムモジュールとの２種類に大別される。
【００８４】
図１２の第２列は、タスクの種別を表している。動作の説明は外部モジュールのタスクの種別によらないので、外部モジュールについて、モジュール名とタスク名とは同じ名称であるとして説明する。シミュレーションプログラムモジュールは、タスクとして、割込みインタフェースタスクと、割込みタスクと、第１のタスクと、第２のタスクとを含んでいる。
【００８５】
図１２の第３列は、それぞれのタスクにおける処理の進行を表している。処理の進行は、左から右に向かって進み、ハッチングの部分は、タスクが実行状態であることを表している。それぞれのタスク間の矢印は、タスク間のイベントの送受信を表しており、また、矢印の向きが送受信の向きを表している。
【００８６】
ここで、タスクの進行図において示されている一重丸印は、ＳｙｓｔｅｍＣ言語の命令であるＷａｉｔ関数を表しており、二重丸印は、フリーランを実行するためのｔｅｓｔ＿ｓｙｎｃ関数を表している。
【００８７】
図１２において、矢印に付されている番号に従って、本実施形態に係るシミュレーションプログラムの動作について説明する。まず、割込みインタフェースタスクは、第１のタスクに対して起動要求イベントＥ１を送信し、第１のタスクを起動する。第１のタスクは、起動後、外部同期命令を実行して外部モジュールにイベントＥ２を送信すると共に、Ｗａｉｔ関数を実行する。第１のタスクは、Ｗａｉｔ関数の実行により、待機状態に移行する。
【００８８】
外部モジュールは、シミュレーションプログラム（第１のタスク）から受信したイベントＥ２に応答して所定の処理（割込みまでの実行単位）を実行する。ここでは、外部モジュールが、シミュレーションプログラムに対して割込み要求をする場合について説明する。外部モジュールは、割込みまでの実行単位を実行した時点で、シミュレーションプログラムに対して割込み要求イベントＥ３を送信する。
【００８９】
シミュレーションプログラムは、割込みインタフェースタスクにおいて、割込み要求イベントＥ３を受信する。割込みインタフェースタスクは、外部モジュールから割込み要求を受信した後、第１のタスクに対して起動要求イベントＥ４を送信し、第１のタスクを起動する。
【００９０】
第１のタスクは、実行状態に移行して、フリーラン期間のリスケジューリングを行い、リスケジューリングされたフリーラン期間において、割込みまでの実行単位を実行する（Ｅ５）。外部モジュールにおいて実行される「割込みまでの実行単位」と、第１のタスクにおいて実行される「割込みまでの実行単位」とを明確に規定することによって、シミュレーションプログラムと外部モジュールとの間で処理進行における同期をとることができる。
【００９１】
第１のタスクは、ｔｅｓｔ＿ｓｙｎｃＡ及びｔｅｓｔ＿ｓｙｎｃＢによってフリーラン期間のタイムアップを判断しながら、割込みまでの実行単位をフリーラン実行する。ｔｅｓｔ＿ｓｙｎｃＢが、フリーラン期間のタイムアップを認識すると、割込みインタフェースタスクに対してイベントＥ６を送信する。第１のタスクは、実行状態から、割込み状態に移行する。
【００９２】
割込みインタフェースタスクは、外部モジュールからの割込み要求に応じて割込み処理をするために、割込みタスクの起動を行う（Ｅ７）。割込みインタフェースタスクは、割込みタスクに対して起動要求イベントＥ８を送信し、割込みタスクを起動する。
【００９３】
割込みタスクは、実行状態に移行して、外部同期命令を実行して外部モジュールにイベントＥ９を送信すると共に、Ｗａｉｔ関数を実行する。割込みタスクは、Ｗａｉｔ関数の実行により、待機状態に移行する。
【００９４】
外部モジュールは、シミュレーションプログラム（割込みタスク）から受信したイベントＥ９に対して、外部モジュールにおいて所定の処理（同期までの実行単位）を行う。外部モジュールは、同期までの実行単位の実行後、シミュレーションプログラム（割込みタスク）にイベントＥ１０を返信する。
【００９５】
一方、待機状態にある割込みタスクは、割込みタスク自身が有するタイマーによって起動し、実行状態に移行する。このタイマーは、同期までの実行単位を予測した時間を計測する。割込みタスクは、スケジューリングされたフリーラン期間において、同期までの実行単位を実行する（Ｅ１１）。
【００９６】
割込みタスクは、ｔｅｓｔ＿ｓｙｎｃＣ及びｔｅｓｔ＿ｓｙｎｃＤによって、フリーラン期間のタイムアップを判断しながら、同期までの実行単位をフリーラン実行する。ｔｅｓｔ＿ｓｙｎｃＤが、フリーラン期間のタイムアップを認識すると、割込みインタフェースタスクに対してイベントＥ１２を送信する。
【００９７】
割込みインタフェースタスクは、外部モジュールからの割込み要求に対する割込み処理が終了したので、処理を第１のタスクに戻す（Ｅ１３）。割込みインタフェースタスクは、第１のタスクに対して起動要求イベントＥ１４を送信して第１のタスクを再起動する。
【００９８】
第１のタスクは、起動後、Ｗａｉｔ関数を実行することにより、外部同期命令を実行し、外部モジュールにイベントＥ１５を送信した後、待機状態に移行する。外部モジュールは、シミュレーションプログラム（第１のタスク）から受信したイベントＥ１５に応じて、所定の処理（同期までの実行単位）を行う。外部モジュールは、所定の処理の実行後、シミュレーションプログラム（第１のタスク）にイベントＥ１６を返信する。
【００９９】
一方、待機状態にある第１のタスクは、第１のタスク自身が有するタイマーによって起動し、実行状態に移行する。このタイマーは、外部モジュールにおける同期までの実行単位を予測した時間を計測する。第１のタスクは、スケジューリングされたフリーラン期間（同期までの実行単位）を実行する（Ｅ１７）。
【０１００】
第１のタスクは、ｔｅｓｔ＿ｓｙｎｃＥ及びｔｅｓｔ＿ｓｙｎｃＦによって、フリーラン期間のタイムアップを判断しながら、同期までの実行単位をフリーラン実行する。ｔｅｓｔ＿ｓｙｎｃＦが、フリーラン期間のタイムアップを認識すると、割込みインタフェースタスクに対して、タスク終了通知イベントＥ１８を送信する。
【０１０１】
割込みインタフェースタスクは、第１のタスクのタイムアップを検出して、第１のタスクの次に優先順位の高い第２のタスクに実行を移す（Ｅ１９）。割込みインタフェースタスクは、第２のタスクに対して起動要求イベントＥ２０を送信して第２のタスクを起動する。
【０１０２】
第２のタスクは、起動後、外部同期命令を実行して外部モジュールにイベントを送信すると共に、Ｗａｉｔ関数を実行する。第２のタスクは、待機状態に移行する。外部モジュールは、シミュレーションプログラム（第２のタスク）から受信したイベントに応じて、所定の処理（同期までの実行単位）を行う。外部モジュールは、同期までの実行単位の実行後、シミュレーションプログラム（第２のタスク）にイベントＥ２２を返信する。
【０１０３】
一方、待機状態にある第２のタスクは、第２のタスク自身が有するタイマーによって起動し、実行状態に移行する。このタイマーは、同期までの実行単位を予測した時間を計測する。第２のタスクは、スケジューリングされたフリーラン期間（同期までの実行単位）を実行する（Ｅ２３）。
【０１０４】
第２のタスクは、ｔｅｓｔ＿ｓｙｎｃＧ及びｔｅｓｔ＿ｓｙｎｃＨによって、フリーラン期間のタイムアップを判断しながら、同期までの実行単位をフリーラン実行する。ｔｅｓｔ＿ｓｙｎｃＨが、フリーラン期間のタイムアップを認識すると、割込みインタフェースタスクに対して、タスク終了通知イベントＥ２４を送信する。
【０１０５】
シミュレーションプログラムは、図１に示すシミュレーションプログラム生成装置によって生成されるが、シミュレーションプログラム生成環境において、シミュレーションプログラムを生成するために必要な要素として、コマンド作成用ファイル（ヘッダファイル）と、実ＣＰＵのデバイス環境ファイル（ｃｐｐファイル、ヘッダファイル）とが存在する。
【０１０６】
ここで、コマンド操作により、シミュレーションプログラム生成命令を実行すると、シミュレーションプログラム生成装置は、組込みアプリケーション開発環境において生成されたアプリケーションプログラム実行ファイル（ｓａファイル）を読み出し、シミュレーションプログラムコードを生成することにより、シミュレーションプログラムソースファイル（ｃｐｐファイル、ヘッダファイル）を生成する。
【０１０７】
シミュレーション環境において、シミュレーションプログラムソースファイルは、ＳｙｓｔｅｍＣ言語の周辺回路を記述しているファイルとマージされ、ＳｙｓｔｅｍＣ言語上でのシミュレーションプログラムの実行環境が構築され、コンパイルされることによって、シミュレーションプログラム実行ファイルが生成される。シミュレーションプログラム実行ファイルの生成や、シミュレーションプログラムの実行は、使用者によるコマンド操作によって行われる。
【０１０８】
図１３は、シミュレーションプログラムを実行可能なシミュレーション環境のモデルを示す図である。ＳｙｓｔｅｍＣ言語は、最上位階層のメイン関数ｓｃ＿ｍａｉｎ４００に、モジュールとして、ＴＢ＿ｓｏｕｒｃｅ４１０と、Ｓｓｉｓｓ＿ｉｓｓ４２０とが定義されている。Ｓｓｉｓｓ＿ｉｓｓ４２０は、プロセスとして、ＳＣ＿ＭＥＴＨＯＤ４２１と、ＳＣ＿ＴＨＲＥＡＤ４２２とを含んでいる。ＳＣ＿ＭＥＴＨＯＤ４２１やＳＣ＿ＴＨＲＥＡＤ４２２は、一般的に、ＳｙｓｔｅｍＣ言語に含まれるプロセスとして知られているものである。
【０１０９】
ＴＢ＿ｓｏｕｒｃｅ４１０は、本実施形態における外部モジュールに該当する。また、Ｓｓｉｓｓ＿ｉｓｓ４２０は、本実施形態におけるシミュレーションプログラムに該当する。本実施形態においては、ＳＣ＿ＭＥＴＨＯＤ４２１に、シミュレーションプログラムへの割込みを受信するスレッドとして、ｒｅｃｖ＿ｉｎｔ関数が定義されている。また、ＳＣ＿ＴＨＲＥＡＤ４２２に、割込みを実施するスレッドとして、Ｖ＿ｖｅｃ＿０１関数が定義されている。
【０１１０】
ＴＢ＿ｓｏｕｒｃｅ４１０のｔｂ＿ｒｅｓｅｔ関数又はｔｂ＿ｉｎｔ０関数等が実行されると、Ｓｓｉｓｓ＿ｉｓｓ４２０のｒｅｃｖ＿ｉｎｔ関数とイベントにより同期が確立される。ｒｅｃｖ＿ｉｎｔ関数は、割込み要求等を受信すると、必要に応じて、Ｖ＿ｖｅｃ＿０１関数等を実行する。
図１３において、ｔｅｓｔ＿ｓｙｎｃ（  ）、Ｖ＿ｖｅｃ＿０１（  ）〜Ｖ＿ｖｅｃ＿ｎｎ（  ）、Ｖ＿００Ｃ００２００（  ）、Ｖ＿００Ｃ００７７Ｅ（  ）は、Ｖ＿ｖｅｃ＿０１関数の実行によってリンクされる関数を表している。
【０１１１】
これらのプロセス、スレッド、リンクされる関数の他に、プロセス実行の上で初期化の機能を持つ一般的なイニシャライズ関数等を含むことにより、ＳｙｓｔｅｍＣ言語上でのシミュレーションプログラム実行環境が構成される。
【０１１２】
図１４は、本実施形態に係るシミュレーションプログラムの実行における効果を示す図である。図１４において、横軸は、シミュレーションプログラムの実施試験パターンを示しており、縦軸は、それぞれの実施試験における実行速度を示している。また、それぞれの実施試験パターンについて、外部モジュールとの外部同期の種類によって、次の４つのモードにおける試験を行った。
【０１１３】
フリーランモードは、シミュレーションプログラムにおいてＷａｉｔ関数を実行しない試験モードである。
ブロック単位モードは、シミュレーションプログラムのプログラム処理フローにおいて、処理が分岐する分岐ポイントと、分岐された処理が合流する合流ポイントと、関数を呼び出すコールポイントとにおいて、Ｗａｉｔ関数を実行する試験モードである。
【０１１４】
ライトモードとは、ブロック単位モードに加えて、外部モジュールへのＷｒｉｔｅ命令を実行するタイミングでＷａｉｔ関数を実行する試験モードである。
ライトリードモードは、ライトモードに加えて、外部モジュールへのＲｅａｄ命令のタイミングでＷａｉｔ関数を実行する試験モードである。
以上の４種類の試験モードの中では、ライトリードパターンが最もＷａｉｔ関数を実行する回数が多く、実際に使用されるシミュレーションプログラムに近い形態である。
【０１１５】
フリーランモードから、ブロック単位モード、ライトモード、ライトリードモードになるに従って、Ｗａｉｔ関数をシミュレーションプログラムに挿入する数が多くなるため、シミュレーションプログラムの実行速度は遅くなる。実施試験パターンにおいては、メモリアクセス等の内部処理命令の回数を変化させて、複数の実施試験パターンとしている。
【０１１６】
図１４に示すように、それぞれの実施試験パターンにおいて、フリーラン状態で、８ＭＩＰＳ（ミリオン・インストラクション・パー・セカンド）、最も実行速度が遅いライトリードモードについても、およそ０．５ＭＩＰＳ〜２ＭＩＰＳの速度を実現している。従来のＩＳＳでは、実使用状態で０．１ＭＩＰＳから０．５ＭＩＰＳ程度、フリーランに近い状態でも１ＭＩＰＳ程度であるので、本発明の効果が図１４によって明白となる。
【０１１７】
一般に、シミュレーションプログラムには、組込みアプリケーションプログラム等のエミュレーションソフトウェアという役割と、ＣＰＵやＤＳＰを開発する段階においてのハードウェアのリファレンスモデルとしての役割とを有している。本発明においては、前者のエミュレーションソフトウェアという役割を有している。エミュレーションソフトウェアは、アプリケーションプログラムのデバッグという観点から繰り返し使用されることが多い。本発明は、シミュレーションプログラムの高速化を実現することによって、アプリケーションプログラム開発の期間を短縮できるという効果を奏する。
【０１１８】
本実施形態においては、実ＣＰＵとしてＣ３３ＰＥを使用しているが、それ以外のＣＰＵを使用することもできる。例えば、Ｃ３３シリーズの他のバージョンや、ＡＲＭ７−ＴＤＭＩ等を使用することも可能である。
【図面の簡単な説明】
【０１１９】
【図１】本発明の一実施形態に係るシミュレーションプログラム生成装置を示す図。
【図２】本発明の一実施形態におけるプログラム開発手順を示す図。
【図３】本実施形態におけるシミュレーションプログラム生成装置の動作を示す図。
【図４】本実施形態におけるシミュレーション環境を示す図。
【図５】本実施形態においてスケジューリングされたタスクの命令構成を示す図。
【図６】ｔｅｓｔ＿ｓｙｎｃ関数が挿入されたタスクの命令構成を示す図。
【図７】ｔｅｓｔ＿ｓｙｎｃ関数の処理フローを示す図。
【図８】割込みの優先判断を含むｔｅｓｔ＿ｓｙｎｃ関数の処理フローを示す図。
【図９】ｔｅｓｔ＿ｓｙｎｃ関数のプログラム例を示す図。
【図１０Ａ】シミュレーションプログラムの一部の例を示す図。
【図１０Ｂ】シミュレーションプログラムの一部の例を示す図。
【図１０Ｃ】シミュレーションプログラムの一部の例を示す図。
【図１１】フリーラン期間について説明するための図。
【図１２】本実施形態に係るシミュレーションプログラムの動作を説明するための図。
【図１３】シミュレーションプログラムを実行可能なシミュレーション環境を示す図。
【図１４】本実施形態に係るシミュレーションプログラム実行における効果を示す図。
【図１５】ＩＳＳを用いて機器組込みプログラムを開発する方法を説明するための図。
【図１６】ＩＳＳと外部モジュールとのイベント同期を示す図。
【符号の説明】
【０１２０】
１  シミュレーションプログラム生成装置、  ２  汎用のコンピュータ、  ３  ＣＰＵ、  ４  ＲＯＭ、  ５  ＲＡＭ、  ６  ハードディスク、  ７  インタフェース、  ８  バス、  ９  外部入出力装置、  １０  組込みアプリケーションプログラム開発環境、  １１  シミュレーションプログラム生成環境、  １２  シミュレーション環境、  １３  ソースコード、  １４  クロスコンパイラ、  １５  アプリケーションプログラム実行ファイル、  １６  シミュレーションプログラムコード、  １７  コンパイラ、  １８  シミュレーションプログラム実行ファイル、  ３０  シミュレーションプログラム、  ３１  ハードウェア、  ３２  シミュレーションカーネル、  ３３、３４  スレッド（タスク）、  ３５、３６  割込み処理タスク、  ３７  スレッド（割込みインタフェースタスク）、  ４００  ｓｃ＿ｍａｉｎ、  ４１０  ＴＢ＿ｓｏｕｒｃｅ、  ４１１、４１２、４２２  ＳＣ＿ＴＨＲＥＡＤ、  ４２１  ＳＣ＿ＭＥＴＨＯＤ
【図１】
2008112243.tif 000003
【図２】
2008112243.tif 000004
【図３】
2008112243.tif 000005
【図４】
2008112243.tif 000006
【図５】
2008112243.tif 000007
【図６】
2008112243.tif 000008
【図７】
2008112243.tif 000009
【図８】
2008112243.tif 000010
【図９】
2008112243.tif 000011
【図１０Ａ】
2008112243.tif 000012
【図１０Ｂ】
2008112243.tif 000013
【図１０Ｃ】
2008112243.tif 000014
【図１１】
2008112243.tif 000015
【図１２】
2008112243.tif 000016
【図１３】
2008112243.tif 000017
【図１５】
2008112243.tif 000018
【図１６】
2008112243.tif 000019
【図１４】
2008112243.tif 000020