(57)【特許請求の範囲】
【請求項１】
複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成することを特徴とするコンパイル方法。
【請求項２】
複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、各割込要求に対応した割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析しユーザ指定レジスタバンク数として記憶し、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成し、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成することを特徴とするコンパイル方法。
【請求項３】
前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成する、請求項１または２記載のコンパイル方法。
【請求項４】
前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成する、請求項１，２または３記載のコンパイル方法。
【請求項５】
複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルする処理をコンピュータに実行させる、コンパイル用プログラムを記録した記録媒体において、
各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当ててシステムレジスタの退避およびコードを生成する処理を実行させることを特徴とする、コンパイル用プログラムを記録した記録媒体。
【請求項６】
複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルする処理をコンピュータに実行させる、コンパイル用プログラムを記録した記録媒体において、
各割込要求に対応した割込関数に使用するレジスタバンク数として起動時にユーザ指定されたユーザ指定レジスタバンク数を解析する処理と、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成する処理と、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当ててシステムレジスタの退避および前記レジスタバンク切替を行うコードを生成する処理とを実行させることを特徴とする、コンパイル用プログラムを記録した記録媒体。
【請求項７】
前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成する処理を実行させる、請求項５または６記載の、コンパイル用プログラムを記録した記録媒体。
【請求項８】
前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成する処理を実行させる、請求項５，６または７記載の、コンパイル用プログラムを記録した記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はコンパイル方法に関し、特に、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムをコンパイルするコンパイル方法に関する。
【０００２】
【従来の技術】
従来、この種のコンパイル方法は、記録媒体に記録されたコンパイル用プログラム（またはコンパイラ）を読み取り実行するコンピュータ，ワークステーションなど、一般的なハードウェア構成のデータ処理装置により処理され、コンパイル対象とするマイクロコントローラに対応して処理される。
【０００３】
コンパイル対象とするマイクロコントローラの１つとして、レジスタバンク機能を有するものがある。このレジスタバンク機能とは、例えば、マイクロコントローラが１２個の８ビットレジスタＸ，Ａ，Ｃ，Ｂ，Ｒ４，Ｒ５，Ｒ６，Ｒ７，Ｖ，Ｕ，Ｔ，Ｗと４個の１６ビットレジスタＶＰ，ＵＰ，ＤＥ，ＨＬとを１つのレジスタバンクとして４つのレジスタバンクを備え、これらレジスタバンクの１つのレジスタバンク番号がＣＰＵの制御命令ｓｅｌにより指定されレジスタバンク切替が行われる機能である。レジスタバンク１を使用するときは、制御命令として「ｓｅｌ  ｒｂ１」のように記述し、レジスタバンク１に切替えて使用することができ、このレジスタバンク切替により、使用しているレジスタを個々に退避する必要がなくなる。また、割込みが発生すると、マイクロコントローラが、レジスタバンクなどのプログラムステータスワードを含むシステムレジスタｐｓｗを割込み発生時点で自動的に退避し、割込関数から戻るときには、復帰命令ｒｅｔｉにより、システムレジスタｐｓｗの復帰も自動的に行う。
【０００４】
図９は、このレジスタバンク機能を有するマイクロコントローラに対応したコンパイル方法を説明するための説明図であり、レジスタバンク機能を有するマイクロコントローラに対応して作成されたソースプログラムのソースファイル例を示す。
【０００５】
また、図１０〜１１は、この従来のコンパイル方法の処理手順例を示す流れ図である。この従来のコンパイル方法は、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、ソースプログラムをコンパイルする。
【０００６】
図１０〜１１を参照すると、この従来のコンパイル方法の処理手順例は、先ず、ステップ８０１で、ソースプログラムを構文解析する構文解析処理が行われ、入力ソースファイルより文字を読込み、意味のある文字単位の構文に分割し、コンパイラの言語仕様で定められた予約語ｉｎｔ，ｖｏｉｄと区切り子以外のシンボルをシンボルテーブルに登録する。
【０００７】
ステップ８０２で、一構文読込処理が行われ、構文解析処理により解析した構文を一構文読込み、ステップ８０３で、読み込んだ構文が入力ソースファイルの終了を示す構文か判定する。この判定は、コンピュータ内のファイルの最後に通常入っているＥＯＦ（Ｅｎｄ  Ｏｆ  Ｆｉｌｅ）を示す記号（−１）により行われ、この判定結果でソースファイルの終了を示す構文でない場合は、ステップ８０４，８１０，８１２，８１４または８１８に進み、割込関数または割込関数以外の関数の開始，終了または呼出を示す構文か判定する。
【０００８】
ステップ８０４では、割込関数開始判定が行われ、関数名を示すシンボルの直後に‘｛’があることにより、関数の開始であることを判定し、シンボルテーブルの参照より、割込関数であることを判定し、読み込んだ構文が割込関数開始を示す構文か判定する。同様に、ステップ８１０で、割込関数以外の関数開始判定が行われる。また、ステップ８１２では、割込関数終了判定が行われ、関数開始の‘｛’に対応した‘｝’があることにより、関数の終了であることを判定し、シンボルテーブルの参照より、割込関数であることを判定する。同様に、ステップ８１４で関数終了判定が行われる。さらに、ステップ８１８で、関数呼出判定が行われ、関数内の処理中にシンボルの直後に‘（’と‘）’とがあることにより判定する。ただし、この括弧内には引数がある場合と何もない場合とがある。
【０００９】
ステップ８０４の割込関数開始の判定結果に対応して、ステップ８０５に進み、レジスタバンク番号設定判定が行われ、ステップ８０２の一構文読込処理で読込んだ構文の示す割込関数にレジスタバンク番号が設定されているか判定し、設定または未設定の判定結果に対応して、ステップ８０６または８１１に進む。ステップ８０６では、レジスタバンク番号読込処理が行われ、読込んだ構文の示す割込関数に設定しているレジスタバンク番号を読込み、ステップ８０７で、レジスタバンク番号判定が行われ、読み込んだレジスタバンク番号がマイクロコントローラで許容されている範囲内か判定し、範囲内または範囲外の判定結果に対応して、ステップ８０８または８１１に進む。ステップ８０８では、レジスタバンク切替処理が行われ、レジスタバンク切替を行うコードを生成する。
【００１０】
また、ステップ８１０の関数開始の判定結果に対応して、ステップ８１１に進み、使用レジスタの退避処理が行われ、使用レジスタの内容を退避するコードを生成する。
【００１１】
また、ステップ８１２の割込関数終了の判定結果に対応して、割込関数には返り値を設定できなく返り値判定を行う必要はないので、ステップ８１３に進み、レジスタバンク切替判定が行われ、シンボルテーブルの参照により、ステップ８０８のレジスタバンク切替が行われたか判定し、レジスタバンク切替の判定結果に対応して、ステップ８１７に進み、使用レジスタの復帰処理が行われ、使用レジスタの内容を復帰するコードを生成する。
【００１２】
また、ステップ８１４の関数終了の判定結果に対応して、ステップ８１５に進み、返り値判定が行われ、読み込んだ構文の示す関数が返り値を返すか判定する。この判定は、関数呼出のシンボルの直前に‘＝’があることで判定され、返り値を返す場合は、ステップ８１６で、返り値設定処理が行われ、返り値をレジスタに設定するコードを生成し、ステップ８１７に進む。
【００１３】
さらに、ステップ８１８の関数呼出の判定結果に対応して、ステップ８１９に進み、返り値判定が行われ、読み込んだ構文の示す関数が返り値を返すか判定し、返り値を返す場合は、ステップ８２０に進み、返り値読込処理が行われ、返り値をレジスタから読込むコードを生成する。
【００１４】
これらステップ８０４〜８０８，８１０〜８２０の処理の後に、ステップ８０９に進み、その他の処理が行なわれ、ステップ８０２の一構文読込処理に戻る。
【００１５】
上記の一連の動作により、図９に示すソースファイル例に対して、図１２に示すアセンブラプリントファイル出力例を得ることができる。
【００１６】
【発明が解決しようとする課題】
この従来のコンパイル方法では、次のような問題点があった。
【００１７】
第１の問題点は、割込関数がマイクロコントローラで許容しているレジスタバンクの数より少ないプログラムにおいては、使用しないレジスタバンクがあるにも拘わらず、関数を呼出す度に呼出された関数で、使用するレジスタの退避、復帰が必要となり、ＲＯＭサイズと実行タイムが共に良くないということである。
【００１８】
その理由は、レジスタを使用している状態で関数を呼出した場合、呼出された関数で同じレジスタを他の用途で使用してしまうと、呼出した関数に戻ったときにレジスタの内容が変わってしまう。そのため呼出された関数で使用しているレジスタを退避および復帰する必要があるが、複数のレジスタを使用している場合は、使用している全てのレジスタを退避、復帰しなければならず、頻繁に関数を呼出すような場合、その退避および復帰に要する命令だけで大きな割合を占め、ＲＯＭサイズと実行タイムとが共に悪くなってしまうためである。
【００１９】
したがって、本発明の目的は、レジスタバンク機能を持つマイクロコントローラに対して作成されたプログラムのＲＯＭサイズを削減し実行タイムを改善することにある。
【００２０】
【課題を解決するための手段】
そのため、本発明は、複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、
各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成している。
【００２１】
または、本発明は、複数レジスタバンクの１つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、
各割込要求に対応した割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析しユーザ指定レジスタバンク数として記憶し、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成し、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成している。
【００２２】
また、前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成している。
【００２３】
さらに、前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成している。
【００２４】
【発明の実施の形態】
次に、本発明について図面を参照して説明する。本発明のコンパイル方法は、従来のコンパイル方法と同じく、記録媒体に記録されたコンパイル用プログラムまたはコンパイラを読み取り実行するコンピュータ，ワークステーションなど、一般的なハードウェア構成のデータ処理装置により処理され、コンパイル対象とするマイクロコントローラに対応して処理される。
【００２５】
図１〜２は、本発明のコンパイル方法の実施形態１における処理手順例を示す流れ図である。この実施形態のコンパイル方法は、図１０〜１１に示された従来のコンパイル方法における処理手順例と同じく、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始，終了または呼出を示す構文か判定して、レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、ソースプログラムをコンパイルする。
【００２６】
図１〜２を参照すると、本実施形態のコンパイル方法における処理手順は、ステップ１０１〜１０８と各ステップ８ｘｘとを含み、これらの中で、各ステップ８ｘｘについては、図１０〜１１に示された従来のコンパイル方法における各ステップと同処理であり重複説明を省略し、本実施形態のコンパイル方法における特徴を示すステップ１０１〜１０８の処理手順について、次に説明する。
【００２７】
ステップ８１０の関数開始判定の結果に対応して、割込関数以外の関数の開始を示す構文に対してステップ１０１に進み、関数ネストレベル読込処理が行われ、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込む。この関数ネストレベルは、ワークステーションの標準ＯＳとして用いられているＵＮＩＸのｃｆｌｏｗコマンドで代表される公知技術により作成され、ここでは、権利化対象外とし、例えば、図３に説明図として示す関数ネストレベル対応情報例が図９のソースファイル例に対して別ツールで作成され読込まれることとする。
【００２８】
ステップ１０２で、関数ネストレベル判定が行われ、ステップ１０１で読み込んだ関数ネストレベルがマイクロコントローラで許容されているレジスタバンク番号の範囲内であるか判定し、レジスタバンク番号の範囲内または範囲外の判定結果に対応してステップ１０３または８１１に進む。ここで、コンパイラはコンパイル対象とするマイクロコントローラごとに作成され、レジスタバンクの数を固定情報として保持し、レジスタバンク番号の範囲も固定である。このレジスタバンク番号の許容範囲はプログラム開始関数で使用する「０」を除く最大値までであり、プログラム開始関数ｍａｉｎの関数ネストレベルは「０」であり、デフォールトのレジスタバンク番号も通常「０」である。
【００２９】
ステップ１０３で、再帰関数判定が行われ、シンボルテーブルの参照より、読み込んだ構文の示す関数が再帰関数か判定する。再帰関数の場合、再帰関数はプログラム実行時（動的）でないと関数の呼出し関係と呼出しの深さを示す関数ネストレベルが判らないため、レジスタバンク機能を使用せず、ステップ８１１に進み、再帰関数でない場合ステップ１０４に進む。
【００３０】
ステップ１０４で、レジスタバンク割当処理が行われ、ステップ１０２で読み込んだ関数ネストレベルをレジスタバンク番号として割当て、シンボルテーブルにレジスタバンクの情報を登録する。
【００３１】
ステップ１０５で、システムレジスタの退避処理が行われ、システムレジスタを退避するコードを生成し、ステップ８０８に進む。これは、システムレジスタには現在使用中のレジスタバンク番号の情報が含まれており、従来技術では、割込関数が呼出される場合に、マイクロコントローラが自動的に行う処理である。
【００３２】
また、ステップ８１４の関数終了判定の結果に対応して、関数の終了を示す構文の関数が返り値を返す場合ステップ１０６に進み、返り値設定処理が行われ、返り値をレジスタ領域以外のデータ領域に設定するコードを生成し、ステップ８１３のレジスタバンク切替判定の判定結果に対応して、システムレジスタの復帰を行うコードを生成する。
【００３３】
さらに、ステップ８１８の関数呼出判定の結果に対応して、関数の呼出を示す構文の関数が返り値を返す場合ステップ１０８に進み、返り値読込処理が行われ、返り値をレジスタ領域以外のデータ領域から読み込むコードを生成する。
【００３４】
このように、本実施形態のコンパイル方法は、レジスタバンク機能を持つマイクロコントローラにおいて、従来、ＲＯＭサイズが小さく実行タイムが早くなるレジスタバンク機能を割込関数にのみ適用していたが、これを割込関数以外の関数に適用する構成を提供するものである。
【００３５】
次に、本実施形態のコンパイル方法により図９のソースファイル例をコンパイルする具体例について図面を参照して説明する。ここで、図４は、図９のソースファイル例に対して作成されたシンボルテーブル例を示す説明図であり、図５は、本実施形態のコンパイル方法を具体的に説明するための説明図であり、アセンブラプリントファイル出力例を示す。また、コンパイル対象とするマイクロコントローラごとにコンパイラを作成するため、コンパイラはコンパイル対象のマイクロコントローラのレジスタバンク数を固定情報として保持し、ここでは、効果が判り易いように、コンパイル対象のマイクロコントローラのレジスタバンク数を４つとする。
【００３６】
まず、ステップ８０１では、構文解析処理が行われ、入力ソースファイルの終了ＥＯＦまで全ての解析を行い、図４のシンボルテーブルの作成を行う。
【００３７】
例えば、図９に示すソースファイル例の３行目の意味は、関数の前方参照を可能とするためのプロトタイプ宣言として関数の型を事前に宣言するものであり、ｖｏｉｄは何もないことを示す型である。このソースファイル例の３行目に対して、入力ソースファイルより「ｉｎｔ  ｆｕｎｃ１１（ｖｏｉｄ）；」を読込み、予約語ｉｎｔ、ｖｏｉｄと区切り子以外のシンボルｆｕｎｃ１１を、図４のシンボルテーブルのシンボル情報２０２に、シンボル名（ｆｕｎｃ１１），型（ｉｎｔ），種別（関数），クラス（外部），値（なし），返り値（あり），引数（なし），再帰（なし）として登録する。ただし、レジスタバンクとレジスタバンク番号は、ステップ１０４におけるレジスタバンク割当処理で登録される。
【００３８】
続いて、図９のソースファイル例における各行の構文に対応した処理が行われる。例えば図９の２８行目に対しては、関数にレジスタバンクを割当てる場合に相当する以下の処理が行われる。
【００３９】
まず、ステップ８０２で、一構文読込処理が行われ、構文（ｉｎｔ  ｆｕｎｃ１１（ｖｏｉｄ）｛  ）を読込み、ステップ８０３で、終了構文判定が行われ、読込んだ構文が終了ＥＯＦの構文でないと判定し、ステップ８０４に進み、割込関数開始判定が行われて、最後の‘｛’で関数の開始であるか判定し且つ図４のシンボルテーブルの関数ｆｕｎｃ１１を参照しシンボル情報２０２のクラス情報から割込関数でないか判定して、読込んだ構文が割込関数開始の構文でないと判定する。ステップ８１０に進み、関数開始判定が行われ、読込んだ構文が関数開始の構文と判定し、ステップ１０１に進む。
【００４０】
ステップ１０１で、関数ネストレベル読込処理が行われ、図３の関数ネストレベル対応情報例を参照し、読込んだ構文の示す関数ｆｕｎｃ１１の関数ネストレベル「１」を読込み、ステップ１０２で、関数ネストレベル判定が行われ、読込んだ関数ネストレベルが「１」でありレジスタバンク番号「４」の範囲内であると判定し、ステップ１０３に進む。
【００４１】
ステップ１０３で、再帰関数判定が行われ、読込んだ構文の示す関数ｆｕｎｃ１１が図４のシンボルテーブルの関数ｆｕｎｃ１１を参照し図５のシンボル情報２０２の再帰情報から再帰関数でないと判定し、または、図３の関数ネストレベル対応情報で示される関数名の直後に「＊」記号が付加されていることにより再帰関数であると判定し、ステップ１０４に進む。
【００４２】
ステップ１０４で、レジスタバンク割当処理が行われ、読込んだ構文の示す関数ｆｕｎｃ１１で使用するレジスタバンク番号を関数ネストレベル対応情報と同じ「１」に設定し、図４のシンボルテーブルのシンボル情報２０２におけるレジスタバンク情報，レジスタバンク番号情報に「切替」，「１」をそれぞれ登録し、ステップ１０５で、システムレジスタの退避処理が行われて、システムレジスタの内容を退避するコードが生成され、ステップ８０８で、レジスタバンク切替処理が行われ、レジスタバンクを「１」に切替えるコードを成する。図５のアセンブラプリントファイル出力例における００００１４番地のコードｐｕｓｈ  ｐｓｗと００００１５番地のコードｓｅｌ  ｒｂ１とが、上述のステップ１０５，８０４で生成されたコードにそれぞれ相当する。
【００４３】
これら処理の後、ステップ８０９でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ８０２の一構文読込処理に戻る。
【００４４】
また、例えば図９の３３行目に対しては、レジスタバンクを割当てる関数を呼出す場合に相当する以下の処理が行われる。
【００４５】
まず、ステップ８０２で、一構文読込処理が行われ、構文（ｖａｒ１  ＝  ｆｕｎｃ２１（）；  ）を読込み、ステップ８０３で、終了構文判定が行われて、読込んだ構文が終了ＥＯＦの構文でないと判定し、ステップ８０４，８１０，８１２，８１４で、割込関数開始判定，関数開始判定，割込関数終了判定，関数終了判定が行われ、読込んだ構文が割込関数開始，関数開始，割込関数終了，関数終了の構文でないと判定し、ステップ８１８に進み、関数呼出判定が行われ、シンボルの直後に‘（’と、‘）’があるか判定することにより、読込んだ構文が関数呼出の構文であると判定し、ステップ８１９に進む。
【００４６】
ステップ８１９で、返り値判定が行われ、図４のシンボルテーブルにおけるシンボル情報２０４の返り値情報を判定することにより、読込んだ構文の示す関数ｆｕｎｃ２１に返り値があると判定する。返り値ありと判定された場合、ステップ１０８に進み、返り値読込処理が行われ、返り値をレジスタ領域以外のデータ領域から読み込むコードを生成する。例えば、図５のアセンブラプリントファイル出力例における００００１Ｅ番地のコードｍｏｖｗ  ｒｐ３，＿ｒｅｔｖａｌが、上述のステップ１０８で生成されたコードに相当する。このコードの構成部分ｒｐ３はシンボルｖａｒ１が使用しているレジスタ名であり、このコードの構成部分＿ｒｅｔｖａｌは、コンパイラが確保したレジスタ領域以外のデータ領域を示す。
【００４７】
これら処理の後、ステップ８０９でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ８０２の一構文読込処理に戻る。
【００４８】
また、例えば図９の３７行目，３８行目に対しては、レジスタバンクを割当てた関数を終了する場合に相当する以下の処理が行われる。
【００４９】
まず、同様に、ステップ８０２で、構文（ｒｅｔｕｒｎ  ｖａｒ４；  ｝）を読込み、ステップ８０３で、読込んだ構文が終了ＥＯＦの構文でないと判定し、ステップ８０４，８１０，８１２で、読込んだ構文が割込関数開始，関数開始，割込関数終了の構文でないと判定し、ステップ８１４で関数終了判定が行われ  、構文の最後の‘｝’で関数の終了であるか判定し且つ図５のシンボル情報２０２のクラスにより割込関数でないか判定することにより、関数終了の構文と判定し、ステップ８１５に進む。
【００５０】
ステップ８１５で、返り値判定が行われ、図４のシンボルテーブルにおけるシンボル情報２０２の返り値情報を判定することにより、関数ｆｕｎｃ１１に返り値があると判定する。返り値があると判定された場合、ステップ１０６に進み、返り値設定処理が行われ、返り値をレジスタ領域以外のデータ領域に設定するコードを生成する。例えば、図５のアセンブラプリントファイル出力例における００００３６番地のｍｏｖｗ  ＿ｒｅｔｖａｌ，ａｘが、上述のステップ１０６で生成されたコードに相当する。このコードの構成部分ａｘはシンボルｖａｒ４が使用しているレジスタ名である。
【００５１】
ステップ８１３で、レジスタバンク切替判定が行われ、関数開始時にレジスタバンク割当またはレジスタバンク切替を行ったかを判定する。この判定は、図４のシンボルテーブルにおけるシンボル情報２０２のレジスタバンク情報を判定することにより行われ、切替の判定結果に対応して、ステップ１０７に進み、システムレジスタの復帰処理が行われ、退避したシステムレジスタの内容の復帰を行うコードを生成する。例えば、図５のアセンブラプリントファイル出力例における００００３Ｃ番地のｐｏｐ  ｐｓｗが、上述のステップ１０７で生成されたコードに相当する。
【００５２】
これら処理の後、ステップ８０９でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ８０２の一構文読込処理に戻る。
【００５３】
また、図９の５２行目に対して、割込関数にレジスタバンクを割り当てない場合に相当する以下の処理が行われる。
【００５４】
まず、ステップ８０２で、構文（ｖｏｉｄ  ｆｕｎｃ１３（ｖｏｉｄ）｛  ）を読込み、ステップ８０３で、読込んだ構文が終了ＥＯＦの構文でないと判定され、ステップ８０４で、割込関数開始判定が行われ、読込んだ構文が割込関数開始の構文であると判定し、ステップ８１１で、使用レジスタの退避処理が行われ、使用レジスタの内容の退避を行うコードをが生成する。
【００５５】
ここで、割込関数はレジスタバンクを切替えないため、図４のシンボルテーブルにおけるシンボル情報２０２のレジスタバンク情報は「変更なし」であり、レジスタバンク番号は割込みが発生した時点のレジスタバンク番号をそのまま使用するため、図４のシンボルテーブルにおけるシンボル情報２０２の登録は何も行わない。
【００５６】
これら処理の後、ステップ８０９でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ８０２の一構文読込処理に戻る。
【００５７】
上記の一連の処理を図９のソースファイル例に対し行うことにより、図５に示すアセンブラプリントファイル出力例を得ることができる。
【００５８】
次に、本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードによる効果について、従来のコンパイル方法と比較して具体的に説明する。
【００５９】
本実施形態または従来のコンパイル方法により生成される関数開始，終了または呼出処理部のコードの命令は、レジスタの退避命令／復帰命令（ｐｕｓｈ  ｒｅｇ／ｐｏｐ  ｒｅｇ），レジスタの返り値読込命令／書込命令（ｍｏｖｗ  ｒｐ３，ｂｃ／ｍｏｖｗ  ｂｃ，ａｘ），レジスタ領域以外のデータ領域の返り値読込命令／書込命令（ｍｏｖｗ  ｒｐ３，＿ｒｅｔｖａｌ／ｍｏｖｗ  ＿ｒｅｔｖａｌ，ａｘ），システムレジスタの退避命令／復帰命令（ｐｕｓｈ  ｐｓｗ／ｐｏｐ  ｐｓｗ），レジスタバンクの切替命令（ｓｅｌ  ｒｂ１）である。
【００６０】
ここで、これら各命令が、コンパイル対象のマイクロコントローラにおいて、次に示すＲＯＭサイズ，実行タイムを要するとする。
0003566602.tif 000002
また、上記のコンパイル対象のマイクロコントローラが制御できるレジスタバンクの数を４つとし、図９に示すソースファイルが入力され、図３に示す関数ネストレベルを持つとすると、本実施形態１では、図３に示すネストレベル１〜３の９個の関数がレジスタバンク切替を使用できる。さらに、１関数当たり３つのレジスタを使用し、３回ずつ関数呼出を行っている場合について、本実施形態および従来のコンパイル方法により生成される関数開始，終了または呼出処理部のコードにおけるＲＯＭサイズ差，実行タイム差を求めてみる。
【００６１】
先ず、従来のコンパイル方法により生成される関数開始，終了または呼出処理部のコードは、１関数あたり、レジスタの退避命令，復帰命令３個ずつと、レジスタの返り値読込命令３個とからなるので、９関数で１６２バイトのＲＯＭサイズ，６０２クロックの実行タイムとなる。また、割込関数に対しては、レジスタバンク機能が用いられる。
【００６２】
本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードは、１関数あたり、システムレジスタの退避命令，復帰命令１個ずつと、レジスタバンクの切替命令１個と、レジスタ領域以外のデータ領域の読込命令３個とからなり、また、割込関数に対してレジスタバンク機能が用いられず、１割込関数あたり、レジスタの退避命令，復帰命令３個ずつからなり、本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードのＲＯＭサイズ，実行タイムは、９関数分と割込関数分とを合計したものになり、割込関数の数により、次のようになる。
0003566602.tif 000003
したがって、従来のコンパイル方法に対する、本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードのＲＯＭサイズ差，実行タイム差は、割込関数の数により、次のようになる。
0003566602.tif 000004
上述のように、従来のコンパイル方法に対する、本実施形態のコンパイル方法のＲＯＭサイズ差，実行タイム差は、レジスタバンク数が４つの場合、割込関数が多い４個のときＲＯＭサイズが逆転するが、割込関数が少なくなるに従って、ＲＯＭサイズが最大２８％削減され、実行タイムが最大６３％改善される。
次に、本発明のコンパイル方法の実施形態２について図面を参照して説明する。図６〜７は、本発明のコンパイル方法の実施形態２における処理手順例を示す流れ図である。
【００６３】
図６〜７参照すると、本実施形態のコンパイル方法における処理手順は、図１〜２，図１０〜１１の実施形態１，従来の処理ステップ１０１〜１０８，ステップ８ｘｘを組み合わせ、さらに、ステップ５０１〜５０４を追加した構成であり、従来技術と同様に、割込関数にレジスタバンクを使用可能とし、さらに、割込関数が使用するレジスタバンクの数をユーザ指定するものである。これら処理ステップの中で、ステップ１０１〜１０８，ステップ８ｘｘについては、図１〜２，図１０〜１１に示された実施形態１，従来のコンパイル方法における各ステップと同処理であり重複説明を省略し、本実施形態のコンパイル方法における特徴を示すステップ５０１〜５０４の処理手順について、次に説明する。
【００６４】
まず、ステップ５０１で、指定レジスタバンク値解析処理が行われ、割込関数にレジスタバンクを割当てる場合、コンパイラ起動時のオプションにより、コンパイラに対して割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析し、この数値をユーザ指定レジスタバンク数として記憶する。
【００６５】
ステップ８０４の割込関数開始判定の結果に対応して、ステップ８０７のレジスタバンク番号判定で範囲内である場合、ステップ５０２で、レジスタバンク番号ユーザ指定判定が行われ、ステップ８０６のレジスタバンク番号読込処理で読込んだレジスタバンク番号がユーザ指定のレジスタバンク数の範囲内であるか判定し、範囲内，範囲外に対応してステップ８０８，ステップ８１１に進む。
【００６６】
ステップ８１０の関数開始判定の結果に対応して、ステップ１０１の関数ネストレベル読込処理の後、ステップ５０３で、関数ネストレベル判定が行われ、ユーザ指定のレジスタバンク数と関数ネストレベルとを加算した値がレジスタバンク番号の範囲内であるか判定し、範囲内，範囲外に対応してステップ１０３，ステップ８１１に進み、ステップ１０３の再帰関数判定で再帰関数でなければ、ステップ５０４で、レジスタバンク割当処理が行われ、構文の示す関数で使用するレジスタバンク番号を、ユーザ指定レジスタバンク数と関数ネストレベルとを加算した値に設定し、ステップ１０５に進む。
【００６７】
次に、本実施形態のコンパイル方法により図９のソースファイル例をコンパイルする具体例について図面を参照して説明する。ここで、図８は、図９のソースファイル例に対して作成されたシンボルテーブル例を示す説明図である。
【００６８】
まず、ステップ５０１で、指定レジスタバンク値解析処理が行われ、コンパイラ起動時のオプションにより、コンパイラに対して割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析し、この数値をユーザ指定レジスタバンク数として記憶し、ここでは、ユーザ指定のレジスタバンク数「１」を得たとする。例えば、ユーザがコンパイラ起動時のオプションとして「−ｒｂ１」を指定すると、「−ｒｂ」で、割込関数に使用するレジスタバンクを示しているオプションであることが判り、直後の「１」で、ユーザ指定レジスタバンク数が判る。
【００６９】
次に、ステップ８０１で、構文解析処理が行われ、図９のソースファイル例の１行目よりプラグマ文「＃ｐｒａｇｍａ  ｉｎｔｅｒｒｕｐｔ  ＩＮＴＰ０  ｆｕｎｃ１３  ｒｂ１」を読込み、従来技術と同様にシンボルｆｕｎｃ１３が割込関数でレジスタバンク（１）を使用することを解析し、図８のシンボルテーブルにおけるシンボル情報６０３のレジスタバンク情報に（１）を設定する。ここで、プラグマ文とは、Ｃコンパイラへの制御命令で、ソースファイル中に「＃ｐｒａｇｍａ」で書き始めるＣ言語の言語仕様であり、コンパイラ独自の拡張仕様を設定できる。図９の例では、ＩＮＴＰ０割込み（ｉｎｔｅｒｒｕｐｔ）が発生した時に割込関数ｆｕｎｃ１３が呼出され、その時のレジスタバンクに１を使用することを示す。
【００７０】
続いて、図９のソースファイル例における各行の構文に対応した処理が行われる。例えば図９の２５行目に対しては、割込関数にレジスタバンクを割当てる場合に相当する以下の処理が行われる。
【００７１】
ステップ８０２で、一構文読込処理が行われ、構文（ｖｏｉｄ  ｆｕｎｃ１３（ｖｏｉｄ）｛  ）を読込み、終了構文判定８０３で該構文が終了の構文でないと判定する。ステップ８０４で、割込関数開始判定が行われ、構文が割込関数開始を示す構文と判定し、ジスタバンク番号設定判定が行われ、図８のシンボルテーブルのシンボル情報６０３のレジスタバンク情報により、構文の割込関数にレジスタバンク番号が設定されていると判定し、ステップ８０６で、レジスタバンク番号の読込処理が行われ、構文の割込関数に設定しているレジスタバンク番号「１」を読込み、ステップ８０４で、レジスタバンク番号判定８０７が行われ、レジスタバンク番号「１」がマイクロコントローラで許容されている番号であると判定し、ステップ５０２に進む。
【００７２】
ステップ５０２で、レジスタバンク番号ユーザ指定判定が行われ、レジスタバンク番号「１」がユーザ指定のレジスタバンク数「１」の範囲内であると判定し、ステップ８０８で、レジスタバンク切替処理が行われ、構文の割込関数にレジスタバンク番号「１」を割当て、ステップ８０９で、その他の処理が行われ、ステップ８０２の一構文読込処理に戻る。
【００７３】
また、例えば図９の２８行目に対しては、割込関数以外にレジスタバンクを割当てる場合に相当する以下の処理を行う。
【００７４】
まず、ステップ８０２で、一構文読込処理が行われ、構文（ｉｎｔ  ｆｕｎｃ１１（ｖｏｉｄ）｛  ）を読込み、ステップ８０３で、終了構文判定が行われ、構文が終了の構文でないと判定する。ステップ８０４で、割込関数開始判定が行われ、構文が割込関数開始の構文でないと判定し、ステップ８１０で、関数開始判定が行われ、構文が関数開始の構文と判定し、ステップ１０１で、関数ネストレベル読込処理が行われ、構文の関数の関数ネストレベル「１」を読込み、ステップ５０３に進む。
【００７５】
ステップ５０３で、関数ネストレベル判定が行われ、ユーザ指定のレジスタバンクの数「１」と関数ネストレベル「１」とを加算した値「２」が、レジスタバンク番号の範囲内であると判定し、ステップ１０３で、再帰関数判定１０３が行われ、図８のシンボルテーブルにおけるシンボル情報６０２の再帰情報により、構文の関数が再帰関数でないと判定し、ステップ５０４で、レジスタバンク割当処理が行われ、構文の関数で使用するレジスタバンク番号が加算した値「２」に設定され、図８のシンボルテーブルにおけるシンボル情報６０２のレジスタバンク情報に（２）を設定する。
【００７６】
この後、ステップ１０５，８０８，８０９で、システムレジスタの退避処理，レジスタバンク切替処理，その他の処理８０９が行われ、ステップ８０２の一構文読込処理８０２に戻る。
【００７７】
次に、本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードによる効果について、具体的に説明する。
【００７８】
本実施形態により生成される関数開始，終了または呼出処理部のコードの命令は、実施形態１で説明したコンパイル対象のマイクロコントローラの各命令と同じＲＯＭサイズ，実行タイムを要するとする。
【００７９】
また、上記のコンパイル対象のマイクロコントローラが制御できるレジスタバンクの数を４つとし、図９に示すソースファイル例が入力され、図３に示す関数ネストレベルを持ち、割込関数が１つあるとすると、本実施形態では、図３に示すネストレベル１〜２の５個の関数がレジスタバンク切替を使用できる。さらに、１関数当たり３つのレジスタを使用し、３回ずつ関数呼出を行っている場合について、本実施形態および従来のコンパイル方法により生成される関数開始，終了または呼出処理部のコードにおけるＲＯＭサイズ差，実行タイム差を求めてみる。
【００８０】
先ず、従来のコンパイル方法により生成される関数開始，終了または呼出処理部のコードは、１関数あたり、レジスタの退避命令，復帰命令３個ずつと、レジスタの返り値読込命令３個とからなるので、５関数で９０バイトのＲＯＭサイズ，３９０クロックの実行タイムとなる。また、割込関数に対しては、レジスタバンク機能が用いられる。
【００８１】
本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードは、１関数あたり、システムレジスタの退避命令，復帰命令１個ずつと、レジスタバンクの切替命令１個と、レジスタ領域以外のデータ領域の読込命令３個とからなるので、５関数で６５バイトのＲＯＭサイズ，１４５クロックの実行タイムとなる。また、割込関数に対しては、従来と同様に、レジスタバンク機能が用いられる。
【００８２】
したがって、従来のコンパイル方法に対する、本実施形態のコンパイル方法により生成される関数開始，終了または呼出処理部のコードのＲＯＭサイズ差，実行タイム差は、−２５バイト，−２４５クロックとなり、レジスタバンク数が４つの場合、ＲＯＭサイズが３１％削減され，実行タイムが６３％改善される。また、実施形態１で割込関数が同数の場合と比較しても、ＲＯＭサイズまたは実行タイムの値が削減または改善されることが判る。
【００８３】
さらに、本実施形態では、マイクロコントローラによってレジスタバンクの数が増えた場合、割込関数に使用するレジスタバンクの数を増やすことができ、割込関数が例えば４個以上になっても同じ効果が得られるものである。
【００８４】
【発明の効果】
以上説明したように、本発明は、レジスタバンク機能を持つマイクロコントローラに対して作成されたソースプログラムをコンパイル対象とするコンパイル方法において、レジスタバンク機能を割込関数以外の関数にも適用することにより、プログラムのＲＯＭサイズを著しく削減し、プログラムの実行タイムを著しく改善する効果がある。
【図面の簡単な説明】
【図１】本発明によるコンパイル方法の実施形態１の１部を示す流れ図である。
【図２】本発明によるコンパイル方法の実施形態１の他部分を示す流れ図である。
【図３】図１〜２の実施形態１のコンパイル方法で参照される関数ネストレベル対応情報例を示す説明図である。
【図４】図１〜２の実施形態１のコンパイル方法で参照されるシンボルテーブル例を示す説明図であある。
【図５】図１〜２の実施形態１のコンパイル方法によるアセンブラプリントファイル出力例を示す説明図である。
【図６】本発明によるコンパイル方法の実施形態２の１部を示す流れ図である。
【図７】本発明によるコンパイル方法の実施形態２の他部分を示す流れ図である。
【図８】図６〜７の実施形態２のコンパイル方法で参照されるシンボルテーブル例を示す説明図である。
【図９】コンパイル対象のソースファイル例を示す説明図である。
【図１０】従来コンパイル方法の処理手順例の１部を示す流れ図である。
【図１１】従来コンパイル方法の処理手順例の他部分を示す流れ図である。
【図１２】従来のコンパイル方法によるアセンブラプリントファイル出力例を示す説明図である。
【符号の説明】
１０１〜１０８，５０１〜５０４，８０１〜８２０    ステップ
２０１〜２１１，６０１〜６１１    シンボル情報
【図１】
0003566602.tif 000005
【図２】
0003566602.tif 000006
【図３】
0003566602.tif 000007
【図４】
0003566602.tif 000008
【図５】
0003566602.tif 000009
【図６】
0003566602.tif 000010
【図７】
0003566602.tif 000011
【図８】
0003566602.tif 000012
【図９】
0003566602.tif 000013
【図１０】
0003566602.tif 000014
【図１１】
0003566602.tif 000015
【図１２】
0003566602.tif 000016