JP3566602B2 - コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 - Google Patents
コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 Download PDFInfo
- Publication number
- JP3566602B2 JP3566602B2 JP31437599A JP31437599A JP3566602B2 JP 3566602 B2 JP3566602 B2 JP 3566602B2 JP 31437599 A JP31437599 A JP 31437599A JP 31437599 A JP31437599 A JP 31437599A JP 3566602 B2 JP3566602 B2 JP 3566602B2
- Authority
- JP
- Japan
- Prior art keywords
- function
- register
- register bank
- syntax
- interrupt
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Executing Machine-Instructions (AREA)
- Devices For Executing Special Programs (AREA)
Description
【発明の属する技術分野】
本発明はコンパイル方法に関し、特に、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムをコンパイルするコンパイル方法に関する。
【0002】
【従来の技術】
従来、この種のコンパイル方法は、記録媒体に記録されたコンパイル用プログラム(またはコンパイラ)を読み取り実行するコンピュータ,ワークステーションなど、一般的なハードウェア構成のデータ処理装置により処理され、コンパイル対象とするマイクロコントローラに対応して処理される。
【0003】
コンパイル対象とするマイクロコントローラの1つとして、レジスタバンク機能を有するものがある。このレジスタバンク機能とは、例えば、マイクロコントローラが12個の8ビットレジスタX,A,C,B,R4,R5,R6,R7,V,U,T,Wと4個の16ビットレジスタVP,UP,DE,HLとを1つのレジスタバンクとして4つのレジスタバンクを備え、これらレジスタバンクの1つのレジスタバンク番号がCPUの制御命令selにより指定されレジスタバンク切替が行われる機能である。レジスタバンク1を使用するときは、制御命令として「sel rb1」のように記述し、レジスタバンク1に切替えて使用することができ、このレジスタバンク切替により、使用しているレジスタを個々に退避する必要がなくなる。また、割込みが発生すると、マイクロコントローラが、レジスタバンクなどのプログラムステータスワードを含むシステムレジスタpswを割込み発生時点で自動的に退避し、割込関数から戻るときには、復帰命令retiにより、システムレジスタpswの復帰も自動的に行う。
【0004】
図9は、このレジスタバンク機能を有するマイクロコントローラに対応したコンパイル方法を説明するための説明図であり、レジスタバンク機能を有するマイクロコントローラに対応して作成されたソースプログラムのソースファイル例を示す。
【0005】
また、図10〜11は、この従来のコンパイル方法の処理手順例を示す流れ図である。この従来のコンパイル方法は、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、ソースプログラムをコンパイルする。
【0006】
図10〜11を参照すると、この従来のコンパイル方法の処理手順例は、先ず、ステップ801で、ソースプログラムを構文解析する構文解析処理が行われ、入力ソースファイルより文字を読込み、意味のある文字単位の構文に分割し、コンパイラの言語仕様で定められた予約語int,voidと区切り子以外のシンボルをシンボルテーブルに登録する。
【0007】
ステップ802で、一構文読込処理が行われ、構文解析処理により解析した構文を一構文読込み、ステップ803で、読み込んだ構文が入力ソースファイルの終了を示す構文か判定する。この判定は、コンピュータ内のファイルの最後に通常入っているEOF(End Of File)を示す記号(−1)により行われ、この判定結果でソースファイルの終了を示す構文でない場合は、ステップ804,810,812,814または818に進み、割込関数または割込関数以外の関数の開始,終了または呼出を示す構文か判定する。
【0008】
ステップ804では、割込関数開始判定が行われ、関数名を示すシンボルの直後に‘{’があることにより、関数の開始であることを判定し、シンボルテーブルの参照より、割込関数であることを判定し、読み込んだ構文が割込関数開始を示す構文か判定する。同様に、ステップ810で、割込関数以外の関数開始判定が行われる。また、ステップ812では、割込関数終了判定が行われ、関数開始の‘{’に対応した‘}’があることにより、関数の終了であることを判定し、シンボルテーブルの参照より、割込関数であることを判定する。同様に、ステップ814で関数終了判定が行われる。さらに、ステップ818で、関数呼出判定が行われ、関数内の処理中にシンボルの直後に‘(’と‘)’とがあることにより判定する。ただし、この括弧内には引数がある場合と何もない場合とがある。
【0009】
ステップ804の割込関数開始の判定結果に対応して、ステップ805に進み、レジスタバンク番号設定判定が行われ、ステップ802の一構文読込処理で読込んだ構文の示す割込関数にレジスタバンク番号が設定されているか判定し、設定または未設定の判定結果に対応して、ステップ806または811に進む。ステップ806では、レジスタバンク番号読込処理が行われ、読込んだ構文の示す割込関数に設定しているレジスタバンク番号を読込み、ステップ807で、レジスタバンク番号判定が行われ、読み込んだレジスタバンク番号がマイクロコントローラで許容されている範囲内か判定し、範囲内または範囲外の判定結果に対応して、ステップ808または811に進む。ステップ808では、レジスタバンク切替処理が行われ、レジスタバンク切替を行うコードを生成する。
【0010】
また、ステップ810の関数開始の判定結果に対応して、ステップ811に進み、使用レジスタの退避処理が行われ、使用レジスタの内容を退避するコードを生成する。
【0011】
また、ステップ812の割込関数終了の判定結果に対応して、割込関数には返り値を設定できなく返り値判定を行う必要はないので、ステップ813に進み、レジスタバンク切替判定が行われ、シンボルテーブルの参照により、ステップ808のレジスタバンク切替が行われたか判定し、レジスタバンク切替の判定結果に対応して、ステップ817に進み、使用レジスタの復帰処理が行われ、使用レジスタの内容を復帰するコードを生成する。
【0012】
また、ステップ814の関数終了の判定結果に対応して、ステップ815に進み、返り値判定が行われ、読み込んだ構文の示す関数が返り値を返すか判定する。この判定は、関数呼出のシンボルの直前に‘=’があることで判定され、返り値を返す場合は、ステップ816で、返り値設定処理が行われ、返り値をレジスタに設定するコードを生成し、ステップ817に進む。
【0013】
さらに、ステップ818の関数呼出の判定結果に対応して、ステップ819に進み、返り値判定が行われ、読み込んだ構文の示す関数が返り値を返すか判定し、返り値を返す場合は、ステップ820に進み、返り値読込処理が行われ、返り値をレジスタから読込むコードを生成する。
【0014】
これらステップ804〜808,810〜820の処理の後に、ステップ809に進み、その他の処理が行なわれ、ステップ802の一構文読込処理に戻る。
【0015】
上記の一連の動作により、図9に示すソースファイル例に対して、図12に示すアセンブラプリントファイル出力例を得ることができる。
【0016】
【発明が解決しようとする課題】
この従来のコンパイル方法では、次のような問題点があった。
【0017】
第1の問題点は、割込関数がマイクロコントローラで許容しているレジスタバンクの数より少ないプログラムにおいては、使用しないレジスタバンクがあるにも拘わらず、関数を呼出す度に呼出された関数で、使用するレジスタの退避、復帰が必要となり、ROMサイズと実行タイムが共に良くないということである。
【0018】
その理由は、レジスタを使用している状態で関数を呼出した場合、呼出された関数で同じレジスタを他の用途で使用してしまうと、呼出した関数に戻ったときにレジスタの内容が変わってしまう。そのため呼出された関数で使用しているレジスタを退避および復帰する必要があるが、複数のレジスタを使用している場合は、使用している全てのレジスタを退避、復帰しなければならず、頻繁に関数を呼出すような場合、その退避および復帰に要する命令だけで大きな割合を占め、ROMサイズと実行タイムとが共に悪くなってしまうためである。
【0019】
したがって、本発明の目的は、レジスタバンク機能を持つマイクロコントローラに対して作成されたプログラムのROMサイズを削減し実行タイムを改善することにある。
【0020】
【課題を解決するための手段】
そのため、本発明は、複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、
各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成している。
【0021】
または、本発明は、複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、
各割込要求に対応した割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析しユーザ指定レジスタバンク数として記憶し、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成し、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成している。
【0022】
また、前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成している。
【0023】
さらに、前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成している。
【0024】
【発明の実施の形態】
次に、本発明について図面を参照して説明する。本発明のコンパイル方法は、従来のコンパイル方法と同じく、記録媒体に記録されたコンパイル用プログラムまたはコンパイラを読み取り実行するコンピュータ,ワークステーションなど、一般的なハードウェア構成のデータ処理装置により処理され、コンパイル対象とするマイクロコントローラに対応して処理される。
【0025】
図1〜2は、本発明のコンパイル方法の実施形態1における処理手順例を示す流れ図である。この実施形態のコンパイル方法は、図10〜11に示された従来のコンパイル方法における処理手順例と同じく、レジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、ソースプログラムをコンパイルする。
【0026】
図1〜2を参照すると、本実施形態のコンパイル方法における処理手順は、ステップ101〜108と各ステップ8xxとを含み、これらの中で、各ステップ8xxについては、図10〜11に示された従来のコンパイル方法における各ステップと同処理であり重複説明を省略し、本実施形態のコンパイル方法における特徴を示すステップ101〜108の処理手順について、次に説明する。
【0027】
ステップ810の関数開始判定の結果に対応して、割込関数以外の関数の開始を示す構文に対してステップ101に進み、関数ネストレベル読込処理が行われ、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込む。この関数ネストレベルは、ワークステーションの標準OSとして用いられているUNIXのcflowコマンドで代表される公知技術により作成され、ここでは、権利化対象外とし、例えば、図3に説明図として示す関数ネストレベル対応情報例が図9のソースファイル例に対して別ツールで作成され読込まれることとする。
【0028】
ステップ102で、関数ネストレベル判定が行われ、ステップ101で読み込んだ関数ネストレベルがマイクロコントローラで許容されているレジスタバンク番号の範囲内であるか判定し、レジスタバンク番号の範囲内または範囲外の判定結果に対応してステップ103または811に進む。ここで、コンパイラはコンパイル対象とするマイクロコントローラごとに作成され、レジスタバンクの数を固定情報として保持し、レジスタバンク番号の範囲も固定である。このレジスタバンク番号の許容範囲はプログラム開始関数で使用する「0」を除く最大値までであり、プログラム開始関数mainの関数ネストレベルは「0」であり、デフォールトのレジスタバンク番号も通常「0」である。
【0029】
ステップ103で、再帰関数判定が行われ、シンボルテーブルの参照より、読み込んだ構文の示す関数が再帰関数か判定する。再帰関数の場合、再帰関数はプログラム実行時(動的)でないと関数の呼出し関係と呼出しの深さを示す関数ネストレベルが判らないため、レジスタバンク機能を使用せず、ステップ811に進み、再帰関数でない場合ステップ104に進む。
【0030】
ステップ104で、レジスタバンク割当処理が行われ、ステップ102で読み込んだ関数ネストレベルをレジスタバンク番号として割当て、シンボルテーブルにレジスタバンクの情報を登録する。
【0031】
ステップ105で、システムレジスタの退避処理が行われ、システムレジスタを退避するコードを生成し、ステップ808に進む。これは、システムレジスタには現在使用中のレジスタバンク番号の情報が含まれており、従来技術では、割込関数が呼出される場合に、マイクロコントローラが自動的に行う処理である。
【0032】
また、ステップ814の関数終了判定の結果に対応して、関数の終了を示す構文の関数が返り値を返す場合ステップ106に進み、返り値設定処理が行われ、返り値をレジスタ領域以外のデータ領域に設定するコードを生成し、ステップ813のレジスタバンク切替判定の判定結果に対応して、システムレジスタの復帰を行うコードを生成する。
【0033】
さらに、ステップ818の関数呼出判定の結果に対応して、関数の呼出を示す構文の関数が返り値を返す場合ステップ108に進み、返り値読込処理が行われ、返り値をレジスタ領域以外のデータ領域から読み込むコードを生成する。
【0034】
このように、本実施形態のコンパイル方法は、レジスタバンク機能を持つマイクロコントローラにおいて、従来、ROMサイズが小さく実行タイムが早くなるレジスタバンク機能を割込関数にのみ適用していたが、これを割込関数以外の関数に適用する構成を提供するものである。
【0035】
次に、本実施形態のコンパイル方法により図9のソースファイル例をコンパイルする具体例について図面を参照して説明する。ここで、図4は、図9のソースファイル例に対して作成されたシンボルテーブル例を示す説明図であり、図5は、本実施形態のコンパイル方法を具体的に説明するための説明図であり、アセンブラプリントファイル出力例を示す。また、コンパイル対象とするマイクロコントローラごとにコンパイラを作成するため、コンパイラはコンパイル対象のマイクロコントローラのレジスタバンク数を固定情報として保持し、ここでは、効果が判り易いように、コンパイル対象のマイクロコントローラのレジスタバンク数を4つとする。
【0036】
まず、ステップ801では、構文解析処理が行われ、入力ソースファイルの終了EOFまで全ての解析を行い、図4のシンボルテーブルの作成を行う。
【0037】
例えば、図9に示すソースファイル例の3行目の意味は、関数の前方参照を可能とするためのプロトタイプ宣言として関数の型を事前に宣言するものであり、voidは何もないことを示す型である。このソースファイル例の3行目に対して、入力ソースファイルより「int func11(void);」を読込み、予約語int、voidと区切り子以外のシンボルfunc11を、図4のシンボルテーブルのシンボル情報202に、シンボル名(func11),型(int),種別(関数),クラス(外部),値(なし),返り値(あり),引数(なし),再帰(なし)として登録する。ただし、レジスタバンクとレジスタバンク番号は、ステップ104におけるレジスタバンク割当処理で登録される。
【0038】
続いて、図9のソースファイル例における各行の構文に対応した処理が行われる。例えば図9の28行目に対しては、関数にレジスタバンクを割当てる場合に相当する以下の処理が行われる。
【0039】
まず、ステップ802で、一構文読込処理が行われ、構文(int func11(void){ )を読込み、ステップ803で、終了構文判定が行われ、読込んだ構文が終了EOFの構文でないと判定し、ステップ804に進み、割込関数開始判定が行われて、最後の‘{’で関数の開始であるか判定し且つ図4のシンボルテーブルの関数func11を参照しシンボル情報202のクラス情報から割込関数でないか判定して、読込んだ構文が割込関数開始の構文でないと判定する。ステップ810に進み、関数開始判定が行われ、読込んだ構文が関数開始の構文と判定し、ステップ101に進む。
【0040】
ステップ101で、関数ネストレベル読込処理が行われ、図3の関数ネストレベル対応情報例を参照し、読込んだ構文の示す関数func11の関数ネストレベル「1」を読込み、ステップ102で、関数ネストレベル判定が行われ、読込んだ関数ネストレベルが「1」でありレジスタバンク番号「4」の範囲内であると判定し、ステップ103に進む。
【0041】
ステップ103で、再帰関数判定が行われ、読込んだ構文の示す関数func11が図4のシンボルテーブルの関数func11を参照し図5のシンボル情報202の再帰情報から再帰関数でないと判定し、または、図3の関数ネストレベル対応情報で示される関数名の直後に「*」記号が付加されていることにより再帰関数であると判定し、ステップ104に進む。
【0042】
ステップ104で、レジスタバンク割当処理が行われ、読込んだ構文の示す関数func11で使用するレジスタバンク番号を関数ネストレベル対応情報と同じ「1」に設定し、図4のシンボルテーブルのシンボル情報202におけるレジスタバンク情報,レジスタバンク番号情報に「切替」,「1」をそれぞれ登録し、ステップ105で、システムレジスタの退避処理が行われて、システムレジスタの内容を退避するコードが生成され、ステップ808で、レジスタバンク切替処理が行われ、レジスタバンクを「1」に切替えるコードを成する。図5のアセンブラプリントファイル出力例における000014番地のコードpush pswと000015番地のコードsel rb1とが、上述のステップ105,804で生成されたコードにそれぞれ相当する。
【0043】
これら処理の後、ステップ809でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ802の一構文読込処理に戻る。
【0044】
また、例えば図9の33行目に対しては、レジスタバンクを割当てる関数を呼出す場合に相当する以下の処理が行われる。
【0045】
まず、ステップ802で、一構文読込処理が行われ、構文(var1 = func21(); )を読込み、ステップ803で、終了構文判定が行われて、読込んだ構文が終了EOFの構文でないと判定し、ステップ804,810,812,814で、割込関数開始判定,関数開始判定,割込関数終了判定,関数終了判定が行われ、読込んだ構文が割込関数開始,関数開始,割込関数終了,関数終了の構文でないと判定し、ステップ818に進み、関数呼出判定が行われ、シンボルの直後に‘(’と、‘)’があるか判定することにより、読込んだ構文が関数呼出の構文であると判定し、ステップ819に進む。
【0046】
ステップ819で、返り値判定が行われ、図4のシンボルテーブルにおけるシンボル情報204の返り値情報を判定することにより、読込んだ構文の示す関数func21に返り値があると判定する。返り値ありと判定された場合、ステップ108に進み、返り値読込処理が行われ、返り値をレジスタ領域以外のデータ領域から読み込むコードを生成する。例えば、図5のアセンブラプリントファイル出力例における00001E番地のコードmovw rp3,_retvalが、上述のステップ108で生成されたコードに相当する。このコードの構成部分rp3はシンボルvar1が使用しているレジスタ名であり、このコードの構成部分_retvalは、コンパイラが確保したレジスタ領域以外のデータ領域を示す。
【0047】
これら処理の後、ステップ809でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ802の一構文読込処理に戻る。
【0048】
また、例えば図9の37行目,38行目に対しては、レジスタバンクを割当てた関数を終了する場合に相当する以下の処理が行われる。
【0049】
まず、同様に、ステップ802で、構文(return var4; })を読込み、ステップ803で、読込んだ構文が終了EOFの構文でないと判定し、ステップ804,810,812で、読込んだ構文が割込関数開始,関数開始,割込関数終了の構文でないと判定し、ステップ814で関数終了判定が行われ 、構文の最後の‘}’で関数の終了であるか判定し且つ図5のシンボル情報202のクラスにより割込関数でないか判定することにより、関数終了の構文と判定し、ステップ815に進む。
【0050】
ステップ815で、返り値判定が行われ、図4のシンボルテーブルにおけるシンボル情報202の返り値情報を判定することにより、関数func11に返り値があると判定する。返り値があると判定された場合、ステップ106に進み、返り値設定処理が行われ、返り値をレジスタ領域以外のデータ領域に設定するコードを生成する。例えば、図5のアセンブラプリントファイル出力例における000036番地のmovw _retval,axが、上述のステップ106で生成されたコードに相当する。このコードの構成部分axはシンボルvar4が使用しているレジスタ名である。
【0051】
ステップ813で、レジスタバンク切替判定が行われ、関数開始時にレジスタバンク割当またはレジスタバンク切替を行ったかを判定する。この判定は、図4のシンボルテーブルにおけるシンボル情報202のレジスタバンク情報を判定することにより行われ、切替の判定結果に対応して、ステップ107に進み、システムレジスタの復帰処理が行われ、退避したシステムレジスタの内容の復帰を行うコードを生成する。例えば、図5のアセンブラプリントファイル出力例における00003C番地のpop pswが、上述のステップ107で生成されたコードに相当する。
【0052】
これら処理の後、ステップ809でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ802の一構文読込処理に戻る。
【0053】
また、図9の52行目に対して、割込関数にレジスタバンクを割り当てない場合に相当する以下の処理が行われる。
【0054】
まず、ステップ802で、構文(void func13(void){ )を読込み、ステップ803で、読込んだ構文が終了EOFの構文でないと判定され、ステップ804で、割込関数開始判定が行われ、読込んだ構文が割込関数開始の構文であると判定し、ステップ811で、使用レジスタの退避処理が行われ、使用レジスタの内容の退避を行うコードをが生成する。
【0055】
ここで、割込関数はレジスタバンクを切替えないため、図4のシンボルテーブルにおけるシンボル情報202のレジスタバンク情報は「変更なし」であり、レジスタバンク番号は割込みが発生した時点のレジスタバンク番号をそのまま使用するため、図4のシンボルテーブルにおけるシンボル情報202の登録は何も行わない。
【0056】
これら処理の後、ステップ809でその他の処理が行われ、本発明に影響のないコンパイラの内部処理を行い、ステップ802の一構文読込処理に戻る。
【0057】
上記の一連の処理を図9のソースファイル例に対し行うことにより、図5に示すアセンブラプリントファイル出力例を得ることができる。
【0058】
次に、本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードによる効果について、従来のコンパイル方法と比較して具体的に説明する。
【0059】
本実施形態または従来のコンパイル方法により生成される関数開始,終了または呼出処理部のコードの命令は、レジスタの退避命令/復帰命令(push reg/pop reg),レジスタの返り値読込命令/書込命令(movw rp3,bc/movw bc,ax),レジスタ領域以外のデータ領域の返り値読込命令/書込命令(movw rp3,_retval/movw _retval,ax),システムレジスタの退避命令/復帰命令(push psw/pop psw),レジスタバンクの切替命令(sel rb1)である。
【0060】
ここで、これら各命令が、コンパイル対象のマイクロコントローラにおいて、次に示すROMサイズ,実行タイムを要するとする。
また、上記のコンパイル対象のマイクロコントローラが制御できるレジスタバンクの数を4つとし、図9に示すソースファイルが入力され、図3に示す関数ネストレベルを持つとすると、本実施形態1では、図3に示すネストレベル1〜3の9個の関数がレジスタバンク切替を使用できる。さらに、1関数当たり3つのレジスタを使用し、3回ずつ関数呼出を行っている場合について、本実施形態および従来のコンパイル方法により生成される関数開始,終了または呼出処理部のコードにおけるROMサイズ差,実行タイム差を求めてみる。
【0061】
先ず、従来のコンパイル方法により生成される関数開始,終了または呼出処理部のコードは、1関数あたり、レジスタの退避命令,復帰命令3個ずつと、レジスタの返り値読込命令3個とからなるので、9関数で162バイトのROMサイズ,602クロックの実行タイムとなる。また、割込関数に対しては、レジスタバンク機能が用いられる。
【0062】
本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードは、1関数あたり、システムレジスタの退避命令,復帰命令1個ずつと、レジスタバンクの切替命令1個と、レジスタ領域以外のデータ領域の読込命令3個とからなり、また、割込関数に対してレジスタバンク機能が用いられず、1割込関数あたり、レジスタの退避命令,復帰命令3個ずつからなり、本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードのROMサイズ,実行タイムは、9関数分と割込関数分とを合計したものになり、割込関数の数により、次のようになる。
したがって、従来のコンパイル方法に対する、本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードのROMサイズ差,実行タイム差は、割込関数の数により、次のようになる。
上述のように、従来のコンパイル方法に対する、本実施形態のコンパイル方法のROMサイズ差,実行タイム差は、レジスタバンク数が4つの場合、割込関数が多い4個のときROMサイズが逆転するが、割込関数が少なくなるに従って、ROMサイズが最大28%削減され、実行タイムが最大63%改善される。
次に、本発明のコンパイル方法の実施形態2について図面を参照して説明する。図6〜7は、本発明のコンパイル方法の実施形態2における処理手順例を示す流れ図である。
【0063】
図6〜7参照すると、本実施形態のコンパイル方法における処理手順は、図1〜2,図10〜11の実施形態1,従来の処理ステップ101〜108,ステップ8xxを組み合わせ、さらに、ステップ501〜504を追加した構成であり、従来技術と同様に、割込関数にレジスタバンクを使用可能とし、さらに、割込関数が使用するレジスタバンクの数をユーザ指定するものである。これら処理ステップの中で、ステップ101〜108,ステップ8xxについては、図1〜2,図10〜11に示された実施形態1,従来のコンパイル方法における各ステップと同処理であり重複説明を省略し、本実施形態のコンパイル方法における特徴を示すステップ501〜504の処理手順について、次に説明する。
【0064】
まず、ステップ501で、指定レジスタバンク値解析処理が行われ、割込関数にレジスタバンクを割当てる場合、コンパイラ起動時のオプションにより、コンパイラに対して割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析し、この数値をユーザ指定レジスタバンク数として記憶する。
【0065】
ステップ804の割込関数開始判定の結果に対応して、ステップ807のレジスタバンク番号判定で範囲内である場合、ステップ502で、レジスタバンク番号ユーザ指定判定が行われ、ステップ806のレジスタバンク番号読込処理で読込んだレジスタバンク番号がユーザ指定のレジスタバンク数の範囲内であるか判定し、範囲内,範囲外に対応してステップ808,ステップ811に進む。
【0066】
ステップ810の関数開始判定の結果に対応して、ステップ101の関数ネストレベル読込処理の後、ステップ503で、関数ネストレベル判定が行われ、ユーザ指定のレジスタバンク数と関数ネストレベルとを加算した値がレジスタバンク番号の範囲内であるか判定し、範囲内,範囲外に対応してステップ103,ステップ811に進み、ステップ103の再帰関数判定で再帰関数でなければ、ステップ504で、レジスタバンク割当処理が行われ、構文の示す関数で使用するレジスタバンク番号を、ユーザ指定レジスタバンク数と関数ネストレベルとを加算した値に設定し、ステップ105に進む。
【0067】
次に、本実施形態のコンパイル方法により図9のソースファイル例をコンパイルする具体例について図面を参照して説明する。ここで、図8は、図9のソースファイル例に対して作成されたシンボルテーブル例を示す説明図である。
【0068】
まず、ステップ501で、指定レジスタバンク値解析処理が行われ、コンパイラ起動時のオプションにより、コンパイラに対して割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析し、この数値をユーザ指定レジスタバンク数として記憶し、ここでは、ユーザ指定のレジスタバンク数「1」を得たとする。例えば、ユーザがコンパイラ起動時のオプションとして「−rb1」を指定すると、「−rb」で、割込関数に使用するレジスタバンクを示しているオプションであることが判り、直後の「1」で、ユーザ指定レジスタバンク数が判る。
【0069】
次に、ステップ801で、構文解析処理が行われ、図9のソースファイル例の1行目よりプラグマ文「#pragma interrupt INTP0 func13 rb1」を読込み、従来技術と同様にシンボルfunc13が割込関数でレジスタバンク(1)を使用することを解析し、図8のシンボルテーブルにおけるシンボル情報603のレジスタバンク情報に(1)を設定する。ここで、プラグマ文とは、Cコンパイラへの制御命令で、ソースファイル中に「#pragma」で書き始めるC言語の言語仕様であり、コンパイラ独自の拡張仕様を設定できる。図9の例では、INTP0割込み(interrupt)が発生した時に割込関数func13が呼出され、その時のレジスタバンクに1を使用することを示す。
【0070】
続いて、図9のソースファイル例における各行の構文に対応した処理が行われる。例えば図9の25行目に対しては、割込関数にレジスタバンクを割当てる場合に相当する以下の処理が行われる。
【0071】
ステップ802で、一構文読込処理が行われ、構文(void func13(void){ )を読込み、終了構文判定803で該構文が終了の構文でないと判定する。ステップ804で、割込関数開始判定が行われ、構文が割込関数開始を示す構文と判定し、ジスタバンク番号設定判定が行われ、図8のシンボルテーブルのシンボル情報603のレジスタバンク情報により、構文の割込関数にレジスタバンク番号が設定されていると判定し、ステップ806で、レジスタバンク番号の読込処理が行われ、構文の割込関数に設定しているレジスタバンク番号「1」を読込み、ステップ804で、レジスタバンク番号判定807が行われ、レジスタバンク番号「1」がマイクロコントローラで許容されている番号であると判定し、ステップ502に進む。
【0072】
ステップ502で、レジスタバンク番号ユーザ指定判定が行われ、レジスタバンク番号「1」がユーザ指定のレジスタバンク数「1」の範囲内であると判定し、ステップ808で、レジスタバンク切替処理が行われ、構文の割込関数にレジスタバンク番号「1」を割当て、ステップ809で、その他の処理が行われ、ステップ802の一構文読込処理に戻る。
【0073】
また、例えば図9の28行目に対しては、割込関数以外にレジスタバンクを割当てる場合に相当する以下の処理を行う。
【0074】
まず、ステップ802で、一構文読込処理が行われ、構文(int func11(void){ )を読込み、ステップ803で、終了構文判定が行われ、構文が終了の構文でないと判定する。ステップ804で、割込関数開始判定が行われ、構文が割込関数開始の構文でないと判定し、ステップ810で、関数開始判定が行われ、構文が関数開始の構文と判定し、ステップ101で、関数ネストレベル読込処理が行われ、構文の関数の関数ネストレベル「1」を読込み、ステップ503に進む。
【0075】
ステップ503で、関数ネストレベル判定が行われ、ユーザ指定のレジスタバンクの数「1」と関数ネストレベル「1」とを加算した値「2」が、レジスタバンク番号の範囲内であると判定し、ステップ103で、再帰関数判定103が行われ、図8のシンボルテーブルにおけるシンボル情報602の再帰情報により、構文の関数が再帰関数でないと判定し、ステップ504で、レジスタバンク割当処理が行われ、構文の関数で使用するレジスタバンク番号が加算した値「2」に設定され、図8のシンボルテーブルにおけるシンボル情報602のレジスタバンク情報に(2)を設定する。
【0076】
この後、ステップ105,808,809で、システムレジスタの退避処理,レジスタバンク切替処理,その他の処理809が行われ、ステップ802の一構文読込処理802に戻る。
【0077】
次に、本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードによる効果について、具体的に説明する。
【0078】
本実施形態により生成される関数開始,終了または呼出処理部のコードの命令は、実施形態1で説明したコンパイル対象のマイクロコントローラの各命令と同じROMサイズ,実行タイムを要するとする。
【0079】
また、上記のコンパイル対象のマイクロコントローラが制御できるレジスタバンクの数を4つとし、図9に示すソースファイル例が入力され、図3に示す関数ネストレベルを持ち、割込関数が1つあるとすると、本実施形態では、図3に示すネストレベル1〜2の5個の関数がレジスタバンク切替を使用できる。さらに、1関数当たり3つのレジスタを使用し、3回ずつ関数呼出を行っている場合について、本実施形態および従来のコンパイル方法により生成される関数開始,終了または呼出処理部のコードにおけるROMサイズ差,実行タイム差を求めてみる。
【0080】
先ず、従来のコンパイル方法により生成される関数開始,終了または呼出処理部のコードは、1関数あたり、レジスタの退避命令,復帰命令3個ずつと、レジスタの返り値読込命令3個とからなるので、5関数で90バイトのROMサイズ,390クロックの実行タイムとなる。また、割込関数に対しては、レジスタバンク機能が用いられる。
【0081】
本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードは、1関数あたり、システムレジスタの退避命令,復帰命令1個ずつと、レジスタバンクの切替命令1個と、レジスタ領域以外のデータ領域の読込命令3個とからなるので、5関数で65バイトのROMサイズ,145クロックの実行タイムとなる。また、割込関数に対しては、従来と同様に、レジスタバンク機能が用いられる。
【0082】
したがって、従来のコンパイル方法に対する、本実施形態のコンパイル方法により生成される関数開始,終了または呼出処理部のコードのROMサイズ差,実行タイム差は、−25バイト,−245クロックとなり、レジスタバンク数が4つの場合、ROMサイズが31%削減され,実行タイムが63%改善される。また、実施形態1で割込関数が同数の場合と比較しても、ROMサイズまたは実行タイムの値が削減または改善されることが判る。
【0083】
さらに、本実施形態では、マイクロコントローラによってレジスタバンクの数が増えた場合、割込関数に使用するレジスタバンクの数を増やすことができ、割込関数が例えば4個以上になっても同じ効果が得られるものである。
【0084】
【発明の効果】
以上説明したように、本発明は、レジスタバンク機能を持つマイクロコントローラに対して作成されたソースプログラムをコンパイル対象とするコンパイル方法において、レジスタバンク機能を割込関数以外の関数にも適用することにより、プログラムのROMサイズを著しく削減し、プログラムの実行タイムを著しく改善する効果がある。
【図面の簡単な説明】
【図1】本発明によるコンパイル方法の実施形態1の1部を示す流れ図である。
【図2】本発明によるコンパイル方法の実施形態1の他部分を示す流れ図である。
【図3】図1〜2の実施形態1のコンパイル方法で参照される関数ネストレベル対応情報例を示す説明図である。
【図4】図1〜2の実施形態1のコンパイル方法で参照されるシンボルテーブル例を示す説明図であある。
【図5】図1〜2の実施形態1のコンパイル方法によるアセンブラプリントファイル出力例を示す説明図である。
【図6】本発明によるコンパイル方法の実施形態2の1部を示す流れ図である。
【図7】本発明によるコンパイル方法の実施形態2の他部分を示す流れ図である。
【図8】図6〜7の実施形態2のコンパイル方法で参照されるシンボルテーブル例を示す説明図である。
【図9】コンパイル対象のソースファイル例を示す説明図である。
【図10】従来コンパイル方法の処理手順例の1部を示す流れ図である。
【図11】従来コンパイル方法の処理手順例の他部分を示す流れ図である。
【図12】従来のコンパイル方法によるアセンブラプリントファイル出力例を示す説明図である。
【符号の説明】
101〜108,501〜504,801〜820 ステップ
201〜211,601〜611 シンボル情報
Claims (8)
- 複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成することを特徴とするコンパイル方法。
- 複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルするコンパイル方法において、各割込要求に対応した割込関数に使用するレジスタバンクの数として起動時にユーザ指定された値を解析しユーザ指定レジスタバンク数として記憶し、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成し、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当てて、システムレジスタの退避および前記レジスタバンク切替を行うコードを生成することを特徴とするコンパイル方法。 - 前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成する、請求項1または2記載のコンパイル方法。
- 前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成する、請求項1,2または3記載のコンパイル方法。
- 複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルする処理をコンピュータに実行させる、コンパイル用プログラムを記録した記録媒体において、
各割込要求に対応した割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルが前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記関数ネストレベルを前記レジスタバンク番号として割り当ててシステムレジスタの退避およびコードを生成する処理を実行させることを特徴とする、コンパイル用プログラムを記録した記録媒体。 - 複数レジスタバンクの1つのレジスタバンク番号が制御命令により指定されレジスタバンク切替が行われるレジスタバンク機能を有するマイクロコントローラに対応したソースプログラムを構文解析し、一構文ずつ読み込み、関数の開始,終了または呼出を示す構文か判定して、前記レジスタバンク切替、使用レジスタの退避および復帰、または返り値の設定および読込を行うコードを生成し、前記ソースプログラムをコンパイルする処理をコンピュータに実行させる、コンパイル用プログラムを記録した記録媒体において、
各割込要求に対応した割込関数に使用するレジスタバンク数として起動時にユーザ指定されたユーザ指定レジスタバンク数を解析する処理と、
前記割込関数の開始を示す構文に対して、前記割込関数に設定されているレジスタバンク番号が前記ユーザ指定レジスタバンク数の範囲内であるかを判定し、この判定に対応して、前記レジスタバンク切替を行うコードを生成する処理と、
前記割込関数以外の関数の開始を示す構文に対して、関数の呼び出し関係および呼び出し深さを示す関数ネストレベルを読み込み、この関数ネストレベルと前記ユーザ指定レジスタバンク数との加算値が前記レジスタバンク番号の範囲内であるか且つ関数が再帰関数でないかを判定し、この判定結果に対応して、前記加算値を前記レジスタバンク番号として割り当ててシステムレジスタの退避および前記レジスタバンク切替を行うコードを生成する処理とを実行させることを特徴とする、コンパイル用プログラムを記録した記録媒体。 - 前記割込関数以外の関数の終了を示す構文に対して、前記返り値をレジスタ領域以外のデータ領域に設定し、関数開始時に前記レジスタバンク切り替えを行ったかを判定し、この判定結果に対応して、前記システムレジスタの復帰を行うコードを生成する処理を実行させる、請求項5または6記載の、コンパイル用プログラムを記録した記録媒体。
- 前記割込関数以外の関数の呼出を示す構文に対して、前記返り値を前記レジスタ領域以外のデータ領域から読み込むコードを生成する処理を実行させる、請求項5,6または7記載の、コンパイル用プログラムを記録した記録媒体。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP31437599A JP3566602B2 (ja) | 1999-11-04 | 1999-11-04 | コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP31437599A JP3566602B2 (ja) | 1999-11-04 | 1999-11-04 | コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2001134447A JP2001134447A (ja) | 2001-05-18 |
JP3566602B2 true JP3566602B2 (ja) | 2004-09-15 |
Family
ID=18052595
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP31437599A Expired - Fee Related JP3566602B2 (ja) | 1999-11-04 | 1999-11-04 | コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3566602B2 (ja) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116820419A (zh) * | 2022-03-22 | 2023-09-29 | 瑞昱半导体股份有限公司 | 源代码校验方法及非暂态计算机可读存储介质装置 |
-
1999
- 1999-11-04 JP JP31437599A patent/JP3566602B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2001134447A (ja) | 2001-05-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8037461B2 (en) | Program code conversion | |
JP2000066902A (ja) | 動的トランスレ―タにおけるマルチブランチ修正処理システム | |
JPH11259437A (ja) | 不要バリア命令の削減方式 | |
US20070226720A1 (en) | System and Method for Efficiently Passing Information Between Compiler and Post-Compile-Time Software | |
JP2000347874A (ja) | レジスタ割当器を用いた呼出規則プロローグ・エピローグコード構築方法及び装置 | |
JP2001147819A (ja) | 最適化装置および記録媒体 | |
CN113900657A (zh) | 读取数据规则的方法和电子设备、存储介质 | |
JP3566602B2 (ja) | コンパイル方法、および、コンパイル用プログラムを記録した記録媒体 | |
JP2000353097A (ja) | 低密回の干渉グラフを生成する方法および装置 | |
JP3840149B2 (ja) | コンパイラ、演算処理システム及び演算処理方法 | |
JP2003256215A (ja) | プログラム変換方法、これを用いたデータ処理装置及びプログラム | |
US6029003A (en) | Method of assigning external variables to memories when compiling source program | |
JP2932812B2 (ja) | 言語処理プログラム実行装置 | |
JP3018783B2 (ja) | コンパイル方式 | |
JPH0689187A (ja) | インライン展開最適化方法 | |
JP3323147B2 (ja) | コンパイル装置、コンパイル方法およびコンパイラプログラムを記録した記録媒体 | |
JP2003131888A (ja) | 手続き間命令スケジューリング方法 | |
JP2000231494A (ja) | ソフトウェア実行システム及びソフトウェア実行方法 | |
JP2000112767A (ja) | コンパイラ及びその変数割り付け方法及びそのプログラ ム記録媒体 | |
JP2000339171A (ja) | コンパイル装置、方法及び記録媒体 | |
JPH1195995A (ja) | データフロー解析装置、データフロー解析方法及びそのためのコンピュータプログラムを記録した記録媒体 | |
JP2001290652A (ja) | プログラム変換装置、プログラム変換方法及び記録媒体 | |
JP2002108628A (ja) | プログラム変換装置 | |
JP2002091778A (ja) | プログラム変換装置、プログラム変換方法及び記録媒体 | |
JPH06324882A (ja) | コンパイラ装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
RD01 | Notification of change of attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7421 Effective date: 20040119 |
|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20040518 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040610 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
S111 | Request for change of ownership or part of ownership |
Free format text: JAPANESE INTERMEDIATE CODE: R313113 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
LAPS | Cancellation because of no payment of annual fees |