(57)【要約】【課題】マイクロコンピュータのＣＰＵが、外部のノイズ、電源電圧の不安定、他の原因でそのプログラムの実行が不能となり、いわゆる暴走などの致命的エラーを起こしても、極めて短時間でなるべくシステム全体の初期化をせずに、元の状態に復帰させることを目的とする。【解決手段】一又は二以上のソースコードをコンパイルして作成されたマシン語を分割することによって作成される第１及び第２のプログラムモジュールの実行の際に、第１のプログラムモジュールと第１のプログラムモジュールとの実行の間にＣＰＵをリセットする。ＣＰＵのエラーを検出したときは、ＲＡＭに保存した情報を用いて、ＣＰＵのレジスタが復元され、ＣＰＵは、エラー発生前の状態に復帰する。  これにより実行中の応用プログラムは、短時間で致命的エラーから復帰するため、あたかも致命的エラーが発生していないかのようにソフトウェア処理を継続することができる。【選択図】図２
2013109652.tif 000002
【特許請求の範囲】
【請求項１】
処理部と、
前記処理部とバスを介して接続されている書き換え可能な記憶装置であって、一又は二以上のソースコードをコンパイルしたマシン語を分割することによって作成される複数のプログラムモジュール、当該複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報、及び、制御ソフトウェアを動作時にロードする書き換え可能な記憶装置と、
前記処理部をリセットする処理部リセット手段と、
を備え、
前記制御ソフトウェアは、前記処理部に、
前記複数のプログラムモジュールにおける第１のプログラムモジュールを実行するステップと、
前記処理部のレジスタの情報を前記書き換え可能な記憶装置に保存するステップと、
を実行させるためのソフトウェアであって、
前記制御ソフトウェアは、前記処理部リセット手段が前記処理部をリセットした後、さらに、前記処理部に、
前記書き換え可能な記憶装置に保存されている前記レジスタの情報を前記処理部のレジスタに保存するステップと、
前記第１のプログラムモジュールの次に実行すべきと前記実行順序情報に定義されている第２のプログラムモジュールを実行するステップと、
を実行させるためのソフトウェアであることを特徴とする制御装置。
【請求項２】
前記処理部リセット手段は、前記処理部が前記複数のプログラムモジュールの１つを実行するために費やすことができる時間である実行単位時間より長い時間である所定の周期で前記処理部をリセットすることを特徴とする請求項１に記載の制御装置。
【請求項３】
前記制御ソフトウェアは、前記処理部に、
前記第１のプログラムモジュールの実行が前記実行単位時間内に終了しない場合、前記処理部リセット手段による前記処理部のリセットを停止するステップを実行させるためのソフトウェアであることを特徴とする請求項２に記載の制御装置。
【請求項４】
前記制御ソフトウェアは、前記第２のプログラムモジュールが実行され、前記処理部リセット手段によって前記処理部がリセットされた後、前記処理部に、
前記第２のプログラムモジュールが正常に終了したか否かを判定するステップと、
前記第２のプログラムモジュールが正常に終了しなかった場合、前記書き換え可能な記憶装置に保存されている前記レジスタの情報を前記処理部のレジスタに保存するステップと、
前記第２のプログラムモジュールを再度実行するステップと、
を実行させるためのソフトウェアであることを特徴とする請求項１乃至３のいずれか一つに記載の制御装置。
【請求項５】
前記書き換え可能な記憶装置は、さらに、
前記複数のプログラムモジュールそれぞれを実行する際に必要となるクロック数の推定値である推定実行クロック数を定義する推定実行クロック情報を動作時にロードし、
前記制御ソフトウェアは、前記処理部に、
前記第１のプログラムモジュールの推定実行クロック数と前記第２のプログラムモジュールの推定実行クロック数とを加えた値である加算クロック数と、前記実行単位クロック数とを比較するステップと、
前記加算クロック数が前記実行単位クロック数より小さい場合、前記第１のプログラムモジュールの終了後、前記処理部をリセットすることなく、前記第２のプログラムモジュールを実行するステップと、
を実行させるためのソフトウェアであることを特徴とする請求項１乃至４のいずれか一つに記載の制御装置。
【請求項６】
前記制御ソフトウェアは、前記処理部に、
前記処理部がリセットされる時間の間隔を変更するステップを実行させるためのソフトウェアであることを特徴とする請求項１乃至５のいずれか一つに記載の制御装置。
【請求項７】
前記マシン語は、前記マシン語における１又は２以上の命令グループに基づいて、分割されていることを特徴とする請求項１乃至６のいずれか一つに記載の制御装置。
【請求項８】
前記マシン語は、前記実行単位時間及び前記処理部のクロック周波数から計算される実行単位クロック数に基づいて、分割されていることを特徴とする請求項１乃至６のいずれか一つに記載の制御装置。
【請求項９】
前記マシン語は、前記実行単位時間及び前記処理部のクロック周波数から計算される実行単位クロック数と前記マシン語における１又は２以上の命令グループとに基づいて、分割されていることを特徴とする請求項１乃至６のいずれか一つに記載の制御装置。
【請求項１０】
前記制御装置は、マイクロコンピュータであることを特徴とする請求項１乃至９のいずれか一つに記載の制御装置。
【請求項１１】
前記マイクロコンピュータは、ワンチップ上で実装されることを特徴とする請求項１０に記載の制御装置。
【請求項１２】
前記処理部は、中央処理装置（ＣＰＵ）であることを特徴とする請求項１乃至１１のいずれか一つに記載の制御装置。
【請求項１３】
前記書き換え可能な記憶装置は、ＲＡＭであることを特徴とする請求項１乃至１２のいずれか一つに記載の制御装置。
【請求項１４】
前記制御ソフトウェアは、オペレーティングシステム（ＯＳ）であることを特徴とする請求項１乃至１３のいずれか一つに記載の制御装置。
【請求項１５】
前記書き換え可能な記憶装置は、複数の時点における前記処理部のレジスタの情報を保存することを特徴とする請求項１乃至１４のいずれか一つに記載の制御装置。
【請求項１６】
一又は二以上のソースコードをマシン語にコンパイルするステップと、
前記マシン語を実行するために必要なクロック数を計算するステップと、
前記マシン語における１又は２以上の命令グループを単位として前記マシン語を分割し、さらに、前記必要なクロック数が前記マシン語の１つのグループを実行するために費やすことができる時間である実行単位時間に基づく実行単位クロック数より小さい又は等しくなるよう前記マシン語を分割し、複数のプログラムモジュールを作成するステップと、
前記複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、
を含むことを特徴とするコンピュータプログラムのコンパイル方法。
【請求項１７】
前記マシン語を実行するコンピュータが有する処理部のクロック周波数と前記実行単位時間とに基づいて、前記実行単位クロック数を計算するステップをさらに含むことを特徴とする請求項１６に記載のコンパイル方法。
【請求項１８】
前記複数のプログラムモジュールそれぞれを実行する際に必要となるクロック数を推定し、各推定実行クロック数を定義する推定実行クロック情報を作成するステップをさらに有することを特徴とする請求項１６及び１７のいずれか一つに記載のコンパイル方法。
【請求項１９】
連続して実行される２以上のプログラムモジュールの推定実行クロック数の合計が、前記実行単位クロック数より小さい場合、当該２以上のプログラムモジュールを併合するステップをさらに有することを特徴とする請求項１８に記載のコンパイル方法。
【請求項２０】
一又は二以上のソースコードをマシン語にコンパイルするステップと、
前記マシン語を実行するために必要なクロック数を計算するステップと、
前記必要なクロック数が前記マシン語の１つのグループを実行するために費やすことができる時間である実行単位時間に基づく実行単位クロック数より小さい又は等しくなるよう前記マシン語を分割し、複数のプログラムモジュールを作成するステップと、
前記複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、
を含むことを特徴とするコンピュータプログラムのコンパイル方法。
【請求項２１】
前記マシン語を実行するコンピュータが有する処理部のクロック周波数と前記実行単位時間とに基づいて、実行単位クロック数を計算するステップをさらに含むことを特徴とする請求項２０に記載のコンパイル方法。
【請求項２２】
一又は二以上のソースコードをマシン語にコンパイルするステップと、
前記マシン語における１又は２以上の命令グループを単位として、前記マシン語を分割し、複数のプログラムモジュールを作成するステップと、
前記複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、
を含むことを特徴とするコンピュータプログラムのコンパイル方法。
【請求項２３】
請求項１６乃至２２のいずれか一つに記載のコンピュータプログラムのコンパイル方法を用いたコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、そのコンパイラによって作成されたプログラムモジュールの制御方法、及び、その制御方法を実現する制御装置の動作方法に関する。より詳細には、制御装置（マイクロコンピュータ）の処理部（中央処理装置（ＣＰＵ））において、いわゆる暴走などのエラーが発生した場合に、処理部を自動的に復帰させる制御装置の動作方法とその制御装置上で用いられるプログラムモジュールを作成するためのコンパイラに関する。
【背景技術】
【０００２】
マイクロコンピュータのＣＰＵにおいて、外部の電気的なノイズ、静電気、電源電圧の不安定、及び、その他の原因で致命的なエラーが発生する。これにより、そのＣＰＵがプログラムを実行することができなくなることがある。そのような致命的なエラーの状態の例としては、いわゆるＣＰＵの暴走などが挙げられる。マイクロコンピュータのＣＰＵの致命的なエラーへの対策としては、ウオッチドッグとして知られる方法が一般的である。この方法は、ソフトウェアの処理の繰り返し（ループ）時間より十分に長いタイマを設け、ソフトウェア処理のループにおいて、このタイマをリセットする。ＣＰＵに致命的なエラーが発生した場合、ソフトウェア処理が正常に動作しないため、タイマはリセットされずに終了し、タイマの終了をトリガとして、マイクロコンピュータ全体にリセットが与えられる。一方、ＣＰＵが正常に動作している場合（致命的なエラーが発生していない場合）、タイマは終了する前にリセットされるので、マイクロコンピュータはリセットされない。
【０００３】
しかし、この方法では、ＣＰＵの致命的なエラー状態が、その発生からタイマの終了までの長い間継続する可能性がある。したがって、ＣＰＵの致命的なエラー発生からタイマが終了するまでの時間がマイクロコンピュータの使用に悪影響を及ぼすような環境や、その時間中のマイクロコンピュータの誤動作によって使用者に危険が及ぶような環境ではウオッチドッグは必ずしも有効でない。しかしながら、従来、他に有効な手段がないため、ウオッチドッグが採用され続けている。
【０００４】
さらに、ウオッチドッグを用いたＣＰＵの致命的なエラーの対策では、ＣＰＵにおいて致命的なエラーが発生した後、そのＣＰＵの状態を、そのようなエラーが発生する直前の状態に戻すことは困難である。その理由は、ＣＰＵの致命的なエラーが検出される迄に時間がかかっているため、ＣＰＵの致命的なエラーが検出された時点のＣＰＵレジスタの情報などの状態が、致命的なエラーが発生した直前の状態とは異なるからである。
【０００５】
従来、マイクロコンピュータは、ＣＰＵの致命的なエラーを検出すると、ＣＰＵの致命的なエラーを検出した時点のＣＰＵレジスタの情報などを破棄して、マイクロコンピュータ全体を初期化していた。したがって、従来、ＣＰＵを致命的なエラーから復帰させるためには、そのＣＰＵの致命的なエラーを検出するための時間に加えて、マイクロコンピュータ全体を初期化するための時間が必要となっていた。そして、マイクロコンピュータを、ＣＰＵで致命的なエラーが発生する前の状態に戻すために、そのエラーが発生する前の実行中の処理（応用プログラム（アプリケーションプログラム）の処理）を、ＣＰＵの初期化後に再現しなければならない。実行中であった処理を再現することは容易ではなく、さらに、その再現を実行するための処理時間が必要となる。したがって、マイクロコンピュータを使用している環境によって、ＣＰＵの致命的なエラーからマイクロコンピュータを復帰させることは大きな問題になる可能性がある。例えば、ＣＰＵの致命的なエラーから初期化迄の時間に機械が停止できずに事故が起こり得るし、また、金銭の勘定が失われる等の深刻な事態も起こり得る。
【０００６】
一般的に、マイクロコンピュータを用いたワンチップマイコンには、初期化のための信号は１つしか用いられていない。このため、初期化はマイクロコンピュータ全体に対して行われる。よって、マイクロコンピュータの初期化は、全体を初期化するのに見合う重大なエラーの場合に行うことが想定されている。したがって、ＣＰＵの致命的なエラーからの復帰に時間がかかることや、その致命的なエラーが発生するまでの情報などが失われることは、従来、止むを得ないと考えられていた。
【０００７】
さらに、別の方法において、特許文献１に記載されている様に、周期的な割込みの代わりに、リセットを周期的にＣＰＵのみに与える方法もある。この方法を用いた場合、ＣＰＵ上で実行される応用プログラムの実行開始から終了までの時間は、リセットの周期内でなければならない。なぜならば、応用プログラムの実行中にＣＰＵがリセットされた場合、プログラムカウンタやスタックなどのＣＰＵレジスタの情報もリセットされ、応用プログラム中の命令についてのアドレスが消去されるからである。したがって、ＣＰＵのみを周期的にリセットする場合、応用プログラムは、処理開始から終了までの時間がＣＰＵのリセットの周期の間隔内に収まるような極めて小さなサイズとする必要が有る。また、応用プログラムの作成者は、応用プログラムの処理内容だけではなく、リセットの周期を意識して応用プログラムの作成を行わなくてはならないという問題がある。さらに、実行時に応用プログラムの処理時間が確定するような応用プログラム（例えば、画像などの大容量データを取り扱う応用プログラム）は作成することができないという問題がある。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平６−７１０２４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明は、周期的にＣＰＵがリセットされても動作するプログラムモジュールを作成するためのコンパイラ、そのプログラムモジュールを動作させるためのオペレーティングシステム（ＯＳ）、並びに、それらＯＳ及びプログラムモジュールを動作させるためのマイクロコンピュータを提供する。これにより、マイクロコンピュータのＣＰＵにおける致命的なエラーの発生を削減することできる。また、本発明は、マイクロコンピュータのＣＰＵで致命的なエラーが発生した場合、マイクロコンピュータ全体の初期化又はリセットを行うことなく、ＣＰＵのみをリセットすることによって、マイクロコンピュータのＣＰＵを致命的なエラー状態から極めて短時間に復帰させることを目的とする。さらに、本発明は、マイクロコンピュータ上で実行中の応用プログラムに影響を与えることなく、ＣＰＵをリセットすることを目的とする。そして、本発明によって、プログラムモジュールの実行時間が、ＣＰＵがリセットされる周期に基づいて調整されることから、応用プログラムの作成者は、リセットの周期を意識することなく応用プログラムの作成を行うことができる。
【課題を解決するための手段】
【００１０】
本発明による制御装置は、処理部と、処理部とバスを介して接続されている主記憶装置であって、一又は二以上のソースコードをコンパイルしたマシン語を分割することによって作成される複数のプログラムモジュール、複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報、及び、制御ソフトウェアを動作時にロードする主記憶装置と、処理部をリセットする処理部リセット手段と、を備え、制御ソフトウェアは、処理部に、複数のプログラムモジュールにおける第１のプログラムモジュールを実行するステップと、処理部のレジスタの情報を主記憶装置に保存するステップと、を実行させ、制御ソフトウェアは、処理部リセット手段が処理部をリセットした後、さらに、処理部に、主記憶装置に保存されているレジスタの情報を処理部のレジスタに保存するステップと、第１のプログラムモジュールの次に実行すべきと実行順序情報に定義されている第２のプログラムモジュールを実行するステップと、を実行させることができる。
【００１１】
処理部リセット手段は、処理部が複数のプログラムモジュールの１つを実行するために費やすことができる時間である実行単位時間より長い時間である所定の周期で処理部をリセットすることができる。
【００１２】
本発明による制御装置において、制御ソフトウェアは、処理部に、第１のプログラムモジュールの実行が実行単位時間内に終了しない場合、処理部リセット手段による処理部のリセットを停止するステップを実行させるようにすることができる。
【００１３】
本発明による制御装置において、制御ソフトウェアは、第２のプログラムモジュールが実行され、処理部リセット手段によって処理部がリセットされた後、処理部に、第２のプログラムモジュールが正常に終了したか否かを判定するステップと、第２のプログラムモジュールが正常に終了しなかった場合、主記憶装置に保存されているレジスタの情報を処理部のレジスタに保存するステップと、第２のプログラムモジュールを再度実行するステップと、を実行させるようにすることができる。
【００１４】
本発明による制御装置において、主記憶装置は、さらに、複数のプログラムモジュールそれぞれを実行する際に必要となるクロック数の推定値である推定実行クロック数を定義する推定実行クロック情報を動作時にロードし、制御ソフトウェアは、処理部に、第１のプログラムモジュールの推定実行クロック数と第２のプログラムモジュールの推定実行クロック数とを加えた値である加算クロック数と、実行単位クロック数とを比較するステップと、加算クロック数が実行単位クロック数より小さい場合、第１のプログラムモジュールの終了後、処理部をリセットすることなく、第２のプログラムモジュールを実行するステップと、を実行させるようにすることができる。
【００１５】
本発明による制御装置において、制御ソフトウェアが、処理部に、処理部がリセットされる時間の間隔を変更するステップを実行させるようにすることができる。
【００１６】
本発明による制御装置において、マシン語は、マシン語における１又は２以上の命令グループに基づいて、分割されているようにすることができる。
【００１７】
本発明による制御装置において、マシン語は、実行単位時間及び処理部のクロック周波数から計算される実行単位クロック数に基づいて、分割されているようにすることができる。
【００１８】
本発明による制御装置において、マシン語は、実行単位時間及び処理部のクロック周波数から計算される実行単位クロック数とマシン語における１又は２以上の命令グループとに基づいて、分割されているようにすることができる。
【００１９】
本発明による制御装置は、マイクロコンピュータであるようにすることができる。
【００２０】
本発明による制御装置であるマイクロコンピュータが、ワンチップ上で実装されるようにすることができる。
【００２１】
本発明による制御装置は、処理部が、中央処理装置（ＣＰＵ）であるようにすることができる。
【００２２】
本発明による制御装置は、主記憶装置が、ＲＡＭであるようにすることができる。
【００２３】
本発明による制御装置は、制御ソフトウェアが、オペレーティングシステム（ＯＳ）であるようにすることができる。
【００２４】
本発明による制御装置は、主記憶装置が、複数の時点における処理部のレジスタの情報を保存するようにすることができる。
【００２５】
本発明によるコンピュータプログラムのコンパイル方法は、一又は二以上のソースコードをマシン語にコンパイルするステップと、マシン語を実行するために必要なクロック数を計算するステップと、マシン語における１又は２以上の命令グループを単位として、マシン語を分割し、さらに、必要なクロック数がマシン語の１つのグループを実行するために費やすことができる時間である実行単位時間に基づく実行単位クロック数より小さい又は等しくなるようマシン語を分割し、複数のプログラムモジュールを作成するステップと、複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、を含む。
【００２６】
本発明によるコンピュータプログラムのコンパイル方法は、マシン語を実行するコンピュータが有する処理部のクロック周波数と実行単位時間とに基づいて、実行単位クロック数を計算するステップをさらに有するようにすることができる。
【００２７】
本発明によるコンピュータプログラムのコンパイル方法は、複数のプログラムモジュールそれぞれを実行する際に必要となるクロック数を推定し、各推定実行クロック数を定義する推定実行クロック情報を作成するステップをさらに有するようにすることができる。
【００２８】
本発明によるコンピュータプログラムのコンパイル方法は、連続して実行される２以上のプログラムモジュールの推定実行クロック数の合計が、実行単位クロック数より小さい場合、２以上のプログラムモジュールを併合するステップをさらに有するようにすることができる。
【００２９】
本発明によるコンピュータプログラムのコンパイル方法は、一又は二以上のソースコードをマシン語にコンパイルするステップと、マシン語を実行するために必要なクロック数を計算するステップと、必要なクロック数がマシン語の１つのグループを実行するために費やすことができる時間である実行単位時間に基づく実行単位クロック数より小さい又は等しくなるようマシン語を分割し、複数のプログラムモジュールを作成するステップと、複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、を含むようにすることができる。
【００３０】
本発明によるコンピュータプログラムのコンパイル方法は、マシン語を実行するコンピュータが有する処理部のクロック周波数と実行単位時間とに基づいて、実行単位クロック数を計算するステップをさらに含むようにすることができる。
【００３１】
本発明によるコンピュータプログラムのコンパイル方法は、一又は二以上のソースコードをマシン語にコンパイルするステップと、マシン語における１又は２以上の命令グループを単位として、マシン語を分割し、複数のプログラムモジュールを作成するステップと、複数のプログラムモジュールそれぞれの実行順序を定義する実行順序情報を作成するステップと、を含むようにすることができる。
【００３２】
本発明によるコンパイラは、上述のコンピュータプログラムのコンパイル方法を用いることができる。
【発明の効果】
【００３３】
マイクロコンピュータのＣＰＵで致命的なエラーが発生しているのを早期に検出し、致命的なエラーからの復帰を可能とすることによって、マイクロコンピュータを用いた応用装置が異常な動作時には危険であったりする誤動作を大幅に低減することができる。
【００３４】
特に、自動車、飛行機、船舶、産業用ロボットなどの分野で用いられる機械系を制御する機器において、それら機器の誤動作は大事故に繋がる恐れがある（例えば、自動車のブレーキ制御やステアリング制御など）。本発明によるマイクロコンピュータのＣＰＵの致命的なエラーからの復帰に必要な時間は、機械系を制御する機器における誤動作の検出及びその誤動作からの復帰に必要な時間と比較してはるかに短い。よって、マイクロコンピュータのＣＰＵの致命的なエラーに起因するこれら機器の誤動作の検出及びその誤動作から復帰させるための処理を、機器ではなくマイクロコンピュータで行うことは有用である。
【００３５】
また、上記分野において、電気的なノイズなどの致命的なエラーを生じさせる原因は他の分野の機器と比べてより多く発生する。したがって、機械系を制御する機器に本発明を用いることによって、電気的なノイズなどのための従前の多くの対策を大幅に軽減でき、さらに、従前より強固な対策が行えるため、コスト低下と信頼性の向上を併せて図ることができる。また、マイクロコンピュータのＣＰＵにおいて致命的なエラーが継続的に発生している場合、継続的なＣＰＵの致命的なエラーを検出し、その検出結果に基づいて、機器の誤動作を警告するための情報を入出力インタフェースを介して提供することもできる。
【００３６】
更に、本発明は、マイクロコンピュータのＣＰＵで致命的なエラーが発生した場合、マイクロコンピュータ全体をリセットするのではなく、ＣＰＵのみをリセットすることから、致命的なエラーからの復帰を極めて短い時間で行うことができる。また、本発明は、ＣＰＵで致命的なエラーが発生した時に実行されていた応用プログラムを中断した後、ＣＰＵをリセットし、そして、その致命的なエラーが発生する前の時点から応用プログラムの実行を再開することができる。
【００３７】
本発明の活用が期待される分野における一例を挙げれば、エレベーターが動作中に、落雷、電源のノイズ、設計上の不備によるノイズによって、エレベーターの制御を行うマイクロコンピュータのＣＰＵに致命的なエラーが発生し、そして、そのＣＰＵによってエレベーターが誤動作した場合であっても、エレベーターのマイクロコンピュータに本発明のマイクロコンピュータを採用することによって、エレベーターを安定した状態の動作に極めて短い時間で復帰させることができる。
【図面の簡単な説明】
【００３８】
【図１】従来のコンパイラによるプログラムモジュールの作成過程の概要を示した図である。
【図２】本発明の一実施例に係るコンパイラによるプログラムモジュールの作成過程の概要を示した図である。
【図３】本発明の一実施例に係るコンパイラの動作を示したフロー図である。
【図４】実行順序情報についてのテーブル構造を示した図である。
【図５】コンパイラを実現するためのコンピュータ端末の全体を示したブロック図である。
【図６】本発明の一実施例に係るマイクロコンピュータの全体を示したブロック図である。
【図７】第１の実施例によるマイクロコンピュータの動作を示したフロー図である。
【図８】第１の実施例によるマイクロコンピュータの動作を示したフロー図である。
【図９】ＣＰＵの制御の推移、並びに、そのＣＰＵのレジスタ及びＲＡＭに保存されている情報の推移を示す第１の実施例についてのタイムチャートである。
【図１０】プログラムモジュールの併合前後のＣＰＵの制御の推移を示す第２の実施例についてのタイムチャートである。
【発明を実施するための形態】
【００３９】
図１は従来のコンパイラによるプログラムモジュールの作成過程の概要を示した図である。従来技術において、コンパイラ１０５は、ソースコード（ソースプログラム、コンピュータプログラム、原始プログラムなどとも称される）１００をコンパイルすることによって、目的プログラム（オブジェクトモジュールなどとも称される）１０５を作成する。そして、リンカ（連係編集プログラム、リンケージエディタなどとも称される）１２０が目的プログラム１１０とライブラリ１１５などをリンク（連係編集とも称される）させることによって、通常１つのプログラムモジュール（実行モジュール、実行形式モジュール、実行可能モジュール、ロードモジュールなどとも称される）１２５を作成する。
【００４０】
図２は本発明の一実施例に係るコンパイラによるプログラムモジュールの作成過程の概要を示した図である。従来技術では、１つのプログラムモジュール１２５が作成されているのに対し、本実施例では、リンカ２２０によって、複数のプログラムモジュール２２５乃至２４０が作成される。
【００４１】
本実施例では、複数のプログラムモジュールを作成することによって、それらモジュールを実行するときに、プログラムモジュール１  ２２５が完了した後、かつ、プログラムモジュール２  ２３０を実行するまでの間の時間に、ＣＰＵをリセットするなどのプログラムモジュールの処理とは異なる処理の実行が可能となる。
【００４２】
通常、プログラムモジュールは、コンパイル及びリンクなどを行うことによって作成される。しかしながら、ソースコードからプログラムモジュールの作成までの過程は、用いるコンピュータ言語などに依存して変化することがある。したがって、本明細書及び特許請求の範囲において、特に言及が無い限り、ソースコードからプログラムモジュールを作成する過程は、コンパイルによって行われるものとして説明する。
【００４３】
以下、プログラムモジュールを分割することを可能にするコンパイラ及びそのコンパイラによって作成されたプログラムモジュールの制御方法、及び、その制御方法を実現するマイクロコンピュータの動作について説明する。
【００４４】
コンパイラ
図３は、本発明の一実施例に係るコンパイラの動作を示したフロー図である。最初にコンパイラは、応用プログラム（アプリケーションプログラム）などのソースコードを読み取り（ステップ３１０）、ソースコードをコンパイルする（ステップ３１３）。これにより、目的プログラムが生成される。コンパイルは、例えば、ソースコードの字句解析、構文解析、及び、意味解析などを行う。
【００４５】
コンパイラは、目的プログラム（又はソースコード）をマシン語（機械語、マシンコードなどとも称される）に変換する（ステップ３１５）。ここで、マシン語とは、ＣＰＵなどのプロセッサが直接解釈及び実行できる言語である。さらに、ステップ３１５において、コンパイラは、必要に応じて、マシン語とライブラリなどをリンクさせる。
【００４６】
コンパイラは、実行単位時間及びＣＰＵのクロック周波数に基づいて、実行単位クロック数を計算する（ステップ３２０）。具体的には、実行単位時間にＣＰＵのクロック周波数を乗算することによって、実行単位クロック数を得ることができる。ここで、実行単位時間とは、マシン語を実行するために費やすことができる時間を意味する。また、実行単位時間は、ＣＰＵがリセットされる所定の周期（後述する）より短い時間である。例えば、実行単位時間は、マシン語を実行するための前処理及び後処理に必要な時間を所定の周期から差し引いた時間である。ＣＰＵのクロック周波数は、プログラムモジュールを実装するマイクロコンピュータにおけるＣＰＵの周波数である必要がある。一実施例において、特定の周波数のＣＰＵを有するマイクロコンピュータにプログラムモジュールを実装する場合、実行単位クロック数は固定の値とすることができる。この場合、固定の値である実行単位クロック数は、特定の周波数及び所定の実行単位時間に基づく値とすることができる。
【００４７】
実行単位クロック数の計算例として、実行単位時間が２０ｍｓ、ＣＰＵのクロック周波数が１ＧＨｚである場合、実行単位クロック数は、（０．０２）*（１，０００，０００，０００）によって、２０，０００，０００となる。
【００４８】
コンパイラは、命令グループを単位として、マシン語を分割する（ステップ３２５）。命令グループの例としては、１つの命令グループを、複数のソースコード、１つのソースコード、ソースコードにおける１つの条件分岐命令又は繰返し命令、又は、下位の関数などに対応させることができる。
【００４９】
命令グループについて、１つのソースコードであるサンプルソースコード１を用いて説明する。
サンプルソースコード１
1          int exampleFunc1 (int argNumber) {
2              int n = 50;
3              int a = 2;
4
5              if (argNumber != 0) {
6                n = n/argNumber;
7              } 
8              else 
9              {
10               n = n + 1;
11             }
12
13             for (i = 0; i < n; i++) {
14               printf (n);
15             }
16
17             for (i = 0; i < a; i++) {
18               printf (n);
19             }
20
21            return 0;
22          }
【００５０】
１つのソースコードが命令グループの１つとする場合、上記サンプルコードの１乃至２２行目に相当するマシン語全てが命令グループの１つに相当する。
【００５１】
条件分岐命令が命令グループの１つとする場合、条件分岐命令であるｉｆ文の５乃至１１行目に相当するマシン語を１つの命令グループとする。また、５乃至７行目に相当するマシン語を１つの命令グループ、８乃至１１行目に相当するマシン語を１つの命令グループとしてもよい。
【００５２】
繰返し命令が命令グループの１つとする場合、繰返し命令であるｆｏｒ文の１３乃至１５行目に相当するマシン語を１つの命令グループとする。また、１７乃至１９行目に記載されている繰返し命令は、変数ａが２であることから（つまり、変数ａは静的な値）、この繰返し命令は、必ず２回繰り返される。このような場合、２回分の繰返し命令を１つの命令グループとしてもよい。
【００５３】
下位の関数が命令グループの１つとする場合、１４行目に記載されている関数「printf」に相当するマシン語を１つの命令グループとする。
【００５４】
コンパイラは、分割されたマシン語を実行するのに必要なクロック数を計算する（ステップ３３０）。マシン語において、各命令を実行するのに必要なクロック数は既知である。したがって、各命令に対応するクロック数から分割されたマシン語の全部又は一部を実行するのに必要なクロック数を計算することができる。
【００５５】
他の実施例において、各命令を実行するのに必要なクロック数の対応テーブルを予め作成しておき、コンパイラは、対応テーブルを参照することによって、クロック数を計算することができる。
【００５６】
コンパイラは、実行単位クロック数に基づいて、ステップ３２５で分割されたマシン語をさらに分割する（ステップ３３５）。ステップ３２５で分割されたマシン語を実行するのに必要なクロック数が実行単位クロック数より大きい場合、ステップ３２５で分割されたマシン語をさらに分割する。他の実施例として、ステップ３３５において分割されたマシン語を実行するのに必要なクロック数が実行単位クロック数より大きい場合は、マシン語を実行するのに必要なクロック数が実行単位クロック数と等しい及び／又はより小さくなるまで、ステップ３３０及び３３５を繰り返してもよい。
【００５７】
他の実施例において、コンパイラは、ステップ３２５又はステップ３３５のどちらか一方のみを実行するようにしてもよい。これにより、マシン語は、命令グループ又は実行単位クロック数のどちらか一方のみに基づいて分割される。
【００５８】
コンパイラは、分割したマシン語から複数のプログラムモジュールを作成する（ステップ３４０）。コンパイラは、各プログラムモジュールの実行順序を決定し、実行順序情報を作成する（ステップ３４５）。そして、コンパイラは、複数のプログラムモジュールそれぞれに相当するマシン語を実行するのに必要なクロック数を推定実行クロック数として計算し、推定実行クロック情報を作成する（ステップ３５０）。
【００５９】
各プログラムモジュールは、それ自体の実行順序情報及び／又は推定実行クロック情報を有するようにすることができる。他の実施例において、実行順序情報及び／又は推定実行クロック情報は、各プログラムモジュールに関連付けされ、後述する図６に記載のマイクロコンピュータ６００のＲＡＭ６０１又はＲＯＭ６１０に専用テーブルとして保存される。
【００６０】
ステップ３２５において、１つのソースコードが１つの命令グループとして定義された場合、実行順序は、第１のプログラムモジュールに「１」、第１のプログラムモジュールの次に実行されるモジュールである第２のモジュールに「２」が設定される。また、ステップ３３５において、実行単位クロック数に基づいて、第１のプログラムモジュールがさらに分割された場合、実行順序は、「１−１」、「１−２」などのように設定される。
【００６１】
ステップ３２５において、１つの条件分岐命令が１つの命令グループとして定義された場合を以下のサンプルソースコード２を用いて説明する。例えば、１乃至３行目に相当するマシン語を含むプログラムモジュールの実行順序は「１」、４乃至６行目に相当する実行順序は「２」、７乃至１０行目に相当する実行順序は「３」、１１乃至１２行目に相当する実行順序は「４」などとすることができる。
サンプルソースコード２
1          int exampleFunc2 (int argNumber) {
2              int n = 50;
3              int a = 2;
4              if (argNumber != 0) {
5                n = n/argNumber;
6              } 
7              else 
8              {
9                n = n + 1;
10             }
11            return 0;
12          }
【００６２】
ステップ３２５において、１つの繰返し命令が１つの命令グループとして定義された場合の例を以下のサンプルソースコード３を用いて説明する。例えば、１乃至２行目に相当するマシン語を含むプログラムモジュールの実行順序は「１」、３乃至５行目に相当する実行順序は「２」、６乃至７行目に相当する実行順序は「３」とすることができる。さらに、サンプルソースコード３の３行目に「for (i = 0; i < 2; i++)」と記載されているように、iが「０」及び「１」の時に３乃至５行目の繰返し命令が実行されることから、この繰返し命令の処理は必ず２回実行される。したがって、３乃至５行目において、１回目に実行されるマシン語を含むプログラムモジュールの実行順序は「２−１」、２回目に相当する実行順序は「２−２」とすることができる。
サンプルソースコード３
1          int exampleFunc3 (int argNumber) {
2              int n = 50;
3              for (i = 0; i < 2; i++) {
4                printf (n);
5              }
6             return 0;
7           }
【００６３】
さらに、繰返し命令の実行回数が動的に変化する場合の例を以下のサンプルソースコード４を用いて説明する。サンプルソースコード４の例では、２乃至４行目の繰返しは、変数iが引数argNumberの値と等しくなった時に繰返しを止めるが、引数argNumberの値は、関数exampleFunc4をコールする（実行する）時に確定する。つまり、引数argNumberの値は動的に変化する。１行目に相当するマシン語を含むプログラムモジュール（プログラムモジュール１）の実行順序は「１」、２乃至４行目に相当（プログラムモジュール２）する実行順序は「２」、５乃至６行目に相当（プログラムモジュール３）する実行順序は「３」とすることができる。そして、実行順序情報に、２乃至４行目に相当するマシン語を含むプログラムモジュールの処理内容（又は処理回数）及び実行時間は実行時に動的に変化することを示すフラグを付加することができる。例えば、図４のようなテーブル構造によって情報を保存することができ、上記プログラムモジュール１乃至３の識別子には、それぞれ、exampleFunc4-1、exampleFunc4-2、exampleFunc4-3を設定し、２乃至４行目に相当するプログラムモジュールには、実行時に動的に変化することを示す動的変化フラグをオン（値が「１」）に設定することができる。
サンプルソースコード４
1          int exampleFunc4 (int argNumber) {
2             for (i = 0; i <argNumber; i++) {
3               printf (argNumber);
4             }
5             return 0;
6           }
【００６４】
他の実施例において、図４のテーブルに記載のプログラムモジュール識別子及び実行順序を組み合わせた値を実行順序として用いてもよい。これにより、この実行順序は、ユニークな値とすることができる。
【００６５】
他の実施例において、ステップ３５０の処理の後、２以上のプログラムモジュールの推定実行クロック数の合計が、実行単位クロック数より小さい場合、２以上のプログラムモジュールを併合してもよい。また、２以上のプログラムモジュールのいずれかの処理内容（又は処理回数）及び実行時間が実行時に動的に変化する（図４に示す動的変化フラグがオンである）場合、プログラムモジュールの併合を中止することができる。
【００６６】
他の実施例において、コンパイラは、後述する図６に記載のマイクロコンピュータにおいて用いられるようにすることができる。コンパイラ及びコンパイラが用いる各種パラメータなどは、マイクロコンピュータの主記憶装置（ＲＡＭ）やＲＯＭに予め保存しておくことができる。
【００６７】
他の実施例において、コンパイラ及びコンパイラが用いる各種パラメータなどは、図５に記載されているようなコンピュータ端末用のＲＡＭ５２５、ＲＯＭ５３０、ハードディスク５３５、又は、リムーバブルディスク５４０など（以下、記憶装置５５０とする）に保存されていてもよい。コンピュータ端末用ＣＰＵ５０５が、ソフトウェアとして記憶装置５５０に保存されているコンパイラを実行することによって、記憶装置５５０に保存されているソースコードをコンパイルし、複数のプログラムモジュールを作成し、記憶装置５５０のいずれかに保存することができる。さらに、コンピュータ端末５００は、コンパイルするソースコード及び／又は複数のプログラムモジュールをリムーバブルディスク５４０に保存する（及び／又はディスク５４０から読み取る）ことができる。
【００６８】
コンピュータ端末５００は、コンピュータ端末用入力装置５１０及び表示装置５１５を有する。コンピュータ端末用入力装置５１０の例としては、キーボード、ポインティングデバイス、音声認識入力装置などがある。これにより、ユーザは、コンパイルの実行の命令やコンパイル時に用いられるパラメータ（実行単位時間、ＣＰＵのクロック周波数など）の入力を行うことができる。表示装置５１５の例としては、ブラウン管（ＣＲＴ）ディスプレイ、液晶デイスプレイ（ＬＣＤ）などがある。これにより、ユーザは、表示装置５１５に提示されるグラフィックユーザインタフェースを介して、コンパイラを操作することができる。
【００６９】
コンピュータ端末５００は、入出力インタフェース５４５を有し、このインタフェースを介して図６に記載の入出力ポート６２５に接続することができる。これにより、コンピュータ端末５００上の入力装置５１０や表示装置５１５などの資源を用いて、マイクロコンピュータ６００上でコンパイルを実行することができる。
【００７０】
本実施例の説明では、説明を理解し易くするために、複数のプログラムモジュールのファイルを物理的に生成する（例えば、図２の２２５乃至２４０参照）実施例を用いた。しかしながら、当業者であれば理解可能であるように、区切り文字などの所定の規則を用いて、プログラムモジュールそれぞれの境界を明らかにすることによって、１つの物理ファイルを論理的に複数のプログラムモジュールとして用いることもできる。
【００７１】
マイクロコンピュータ
【００７２】
図６は、本発明の一実施例に係るマイクロコンピュータの全体を示したブロック図である。ここで、マイクロコンピュータ６００は、中央処理装置（ＣＰＵ）６０１、主記憶装置（ＲＡＭ）６０５、ＲＯＭ６１０、通信用回路６１５、ユニバーサルカウンタタイマ６２０、入出力ポート６２５、パワースイッチ６２７、論理和回路（ＯＲ回路）６３０、システムリセット入力６３５、ＣＰＵリセット入力６３７、クロック発生回路６４０、タイマカウンタ回路６４５、違法命令及び無効命令検出回路６５５、領域外アクセス検出回路６６０、ウオッチドッグ回路６６５、電源監視回路６７０を備える。マイクロコンピュータ６００の各要素は、必要に応じて、バスと接続されている。一実施例において、マイクロコンピュータは、ワンチップ上で実装することができる。
【００７３】
システムリセット入力６３５は、電源が投入されたときなどに、システムリセット用信号を発生させ、システムリセット用バス６７５を介してシステムリセット用信号を送信する。システムリセット用信号は、マイクロコンピュータ全体をリセットさせるための信号である。システムリセット用信号は、ＣＰＵ６０１のみではなく、例えば、入出力ポート６２５、通信回路６１５、ユニバーサルカウンタタイマ６２０などをリセットするためにも用いられる。
【００７４】
ＣＰＵリセット入力６３７は、ＣＰＵリセットを発生させ、ＣＰＵリセット用バス６８０を介してシステムリセット用信号を送信する。ＣＰＵリセットは、ＣＰＵのみをリセットさせるための信号である。
【００７５】
違法命令及び無効命令検出回路６５５、及び、領域外アクセス検出回路６６０は、それぞれ、ＣＰＵ６０１が正常に動作しているか否かを判定する。ＣＰＵ６０１が正常に動作していないと判定された場合、違法命令及び無効命令検出回路６５５、又は、領域外アクセス検出回路６６０は、ＣＰＵリセット用バス６８０を介してＣＰＵ６０１にＣＰＵリセット用信号を送信し、ＣＰＵ１０１をリセットする。
【００７６】
ウオッチドッグ回路６６５、及び、電源監視回路６７０は、それぞれ、ＣＰＵ６０１が正常に動作しているか否かを判定する。ＣＰＵ６０１が正常に動作していないと判定された場合、ウオッチドッグ回路６６５、又は、電源監視回路６７０は、システムリセット用バス６７５を介してＣＰＵ６０１や通信回路６１５などにシステムリセット用信号を送信し、マイクロコンピュータ６００全体をリセットする。
【００７７】
クロック発生回路６４０は、システムのクロック信号を発生させる回路である。タイマカウンタ回路６４５はＣＰＵリセット信号を発生させる回路である。ＣＰＵ６０１は、マイクロコンピュータ６００のための制御及び演算を実行する回路である。
【００７８】
タイマカウンタ回路６４５は、クロック発生回路６４０から供給されるクロック信号を予め設定されているカウント上限値に到達するまでカウントする。そして、タイマカウンタ回路６４５は、カウントした値がカウント上限値に到達したとき、ＣＰＵリセット信号を発生させ、ＣＰＵ６０１に供給する。その後、タイマカウンタ回路６４５は、そのカウントした値をクリアし、再度、クロック信号をカウントする。これにより、周期的にＣＰＵリセット信号がＣＰＵ６０１に供給される。したがって、その周期は、クロック発生回路のクロック周波数及びカウント上限値によって決定する。他の実施例において、ＣＰＵ６０１は、タイマカウンタ回路６４５に接続されており、カウント上限値を変更することができる。カウント上限値を変更することにより、周期を変更することができる。
【００７９】
他の実施例において、タイマカウンタ回路６４５は、内部にレジスタを有していてもよい。ＣＰＵ６０１は、マイクロコンピュータ６００の電源投入時などにカウント上限値をタイマカウンタ回路６４５に供給し、タイマカウンタ回路６４５は、カウント上限値をレジスタに保存することができる。
【実施例１】
【００８０】
図７及び図８は、第１の実施例によるマイクロコンピュータの動作を示したフロー図である。ＣＰＵ６０１は、マイクロコンピュータの動作を制御するためのオペレーティングシステム（ＯＳ）がＲＡＭ６０５上にロードされた後、そのＯＳに定義されている指示を実行する。ＣＰＵ６０１は、始めに、上記のコンパイラで作成された複数のプログラムモジュールをＲＡＭ６０５上にロードする（ステップ７０５）。また、それら複数のプログラムモジュールに関連する実行順序情報もＲＡＭ６０５上にロードされる。さらに、他の実施例において、それら複数のプログラムモジュールに関連する推定実行クロック情報がロードされるようにすることもできる。
【００８１】
ＣＰＵ６０１は、実行順序情報に基づいて、最初に実行すべきプログラムモジュールを特定する（ステップ７１０）。最初に実行すべきプログラムモジュールは、実行順序が「１」であるモジュールを検索すること又はその他の規則などによって特定することができる。
【００８２】
ＣＰＵ６０１は、特定されたプログラムモジュールを実行する（ステップ７１５）。ＣＰＵ６０１は、実行したプログラムモジュールが正常に終了したかを判定する（ステップ７２０）。この判定は、プログラムモジュールの実行時間が、予めＲＡＭ６０５などに保存されている実行単位時間内であるか否か及び／又は他の規則によって決定される。プログラムモジュールの実行が実行単位時間内に終了しない場合、ＣＰＵ６０１にエラーが発生している可能性が高いこと意味する。
【００８３】
ステップ７２０において、プログラムモジュールが正常に終了した場合、終了フラグがオンにセットされる（ステップ７２５）。終了フラグはＲＡＭ６０５などに保存されるようにすることができる。ＣＰＵ６０１は、ＣＰＵのレジスタの情報をＲＡＭ６０５に保存する（ステップ７３０）。ステップ７２０において、プログラムモジュールが正常に終了していなかった場合、終了フラグは、オンにセットされない。
【００８４】
ＣＰＵ６０１はリセット待ちの状態となる（ステップ７３５）。そして、タイマカウンタ回路６４５が、ＣＰＵリセット信号をＣＰＵ６０１に供給し、ＣＰＵはリセットされる（ステップ７４０）。
【００８５】
ステップ７１０乃至７４０は、ＣＰＵ６０１がリセットされる周期内に完了するようにすることができる。また、ステップ７１０乃至７４０は、ＣＰＵ６０１がリセットされる周期内に完了しない場合、ＣＰＵ６０１がリセットされる前にＣＰＵのレジスタの情報をＲＡＭ６０５に保存し、ＣＰＵ６０１は、リセットからの復帰後、ＲＡＭ６０５に保存されている情報をＣＰＵのレジスタに保存する必要がある。さらに、ＣＰＵ６０１は、ステップ７１０乃至７４０の間に、NMI（Non-Maskable Interrupt）などの割込み要求を受け付けることができる。
【００８６】
ＣＰＵ６０１は、リセットされた後、割込み要求があるか否か判定する（ステップ８０５）。割込み要求がある場合、ＣＰＵ６０１は、割込み要求に関連するプログラムモジュールを実行する（ステップ８１０）。
【００８７】
終了フラグがオンに設定されているか否かを判定する（ステップ８１５）。終了フラグがオンである場合、ＣＰＵ６０１は、終了フラグをオフに設定する（ステップ８２０）。今回実行するプログラムモジュールの実行順序を特定するために、前に実行したプログラムモジュールの実行順序をインクリメントする（ステップ８２５）。実行順序情報（例えば、図４）の実行順序が「１」、「２」、「３」・・・のような数値であり、前に実行したプログラムモジュールの実行順序が「２」である場合、今回実行するプログラムモジュールの実行順序は、「３」となる。他の実施例において、実行順序の値が他の規則によって与えられている場合、その規則に従い、実行すべきプログラムモジュールを特定することができる。
【００８８】
ＣＰＵ６０１は、実行順序に関連するレジスタの情報（ステップ７３０又は８５０でＲＡＭ６０５保存された情報）をレジスタに保存する（ステップ８３０）。ＣＰＵ６０１は、実行順序に関連するプログラムモジュールを実行する（ステップ８３５）。
【００８９】
ステップ８３５において、終了フラグがオフであった場合、実行順序がインクリメントされないため、前に実行されたプログラムモジュールが再度、実行される（ステップ８３５）。終了フラグがオフである場合の例としては、ステップ７２０において、プログラムモジュールの実行時間が実行単位時間を越えていたと判断された場合、又は、違法命令及び無効命令検出回路６５５又は領域外アクセス検出回路６６０が、ステップ７２０が実行される前に、ＣＰＵ６０１が正常に動作していないと判断し、ＣＰＵリセット信号をＣＰＵ６０１に供給した場合などである。
【００９０】
ＣＰＵ６０１は、プログラムモジュールが実行された後（ステップ８１０及び８３５）、実行したプログラムモジュールが正常に終了したかを判定する（ステップ８４０）。処理の内容は、図７のステップ７２０と同じ処理である。
【００９１】
ステップ８４０において、プログラムモジュールが正常に終了した場合、ＣＰＵ６０１は、終了フラグをオンにセットする（ステップ８４５）。ＣＰＵ６０１は、ＣＰＵのレジスタの情報をＲＡＭ６０５に保存する（ステップ８５０）。
【００９２】
他の実施例として、ステップ８５０において、ＣＰＵ６０１は、次に実行すべきプログラムモジュールの実行順序を特定し、レジスタの情報と実行順序とを実行順序情報としてＲＡＭ６０５に保存することができる。これにより、複数のプログラムモジュールそれぞれに関連するレジスタの情報をＲＡＭ１０５に保存し、ＣＰＵ６０１は、プログラムモジュールに関連するレジスタの情報をより簡単に特定することができる。
【００９３】
ＣＰＵ６０１はリセット待ちの状態となる（ステップ８５５）。そして、タイマカウンタ回路６４５が、ＣＰＵリセット信号をＣＰＵ６０１に供給し、ＣＰＵはリセットされる（ステップ８６０）。ステップ８６０の完了後、処理フローは、ステップ８０５に戻る。
【００９４】
図９は、ＣＰＵ６０１の制御の推移、並びに、そのＣＰＵのレジスタ及びＲＡＭ６１０に保存されている情報の推移を示す第１の実施例についてのタイムチャートである。このタイムチャートは、時刻t１、t２、t３・・・の順に時間が進んでいることを示す。状態９０５、９２５、９４５は、ＣＰＵ６０１がリセット信号を受領し、ＣＰＵ６０１がリセットされていることを示す。状態９１０、９２０、９３０、９４０、９５０、９６０は、ＣＰＵ６０１が、ＯＳに関する処理を実行していることを示す。状態９１５は、９３５、９５５は、ＣＰＵ６０１が、プログラムモジュールを実行していることを示す。なお、図９（及び後述する図１０）に示す時間の間隔は例示の目的で示しており、実際の動作に必要な時間を示したものではない。
【００９５】
時刻ｔ１において、ＣＰＵ６０１はリセットされ（図７のステップ７４０及び図８のステップ８６０に相当）、ＣＰＵのレジスタの情報はリセットされる（状態９０５）。時刻ｔ１のレジスタの情報「Ｒ０」は、レジスタの情報がリセットされていることを示す。時刻ｔ２において、ＣＰＵ６０１がＯＳの処理を実行する（状態９１０）。これにより、ＲＡＭ６０５に保存されていたレジスタの情報「Ｒ１」がレジスタにコピー又は保存される（図８のステップ８３０に相当）。
【００９６】
時刻ｔ３において、ＣＰＵ６０１がプログラムモジュールの処理を実行（状態９１５）し、レジスタの情報が「Ｒ２」に更新される（図７のステップ７１５及び図８のステップ８１０及び８３５に相当）。時刻ｔ４において、ＣＰＵ６０１は、レジスタの情報「Ｒ２」をＲＡＭ６０５に保存し（図７のステップ７３０及び図８のステップ８５０に相当）、プログラムモジュールが正常に終了していた場合、終了フラグをオンにセットする（状態９２０、図７のステップ７２５及び図８のステップ８４５に相当）。
【００９７】
時刻ｔ５において、ＣＰＵ６０１をリセットすることによって、ＣＰＵのレジスタの情報はリセットされ（状態９２５）、レジスタの情報が「Ｒ０」となる。時刻ｔ６乃至ｔ９において実行される処理は、時刻ｔ２乃至ｔ５における処理と同様である。
【００９８】
時刻ｔ１０において、終了フラグがオフであると判定された場合（状態９４５、図８のステップ８１５に相当）、前回実行したプログラムモジュール（状態９３５）を再度実行するために、ＲＡＭに保存されているレジスタの情報「Ｒ３」ではなく、レジスタの情報「Ｒ２」をレジスタに保存する（状態９５０）。その後、ＣＰＵ６０１は、レジスタの情報「Ｒ２」を用いて、前回実行したプログラムモジュールを再度実行する（状態９５５）。
【００９９】
プログラムモジュールを再度実行した後、終了フラグが依然オフであると判定された場合、ＣＰＵ６０１は、レジスタの情報「Ｒ２」の代わりにレジスタの情報「Ｒ１」を用いることもできる。これにより、ＣＰＵ６０１は、ＲＡＭ６０５に保存されている複数の時点のレジスタの情報を用いることによって、それらレジスタの情報のうちの一つに関連するプログラムモジュールを再実行することができる。したがって、マイクロコンピュータ６００は、ＣＰＵ６０１にエラーが発生していない時点の状態へ復帰することができる。
【実施例２】
【０１００】
図１０は、プログラムモジュールの併合前後のＣＰＵ６０１の制御の推移を示す第２の実施例についてのタイムチャートである。
【０１０１】
プログラムモジュールを実行するための実行時間が、実行単位時間より短い場合、ＣＰＵ６０１が動作しない時間が多くなるため、プログラムの実行効率が悪くなる。そこで、本実施例によって、プログラムの実行効率を改善させることができる。
【０１０２】
図１０のプログラムモジュール併合前のタイムチャートを参照すると、実行単位時間が時刻ｔ３からｔ５及び時刻ｔ８からｔ１０であるとき（ＣＰＵをリセットする周期はそれぞれ、時刻ｔ１からｔ６及び時刻ｔ６からｔ１１）に、第１のプログラムモジュールを実行するのに実際に必要な実行時間が時刻ｔ３からｔ４（状態１０１５）、その後に実行される第２の実行モジュールの実行時間が時刻ｔ８からｔ９（状態１０４０）であることが示されている。
【０１０３】
このような場合に、ＣＰＵ６０１は、第１及び第２のプログラムモジュールに関連する推定実行クロック数の和を計算し、推定実行クロック数の和と実行単位クロック数とを比較する。推定実行クロック数の和が、実行単位クロック数より小さい場合、ＣＰＵ６０１は、第１のプログラムモジュールを実行する前（状態１０１０）に、第１及び第２のプログラムモジュールを併合し、１つの実行単位時間（時刻ｔ３からｔ５）の間に第１及び第２のプログラムモジュールを実行する。
【０１０４】
図１０のプログラムモジュールの併合後のタイムチャートを参照すると、時刻ｔ３からｔ５の間で、第１及び第２のプログラムモジュールが実行されていることが分かる（状態１０１５及び１０４０）。図１０のプログラムモジュールの併合前のタイムチャートでは、時刻ｔ１３からｔ１４の間で第３のプログラムモジュール（状態１０６０）は実行されていたが、図１０のプログラムモジュールの併合後のタイムチャートでは、時刻ｔ８からｔ１０の間で実行される。第３のプログラムモジュールは、より早い時刻に実行されることから、プログラムの実行効率が改善される。
【０１０５】
他の実施例において、併合対象のプログラムモジュールのいずれかの処理内容（又は処理回数）及び実行時間が実行時に動的に変化する（図４に示す動的変化フラグがオンである）場合、プログラムモジュールの併合を中止することができる。
【実施例３】
【０１０６】
画像や動画などのような大容量のデータを扱うプログラムモジュールにおいて、実行時にプログラムモジュールの実行時間が変動することが考えられる。そして、その実行時間が、実行単位時間を越える可能性も有り得る。このような場合、実行単位時間を越えてプログラムモジュールの実行を継続するために、タイマカウンタ回路６４５は、ＣＰＵ６０１へのＣＰＵリセット信号の供給を停止する。例えば、ＣＰＵ６０１は、タイマカウンタ回路６４５に設定されているカウント上限値を２倍又はそれ以上の値（又はその他の適切な値）に変更することによって、ＣＰＵリセット信号の供給を停止することができる。これにより、実際の実行時間が実行単位時間を越えてしまうプログラムモジュールの実行中にＣＰＵのリセットが起こらないようにすることができる。また、本実施例を適用するプログラムモジュールは、図４に示すような動的変化フラグがオンとなっているか否かによって決定することができる。
【実施例４】
【０１０７】
あるプログラムモジュールの推定実行クロック数に相当する時間（以下、推定実行時間）が、ＣＰＵ６０１をリセットする周期（ＣＰＵ６０１がリセットされる間隔）よりはるかに短い場合、推定実行クロック数に相当する処理が実行された後、プログラムモジュールの実行に割当てられたクロック数の残り（実行単位クロック数−推定実行クロック数）に相当する時間の間、ＣＰＵ６０１は、他のプログラムモジュールを実行することができない。このような場合に、ＣＰＵ６０１は、プログラムモジュールを実行するときに、ＣＰＵがリセットされる間隔を推定実行時間に近い時間に変更する。これにより、プログラムモジュールの実行後、すぐにＣＰＵ６０１がリセットされ、次のプログラムモジュールを実行することができる。したがって、本実施例によって、プログラムモジュールの実行効率が改善される。
【０１０８】
ＣＰＵがリセットされる間隔を変更する例として、ＣＰＵ６０１は、タイマカウンタ回路６４５に設定されているカウント上限値を変更し、タイマカウンタ回路６４５がＣＰＵリセット信号を供給する間隔を変更する。また、推定実行時間が、ＣＰＵ６０１がリセットされる間隔より長い場合、ＣＰＵ６０１は、ＣＰＵがリセットされる間隔を推定実行時間に近い時間に変更する。これにより、プログラムモジュールの実行中にＣＰＵ６０１がリセットされることを防止することができる。
【０１０９】
本実施例の説明において、ＣＰＵ６０１のリセットは、リセット信号を用いて実行されている。しかしながら、リセット信号の代わりに割込み信号を用いて、ＣＰＵ６０１をリセとすることも可能である。また、本実施例において、ＣＰＵ６０１のリセットとは、ＣＰＵ６０１の内部ロジックを特定の状態にする（例えば、ＣＰＵレジスタの全て又は一部を全てクリアするなど）ことを意味する。したがって、本実施例において、ＣＰＵのリセット信号は、「内部ロジックを特定の状態にする」ことを意味する「ＣＰＵリセット手段」の一例として挙げたに過ぎず、ＣＰＵのリセット信号は、考え得る他の手段及び方法などと代替することができる。
【０１１０】
上記の実施例において示したマイクロコンピュータ６００は、特許請求の範囲に記載した「制御装置」の一例である。制御装置は、マイクロコンピュータとして、ワンチップ上で実装することができるが、必ずしも、ワンチップ上で実装されている必要はない。また、制御装置は、処理部を有する装置として動作する装置（例えば、パーソナルコンピュータや、論理回路と処理部とを組み合わせた装置など）を含でもよい。
【０１１１】
上記の実施例において示したＣＰＵ６０１は、特許請求の範囲に記載した「処理部」の一例である。処理部は、処理装置又は演算処理装置として動作する装置全てを含む。
【０１１２】
上記の実施例において示したＲＡＭ６０５は、特許請求の範囲に記載した「書き換え可能な記憶装置」の一例である。書き換え可能な記憶装置は、不揮発性メモリなどの記憶装置であって、書き換えが行える記憶装置全てを含む。特に、書き換え可能な記憶装置は、主記憶装置として用いることが可能な記憶装置である。
【０１１３】
上記の実施例において示したオペレーティングシステム（ＯＳ）は、特許請求の範囲に記載した「制御ソフトウェア」の一例である。制御ソフトウェアは、制御装置（又はマイクロコンピュータ）の動作を制御するためソフトウェアである。
【０１１４】
上記の実施例において、ハードウエアで実現するよう説明されたいくつかの要素の一部又は全ては、ソフトウェアで実現することができ、そして、ソフトウェアで実現するよう説明されたいくつかの要素の一部又は全ては、ハードウエアで実現することができることは理解されるであろう。
【０１１５】
以上に説明した処理又は動作フローにおいて、あるステップにおいて、そのステップではまだ利用することができないはずのデータを利用しているなどの処理又は動作フロー上の矛盾が生じない限りにおいて、処理又は動作フローを自由に変更することができる。
【０１１６】
以上に説明してきた各実施例は、本発明を説明するための例示であり、本発明はこれらの実施例に限定されるものではない。本発明は、その要旨を逸脱しない限り、種々の形態で実施することができる。
【符号の説明】
【０１１７】
５００  コンピュータ端末
５０５  コンピュータ端末用ＣＰＵ
５１０  コンピュータ端末用入力装置
５１５  コンピュータ端末用表示装置
５４５  コンピュータ端末用入出力インタフェース
５２５  コンピュータ端末用ＲＡＭ
５３０  コンピュータ端末用ＲＯＭ
５３５  コンピュータ端末用ハードディスク
５４０  コンピュータ端末用リムーバブルディスク
５５０  記憶装置
６００  マイクロコンピュータ
６０１  中央処理装置（ＣＰＵ）
６０５  主記憶装置（ＲＡＭ）
６１０  ＲＯＭ
６１５  通信用回路
６２０  ユニバーサルカウンタタイマ
６２５  入出力ポート
６３０  論理和回路（ＯＲ回路）
６３５  システムリセット入力
６３７  ＣＰＵリセット入力
６４０  クロック発生回路
６４５  タイマカウンタ回路
６５５  違法命令及び無効命令検出回路
６６０  領域外アクセス検出回路
６５５  ウオッチドッグ回路
６７０  電源監視回路
【図１】
2013109652.tif 000003
【図２】
2013109652.tif 000004
【図３】
2013109652.tif 000005
【図４】
2013109652.tif 000006
【図５】
2013109652.tif 000007
【図６】
2013109652.tif 000008
【図７】
2013109652.tif 000009
【図８】
2013109652.tif 000010
【図９】
2013109652.tif 000011
【図１０】
2013109652.tif 000012