(57)【特許請求の範囲】
【請求項１】
プロセッサで実行されるプログラム中の関数が割り当てられ、通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数の実行時、第２のメモリ領域に配置される第２の関数が呼び出され、前記第１の関数の実行が中断する直前に、前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とするように、
前記プロセッサが前記複数のメモリ領域の電力制御状態を制御することを特徴とする電力制御方法。
【請求項２】
前記第２の関数から前記第１の関数へ復帰する直前に、前記第１のメモリ領域を前記通常状態とし、
前記第２の関数から前記第１の関数へ復帰した直後に、前記第２のメモリ領域を前記省電力状態とするように、
前記プロセッサが前記複数のメモリ領域の電力制御状態を制御することを特徴とする請求項１に記載の電力制御方法。
【請求項３】
前記第１の関数及び前記第１のメモリ領域が複数存在する場合に、
前記第２の関数から前記第１の関数へ復帰する直前に、全ての前記第１のメモリ領域を前記通常状態とし、
前記第２の関数から前記第１の関数へ復帰した直後に、複数の前記第１のメモリ領域のうち復帰先となるメモリ領域以外、及び前記第２のメモリ領域を前記省電力状態とするように、
前記プロセッサが前記複数のメモリ領域の電力制御状態を制御することを特徴とする請求項１または２に記載の電力制御方法。
【請求項４】
前記第１の関数において、前記第２の関数の呼び出し命令の直前に、前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とする命令が記述されていることを特徴とする請求項１乃至３の何れか一項に記載の電力制御方法。
【請求項５】
前記第１の関数において、前記第２の関数の呼び出し命令の直後に、前記第２のメモリ領域を前記省電力状態とする命令が記述されていることを特徴とする請求項１乃至４の何れか一項に記載の電力制御方法。
【請求項６】
プロセッサと、
前記プロセッサで実行されるプログラム中の関数が割り当てられ、通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域と、を有し、
前記プロセッサは、前記複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数の実行時、第２のメモリ領域に配置される第２の関数が呼び出され、前記第１の関数の実行が中断する直前に、前記第１のメモリ領域を前記省電力状態とすることを特徴とする電子装置。
【請求項７】
プロセッサで実行されるプログラム中の関数が割り当てられ、通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数の実行時、第２のメモリ領域に配置される第２の関数が呼び出され、前記第１の関数の実行が中断する直前に、前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とする、
処理をコンピュータに実行させるプログラム。
【請求項８】
通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域の前記電力制御状態を制御するプログラムの生成方法において、
コンピュータが、
プログラム中の関数の前記複数のメモリ領域への割り当てを決定し、
前記複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数において、第２のメモリ領域に配置される第２の関数の呼び出し命令の直前に、前記第１の関数の実行が中断する直前に前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とする命令を挿入する、
ことを特徴とするプログラムの生成方法。
【請求項９】
前記プログラムを１または複数の関数を含む複数の分割部に分割し、
前記複数の分割部のうち、再帰部となる関数群をさらに分割する複数の分割案を作成し、
前記複数の分割案から、前記複数のメモリ領域の残り容量に応じて採用する分割案を選択し、
選択した前記分割案をもとに分割した前記再帰部と、前記再帰部以外の分割部とを配置するメモリ領域を指定するメモリマップを作成することを特徴とする請求項８に記載のプログラムの生成方法。
【請求項１０】
前記複数の分割部のうち、前記メモリ領域に割り当てていないコードサイズが大きい分割部から、前記割り当てを決定していくことを特徴とする請求項９に記載のプログラムの生成方法。
【請求項１１】
前記複数の分割案のそれぞれに応じて前記再帰部を分割したときに得られる各関数群のコードサイズを含むテーブルを作成し、
前記テーブルを参照し、前記複数のメモリ領域のそれぞれの残り容量と、前記コードサイズに応じて、前記複数の分割案から、前記採用する分割案を選択することを特徴とする請求項９または１０に記載のプログラムの生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電力制御方法、電子装置、プログラム及びプログラムの生成方法に関する。
【背景技術】
【０００２】
プロセッサとメモリを有するシステムにおいて、プロセッサに供給されるプログラムの内容に応じて、メモリの消費電力を削減するように、プロセッサがメモリの動作を制御する方法が知られている。特に、プロセッサとメモリを有するシステムを半導体１チップに搭載するＳＯＣ（System On Chip）の消費電力を削減するメモリ制御方法が注目されつつある。
【０００３】
たとえば、ＯＳ（Operating System）がアプリケーションプログラムに対する主記憶のメモリ領域の割り当て及び解放の状況を調べ、メモリ領域の状況に応じて主記憶に対する電源供給を制御する方法が知られている。
【０００４】
また、ソースプログラムを、ループを単位とする各フェーズ及び各フェーズで参照する参照データを抽出することで分割する手法も知られている。この手法では、各フェーズの参照データの記憶に要するメモリ領域を、プロセッサ内のキャッシュメモリとプロセッサ外のオンチップメモリとに配分して電力削減を図っている。
【０００５】
また、ソースプログラムから命令同士の呼び出し関係を表すコールグラフを作成し、利用頻度の高い命令群とそれ以外の命令群とに分類し、利用頻度の高い命令群を常時電力が供給されるメモリ領域（メモリバンク）へ配置する方法が知られている。この方法により、電力供給先となるメモリバンクを頻繁に切り替えるような事態が避けられ、効率的な電力制御が図られる。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平９−２１２４１６号公報
【特許文献２】特開２００８−１０２７３３号公報
【特許文献３】特開２０１０−２５７４３７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかし、従来の手法では、プログラムの構造によっては、省電力にできるメモリ領域が制限され、消費電力の削減効果が減少する場合があった。
たとえば、利用頻度の高い命令群を常時電力が供給されるメモリバンクへ配置する手法では、利用頻度の低い命令群は省電力状態と通常状態の電力制御が行われるメモリバンクに配置される。この手法では、ある関数の実行のために一度、省電力状態から通常状態としたメモリバンクはその関数の実行が完了するまでは通常状態とされる。そのため、ある関数の実行時に別のメモリバンクに配置されている関数を呼び出して実行している間も、呼び出し元の関数が配置されているメモリバンクは通常状態のままである。したがって、このような呼び出し関係の多いプログラムでは、十分に消費電力の削減を行うことが難しかった。
【課題を解決するための手段】
【０００８】
発明の一観点によれば、以下のような電力制御方法が提供される。この電力制御方法は、プロセッサで実行されるプログラム中の関数が割り当てられ、通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数の実行時、第２のメモリ領域に配置される第２の関数が呼び出される直前に、前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とするように、前記プロセッサが前記複数のメモリ領域の電力制御状態を制御する。
【０００９】
また、発明の一観点によれば、以下のようなプログラムの生成方法が提供される。このプログラムの生成方法は、通常状態と省電力状態の電力制御状態をもつ複数のメモリ領域の前記電力制御状態を制御するプログラムを生成するものであり、コンピュータが、プログラム中の関数の前記複数のメモリ領域への割り当てを決定し、前記複数のメモリ領域のうち、第１のメモリ領域に配置される第１の関数において、第２のメモリ領域に配置される第２の関数の呼び出し命令の直前に、前記第１のメモリ領域を前記省電力状態、前記第２のメモリ領域を前記通常状態とする命令を挿入する。
【発明の効果】
【００１０】
開示の電力制御方法、電子装置、プログラム及びプログラムの生成方法によれば、メモリによる消費電力を削減することができる。
【図面の簡単な説明】
【００１１】
【図１】第１の実施の形態の電力制御方法及び電子装置の一例を示す図である。
【図２】第２の実施の形態の電子装置の一例を示す図である。
【図３】メモリ部に格納されているプログラムのコードの一例を示す図である。
【図４】ｆｕｎｃ１（）→ｆｕｎｃ２（）→ｆｕｎｃ１（）の順で関数が実行される場合のメモリバンクの電力制御状態の例を示す図である。
【図５】ｆｕｎｃ３（）→ｆｕｎｃ２（）→ｆｕｎｃ３（）の順で関数が実行される場合のメモリバンクの電力制御状態の例を示す図である。
【図６】プログラムを生成するコンピュータの一例を示す図である。
【図７】プログラム生成方法の一例を示すフローチャートである。
【図８】メモリマップ作成処理の一例を示すフローチャートである。
【図９】メモリバンク構成情報の一例を示す図である。
【図１０】静的コールグラフの一例を示す図である。
【図１１】関数サイズ情報の一例を示す図である。
【図１２】プログラム分割処理の一例を示すフローチャートである。
【図１３】分割作業用テーブルの一例を示す図である。
【図１４】再帰検出処理の一例を示すフローチャートである。
【図１５】初期化後の配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示している。
【図１６】サブルーチンＡの処理の一例を示すフローチャートである。
【図１７】サブルーチンＢの処理の一例を示すフローチャートである。
【図１８】複数の再帰部を含む静的コールグラフの例を示す図である。
【図１９】更新された配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
【図２０】関数ｆ９ａについてまで更新された、配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
【図２１】関数ｆ９ａにおける配列変数ｖｉｓｉｔｅｄ［ｆ］が変更された例を示す図である。
【図２２】分割処理の一例を示すフローチャートである。
【図２３】分割作業用テーブルの更新例を示す図である。
【図２４】１つ目の再帰部の検出後に行われる分割処理後の分割作業用テーブルの例を示す図である。
【図２５】更新された配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
【図２６】ステップＳ７９の処理で出力される分割作業用テーブルの例を示す図である。
【図２７】分割情報の例を示す図である。
【図２８】再帰部の分割案作成処理の一例を示すフローチャートである。
【図２９】分割案入りの分割情報の例を示す図である。
【図３０】テーブルｔｂｌ１の例を示す図である。
【図３１】テーブルｔｂｌ２の例を示す図である。
【図３２】関数割り当て処理の一例を示すフローチャートである。
【図３３】初期化後の変数ｍ＿ｒｅｓｔ［Ｍ］の一例を示す図である。
【図３４】初期化後の分割情報の一例を示す図である。
【図３５】初期化時の割り当て情報の一例を示す図である。
【図３６】割り当て情報の更新例を示す図である。
【図３７】分割情報の更新例を示す図である。
【図３８】出力される割り当て情報の例を示す図である。
【図３９】アドレス計算処理の一例を示すフローチャートである。
【図４０】出力されるメモリマップの一例を示す図である。
【図４１】電力制御コード挿入処理の一例を示すフローチャートである。
【図４２】第３の実施の形態における関数割り当て処理の一例を示すフローチャートである。
【図４３】初期化後の分割情報の一例を示す図である。
【図４４】分割情報の更新例を示す図である。
【図４５】割り当て情報の更新例を示す図である。
【図４６】第４の実施の形態における関数割り当て処理の一例を示すフローチャートである。
【図４７】早見表の一例を示す図である。
【図４８】早見表の更新例を示す図である。
【図４９】早見表作成処理の例を示すフローチャートである。
【図５０】早見表の更新処理の例を示すフローチャートである。
【発明を実施するための形態】
【００１２】
以下、本発明の実施の形態を、図面を参照しつつ説明する。
（第１の実施の形態）
図１は、第１の実施の形態の電力制御方法及び電子装置の一例を示す図である。
【００１３】
第１の実施の形態の電力制御方法は、図１に示すような電子装置１で実行される。電子装置１は、プロセッサ２と複数のメモリ領域３ａ，３ｂを有している。各メモリ領域３ａ，３ｂには、プロセッサ２で実行されるプログラム中の関数が割り当てられている。
【００１４】
ここで、メモリ領域３ａに配置されている関数ｆａは、メモリ領域３ｂに配置されている関数ｆｂへの呼び出し命令を含むものとする。このような関数ｆａ，ｆｂを含むプログラムを実行する際、プロセッサ２は、たとえば、図１のフローチャートに示されているような電力制御を実行する。
【００１５】
なお、メモリ領域３ａ，３ｂの電力制御状態には、通常状態と省電力状態とがある。通常状態は、たとえば、メモリ領域３ａ，３ｂへのライトやリードが行われる際の電力制御状態であり、省電力状態は、たとえば、メモリ領域３ａ，３ｂに記憶されている内容を保持するための、通常状態よりも低い電圧が印加されている状態である。
【００１６】
関数ｆａの実行時、メモリ領域３ａの電力制御状態は通常状態、メモリ領域３ｂの電力制御状態は省電力状態になっているものとする。
関数ｆａの実行が開始されると、プロセッサ２は、関数ｆｂの呼び出し命令の直前で、メモリ領域３ａを省電力状態とし、メモリ領域３ｂを通常状態に遷移させる（ステップＳ１）。
【００１７】
関数ｆｂの実行時は、関数ｆａの処理は中断されているため、メモリ領域３ａを省電力状態とすることで、電子装置１の消費電力を削減することができる。
関数ｆａの実行時において、関数ｆｂへの呼び出し命令が実行されると（ステップＳ２）、通常状態となっているメモリ領域３ｂに割り当てられている関数ｆｂの実行が開始される（ステップＳ３）。
【００１８】
その後、プロセッサ２は、関数ｆａへの復帰直前（関数ｆｂの終了直前）に、メモリ領域３ａを通常状態に遷移させる（ステップＳ４）。関数ｆｂの実行が終了すると、関数ｆａへの復帰が行われる（ステップＳ５）。
【００１９】
関数ｆａの復帰が行われると、プロセッサ２は、メモリ領域３ｂを省電力状態に遷移させる（ステップＳ６）。
その後、関数ｆａの残りの処理が実行され（ステップＳ７）、関数ｆａの実行が終了する。
【００２０】
なお、ステップＳ１の処理を行う命令は、関数ｆａ内において、たとえば、関数ｆｂの呼び出し命令の直前に記述されている。また、ステップＳ４の処理を行う命令は、関数ｆｂ内において、たとえば、関数ｆｂの終了命令の直前に記述されている。また、ステップＳ６の処理を行う命令は、関数ｆａ内において、たとえば、関数ｆｂの呼び出し命令の直後に記述されている。詳細は後述する。
【００２１】
このような関数ｆａ，ｆｂを含むプログラムを、プロセッサ２が実行することで、上記のような電力制御方法が実行される。
以上のような電力制御方法によれば、呼び出し元の関数が割り当てられているメモリ領域を、呼び出し先の関数の実行時に省電力状態とし、関数の実行を中断しているメモリ領域を省電力状態としている。これにより、呼び出し関係の多いプログラムを実行する場合であっても、メモリ領域３ａ，３ｂによる消費電力を削減でき、その結果、低消費電力の電子装置１が得られる。
【００２２】
（第２の実施の形態）
図２は、第２の実施の形態の電子装置の一例を示す図である。
電子装置５０は、たとえば、メモリ装置、ＳＯＣ（System On Chip）などの半導体装置、またはコンピュータなどである。
【００２３】
電子装置５０は、メモリ部１０、プロセッサ２０、制御レジスタ部３０、電力制御部４０、バス４１、電源線４２を有している。
メモリ部１０は、ＳＲＡＭ（Static Random Access Memory）またはＤＲＡＭ（Dynamic Random Access Memory）などであり、複数のメモリバンク１１−０，１１−１，１１−２，１１−３，…，１１−ｎを有する。メモリバンク１１−０〜１１−ｎは、命令コード用メモリ１２またはデータ用メモリ１３として機能する。メモリバンク１１−０〜１１−ｎは、バス４１を介してプロセッサ２０に接続されている。
【００２４】
プロセッサ２０は、たとえば、ＣＰＵ（Central Processing Unit）、ＤＳＰ（Digital Signal Processor）などであり、プロセッサコア２１とメモリコントローラ２２を有している。プロセッサコア２１はメモリコントローラ２２を用いて、メモリバンク１１−０〜１１−ｎへのデータまたは命令コードの書き込みまたは読み出しを制御する。
【００２５】
制御レジスタ部３０は、プロセッサ２０からの電源制御信号に応じて、メモリバンク１１−０〜１１−ｎの電力制御状態を記憶する。制御レジスタ部３０は、たとえば、各メモリバンク１１−１〜１１−ｎの電力制御状態を記憶する複数のレジスタｃ０，ｃ１，ｃ２，ｃ３，…，ｃｎを有している。
【００２６】
たとえば、図２に示すように、レジスタｃ０〜ｃｎのうち、レジスタｃ０，ｃ２に“１”が設定され、後のレジスタｃ１，ｃ３〜ｃｎに“０”が設定されると、メモリバンク１１−０，１１−２の電力制御状態が通常状態となり、メモリバンク１１−１，１１−３〜１１−ｎの電力制御状態が省電力状態となる。
【００２７】
電力制御部４０は、メモリバンク１１−０〜１１−ｎと電源線４２間に接続された電力制御回路４０−０，４０−１，４０−２，４０−３，…，４０−ｎを有している。電力制御回路４０−０〜４０−ｎは、制御レジスタ部３０からの信号に応じて、メモリバンク１１−０〜１１−ｎの電源状態を制御する。なお、電源状態には、たとえば、電源切断状態と省電力供給状態と通常電力供給状態とがある。
【００２８】
電源切断状態では、電源線４２と各メモリバンク１１−０〜１１−ｎとの間の接続が切断されている。省電力供給状態では、電源線４２からの電源が、電圧を低下させて各メモリバンク１１−０〜１１−ｎへ供給されている。通常電力供給状態では、電源線４２からの電源が、電圧を保持しながら各メモリバンク１１−０〜１１−ｎへ供給されている。
【００２９】
電源切断状態では、各メモリバンク１１−０〜１１−ｎにおいて、データの保持も、読み出し及び書き込みも行われない。省電力供給状態では、各メモリバンク１１−０〜１１−ｎにおいて、データ保持が行われる。通常電力供給状態では、各メモリバンク１１−０〜１１−ｎにおいて、データ保持、読み出しまたは書き込みが行われる。
【００３０】
なお、制御レジスタ部３０において、“０”が設定されている場合に、上記の電源状態のうち、電源切断状態と省電力供給状態の何れかが、たとえば、電力制御回路４０−０〜４０−ｎにより決定される。
【００３１】
このような電子装置５０において、メモリ部１０には、たとえば、以下のようなプログラムが格納されている。
図３は、メモリ部に格納されているプログラムのコードの一例を示す図である。
【００３２】
図３の例では、関数としてｆｕｎｃ１（）、ｆｕｎｃ２（）、ｆｕｎｃ３（）が示されている。また、図３の例では、メモリバンク１１−０〜１１−ｎの数を８つ（つまり、ｎ＝７）としている。
【００３３】
ｆｕｎｃ１（）は、ｆｕｎｃ２（）の呼び出し命令（ｃａｌｌ  ｆｕｎｃ２（））を含み、メモリバンク１１−１に配置される。さらに、ｆｕｎｃ１には、ｆｕｎｃ２（）の呼び出し命令の直前に、メモリバンク１１−１の電力制御状態を省電力状態に遷移させ、メモリバンク１１−２の電力制御状態を通常状態に遷移させる命令（電力制御コード）が記述されている。また、呼び出し命令の直後に、メモリバンク１１−２〜１１−７の電力制御状態を省電力状態に遷移させる電力制御コードが記述されている。
【００３４】
ｆｕｎｃ１において呼び出されるｆｕｎｃ２（）は、メモリバンク１１−２に配置される。ｆｕｎｃ２には、ｆｕｎｃ２（）の終了を示す“ｅｎｄ  ｆｕｎｃｔｉｏｎ”の直前に、ｆｕｎｃ２の呼び出し命令が含まれているメモリバンク１１−１，１１−３の電力制御状態を通常状態に遷移させる電力制御コードが記述されている。
【００３５】
ｆｕｎｃ３は、ｆｕｎｃ２（）の呼び出し命令を含み、メモリバンク１１−３に配置される。さらに、ｆｕｎｃ３には、ｆｕｎｃ２（）の呼び出し命令の直前に、メモリバンク１１−３の電力制御状態を省電力状態に遷移させ、メモリバンク１１−２の電力制御状態を通常状態に遷移させる電力制御コードが記述されている。また、呼び出し命令の直後に、メモリバンク１１−１，１１−２，１１−４〜１１−７の電力制御状態を省電力状態に遷移させる電力制御コードが記述されている。
【００３６】
電子装置５０は、以上のようなプログラムを実行することで、メモリバンク１１−０〜１１−ｎの電力制御を行う。
以下、図３に示したプログラムの実行時による電子装置５０による電力制御方法の例を説明する。
【００３７】
図４は、ｆｕｎｃ１（）→ｆｕｎｃ２（）→ｆｕｎｃ１（）の順で関数が実行される場合のメモリバンクの電力制御状態の例を示す図である。
図４では、プログラムの各コードの実行時におけるメモリバンク１１−０〜１１−７の電力制御状態を示している。メモリバンク番号の０〜７は、それぞれ、メモリバンク１１−０〜１１−７を示している。
【００３８】
なお、メモリバンク１１−０には、メイン関数が配置され、電力制御状態が常時、通常状態となっている。また、図４中において最初にｆｕｎｃ１を実行する際には、メモリバンク１１−０，１１−１以外のメモリバンク１１−２〜１１−７の電力制御状態は省電力状態となっているものとする。すなわち、図２に示した制御レジスタ部３０のレジスタｃ０〜ｃ７は、“１１００００００”となっている。
【００３９】
プロセッサ２０によるｆｕｎｃ１（）の実行時において、ｆｕｎｃ２（）の呼び出し命令の直前で、メモリバンク１１−１の電力制御状態を省電力状態へ遷移させ、メモリバンク１１−２の電力制御状態を通常状態へ遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１０１０００００”と書き換える。これにより、ｆｕｎｃ２（）の呼び出し命令の実行時には、メモリバンク１１−１の電力制御状態が省電力状態となり、メモリバンク１１−２の電力制御状態が通常状態となる。
【００４０】
ｆｕｎｃ２（）の実行が進み、終了直前において、メモリバンク１１−１，１１−３を通常状態へ遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１１１１００００”と書き換える。これにより、ｆｕｎｃ２（）の終了時（ｆｕｎｃ１（）への復帰時）には、メモリバンク１１−０〜１１−３の電力制御状態が通常状態となり、メモリバンク１１−４〜１１−７の電力制御状態が省電力状態のままとなる。このようにすることで、実行状況を参照せずに、ｆｕｎｃ１（）、ｆｕｎｃ３（）のどちらに復帰しても省電力状態のメモリバンクにアクセスするという問題を発生させないようになっている。
【００４１】
ｆｕｎｃ１（）への復帰後には、ｆｕｎｃ１（）においてｆｕｎｃ２（）の呼び出し命令の直後の、メモリバンク１１−２〜１１−７の電力制御状態を省電力状態に遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１１００００００”と書き換える。これにより、メモリバンク１１−０，１１−１以外のメモリバンク１１−２〜１１−７の電力制御状態が省電力状態となる。ｆｕｎｃ１（）へ復帰したという情報を追加されたため、省電力状態とするメモリバンクを増やすことができた。
【００４２】
図５は、ｆｕｎｃ３（）→ｆｕｎｃ２（）→ｆｕｎｃ３（）の順で関数が実行される場合のメモリバンクの電力制御状態の例を示す図である。
図４と同様に、プログラムの各コードの実行時におけるメモリバンク１１−０〜１１−７の電力制御状態を示している。メモリバンク番号の０〜７は、それぞれ、メモリバンク１１−０〜１１−７を示している。また、図４と同様に、メモリバンク１１−０には、メイン関数が配置され、電力制御状態が常時、通常状態となっている。
【００４３】
なお、図５中において最初にｆｕｎｃ３を実行する際には、メモリバンク１１−０，１１−３以外のメモリバンク１１−１，１１−２，１１−４〜１１−７の電力制御状態は省電力状態となっているものとする。すなわち、図２に示した制御レジスタ部３０のレジスタｃ０〜ｃ７は、“１００１００００”となっている。
【００４４】
プロセッサ２０によるｆｕｎｃ３（）の実行時において、ｆｕｎｃ２（）の呼び出し命令の直前で、メモリバンク１１−２の電力制御状態を通常状態へ遷移させ、メモリバンク１１−３の電力制御状態を省電力状態へ遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１０１０００００”と書き換える。これにより、ｆｕｎｃ２（）の呼び出し命令の実行時には、メモリバンク１１−３の電力制御状態が省電力状態となり、メモリバンク１１−２の電力制御状態が通常状態となる。
【００４５】
ｆｕｎｃ２（）の実行が進み、終了直前において、メモリバンク１１−１，１１−３を通常状態へ遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１１１１００００”と書き換える。これにより、ｆｕｎｃ２（）の終了時（ｆｕｎｃ３（）への復帰時）には、メモリバンク１１−０〜１１−３の電力制御状態が通常状態となり、メモリバンク１１−４〜１１−７の電力制御状態が省電力状態のままとなる。このようにすることで、実行状況を参照せずに、ｆｕｎｃ１（）、ｆｕｎｃ３（）のどちらに復帰しても省電力状態のメモリバンクにアクセスするという問題を発生させないようになっている。
【００４６】
ｆｕｎｃ３（）への復帰後には、ｆｕｎｃ３（）においてｆｕｎｃ２（）の呼び出し命令の直後の、メモリバンク１１−１，１１−２，１１−４〜１１−７の電力制御状態を省電力状態に遷移させる電力制御コードが実行される。このときプロセッサ２０は、制御レジスタ部３０のレジスタｃ０〜ｃ７を、“１００１００００”と書き換える。これにより、メモリバンク１１−０，１１−３以外のメモリバンク１１−１，１１−２，１１−４〜１１−７の電力制御状態が省電力状態となる。ｆｕｎｃ３（）へ復帰したという情報を追加されたため、省電力状態とするメモリバンクを増やすことができた。
【００４７】
以上のような電力制御方法によれば、呼び出し元の関数が割り当てられているメモリバンクを、呼び出し先の関数の実行時に省電力状態とし、メイン関数以外の関数の実行を中断しているメモリバンクを省電力状態としている。これにより、呼び出し関係の多いプログラム、特に複数の関数が同一の関数を呼び出す構造を含むプログラムを実行する場合であっても、プログラムのメモリバンクへの配置の工夫をせずに、電子装置５０のメモリ部１０による消費電力を削減でき、その結果、低消費電力の電子装置５０が得られる。
【００４８】
次に、図３に示したような電力制御コードが挿入されたプログラムを生成する方法について詳細に説明する。
（プログラム生成方法）
図６は、プログラムを生成するコンピュータの一例を示す図である。
【００４９】
コンピュータ１００は、ＣＰＵ１０１によって装置全体が制御されている。ＣＰＵ１０１には、バス１０８を介してＲＡＭ１０２と複数の周辺機器が接続されている。
ＲＡＭ１０２は、コンピュータ１００の主記憶装置として使用される。ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳのプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に用いる各種データが格納される。
【００５０】
バス１０８に接続されている周辺機器としては、ハードディスクドライブ（ＨＤＤ:Hard Disk Drive）１０３、グラフィック処理装置１０４、入力インタフェース１０５、光学ドライブ装置１０６、及び通信インタフェース１０７がある。
【００５１】
ＨＤＤ１０３は、内蔵したディスクに対して、磁気的にデータの書き込み及び読み出しを行う。ＨＤＤ１０３は、コンピュータ１００の二次記憶装置として使用される。ＨＤＤ１０３には、ＯＳのプログラム、アプリケーションプログラム、及び各種データが格納される。なお、二次記憶装置としては、フラッシュメモリなどの半導体記憶装置を使用することもできる。
【００５２】
グラフィック処理装置１０４には、モニタ１０４ａが接続されている。グラフィック処理装置１０４は、ＣＰＵ１０１からの命令にしたがって、画像をモニタ１０４ａの画面に表示させる。モニタ１０４ａとしては、ＣＲＴ（Cathode Ray Tube）を用いた表示装置や液晶表示装置などがある。
【００５３】
入力インタフェース１０５には、キーボード１０５ａとマウス１０５ｂとが接続されている。入力インタフェース１０５は、キーボード１０５ａやマウス１０５ｂから送られてくる信号をＣＰＵ１０１に送信する。なお、マウス１０５ｂは、ポインティングデバイスの一例であり、他のポインティングデバイスを使用することもできる。他のポインティングデバイスとしては、タッチパネル、タブレット、タッチパッド、トラックボールなどがある。
【００５４】
光学ドライブ装置１０６は、レーザ光などを利用して、光ディスク１０６ａに記録されたデータの読み取りを行う。光ディスク１０６ａは、光の反射によって読み取り可能なようにデータが記録された可搬型の記録媒体である。光ディスク１０６ａには、ＤＶＤ（Digital Versatile Disc）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）、ＣＤ−Ｒ（Recordable）／ＲＷ（ReWritable）などがある。
【００５５】
通信インタフェース１０７は、ネットワーク１０７ａに接続されている。通信インタフェース１０７は、ネットワーク１０７ａを介して、他のコンピュータまたは通信機器との間でデータの送受信を行う。
【００５６】
以上のようなハードウェア構成によって、以下に示すプログラム生成方法が実現される。
図７は、プログラム生成方法の一例を示すフローチャートである。
【００５７】
まず、たとえば、ＣＰＵ１０１により実現されるコンパイラに、プログラム（ソースコード）ｄ１が入力され、コンパイルが行われると、その結果としてプログラム（アセンブリ）ｄ２が生成される（ステップＳ１０）。
【００５８】
その後、ＣＰＵ１０１は、プログラムｄ２と、プログラムｄ２を組み込む電子装置の各メモリバンクの開始アドレスや容量を含むメモリバンク構成情報ｄ３とをもとに、メモリマップｄ４を作成する（ステップＳ１１）。メモリマップｄ４には、プログラムｄ２のどの関数をどのメモリバンクのアドレスに割り当てるのかが示されている。
【００５９】
次に、ＣＰＵ１０１は、メモリマップｄ４をもとに、プログラムｄ２に前述したような電力制御コードを挿入し、電力制御コード入りプログラム（アセンブリ）ｄ５を生成する（ステップＳ１２）。
【００６０】
続いてＣＰＵ１０１により実現されるアセンブラにより、電力制御コード入りプログラムｄ５がアセンブルされ、電力制御コード入りプログラム（オブジェクト）ｄ６が生成される（ステップＳ１３）。さらに、ＣＰＵ１０１により実現されるリンカにより、メモリマップｄ４に基づき、標準ライブラリや数値計算ライブラリなど他のライブラリとのリンクが行われ、電力制御コード入りプログラム（バイナリ）ｄ７が生成され（ステップＳ１４）、プログラム生成処理が終了する。
【００６１】
以下、ステップＳ１１及びステップＳ１２の処理の詳細を説明する。
（メモリマップ作成処理）
図８は、メモリマップ作成処理の一例を示すフローチャートである。
【００６２】
まず、ＣＰＵ１０１は、プログラム（アセンブリ）ｄ２とメモリバンク構成情報ｄ３とをもとに、静的コールグラフｄ１０及び関数サイズ情報ｄ１１を作成する（ステップＳ２０）。
【００６３】
図９は、メモリバンク構成情報の一例を示す図である。
メモリバンク構成情報ｄ３には、各メモリバンクの開始アドレスと、容量の情報が含まれている。たとえば、メモリバンク番号０のメモリバンクの開始アドレスは０ｘ００００であり、容量は４．０ＫＢである。
【００６４】
図１０は、静的コールグラフの一例を示す図である。
静的コールグラフｄ１０には、プログラム（アセンブリ）ｄ２における関数の呼び出し関係が示されている。たとえば、メイン関数（関数ｍａｉｎ）により呼び出される関数として、関数ｆ１ａ，ｆ１ｂがあることが示されている。
【００６５】
図１１は、関数サイズ情報の一例を示す図である。
関数サイズ情報には、各関数のコードサイズが含まれている。たとえば、関数ｍａｉｎのコードサイズは０．１ＫＢであり、関数ｆ１ａのコードサイズは１．０ＫＢである。
【００６６】
以上のような静的コールグラフｄ１０と関数サイズ情報ｄ１１が作成されると、これらの情報をもとに、プログラム分割が行われる（ステップＳ２１）。ステップＳ２１の処理では、ＣＰＵ１０１は、静的コールグラフｄ１０から再帰部となっている関数とそれ以外の関数とを検出し、分割する。また、ＣＰＵ１０１は、各分割部の合計のコードサイズを算出し、各分割部に含まれる関数やコードサイズを含む分割情報ｄ１２を生成する。
【００６７】
続いて、ＣＰＵ１０１は、作成した分割情報ｄ１２をもとに、再帰部の分割案ｄ１３を作成する（ステップＳ２２）。ステップＳ２２の処理では、再帰部となっている関数群を任意の２関数で分割した際の、両方の関数群の合計コードサイズが算出される。分割する２関数と、分割によって得られる両方の関数群の合計コードサイズが分割案ｄ１３の１つとして、たとえば、ＲＡＭ１０２に保存される。詳細は後述する。
【００６８】
その後、ＣＰＵ１０１は、作成した分割情報ｄ１２、分割案ｄ１３とメモリバンク構成情報ｄ３とをもとに、電力制御対象の電子装置の各メモリバンクに割り当てる関数を決定し、割り当て情報ｄ１４を生成する（ステップＳ２３）。
【００６９】
そして、ＣＰＵ１０１は、生成した割り当て情報ｄ１４とメモリバンク構成情報ｄ３をもとに、各関数の開始アドレスを算出し、算出した開始アドレスをもとにメモリマップｄ４を作成する（ステップＳ２４）。以上によりメモリマップ作成処理が終了する。
【００７０】
次に、上記のメモリマップ作成処理におけるプログラム分割処理、再帰部の分割案作成処理、関数割り当て処理について、さらに詳細に説明する。
（プログラム分割処理）
図１２は、プログラム分割処理の一例を示すフローチャートである。
【００７１】
ＣＰＵ１０１において、図１０に示したような静的コールグラフｄ１０の入力が行われると（ステップＳ３０）、準備処理が行われる（ステップＳ３１）。準備処理では、ＣＰＵ１０１は、後述する分割作業用テーブルを作成し、各関数の分割名の初期値を与える。その後、ＣＰＵ１０１は、静的コールグラフｄ１０から再帰となっている関数群を検出する（ステップＳ３２）。再帰となっている関数群が検出されると、分割処理が行われる（ステップＳ３３）。分割処理では、ＣＰＵ１０１は、再帰となっている関数群とそれ以外の関数群への分割を行い、分割作業用テーブルの分割名を更新する。その後、ステップＳ３２の処理に戻る。
【００７２】
ステップＳ３２の処理で、再帰となっている関数群が検出されない場合、ＣＰＵ１０１は、その時点での分割作業用テーブルの情報をもとに、分割情報ｄ１２を生成し出力し（ステップＳ３４）、たとえば、ＲＡＭ１０２に格納し、プログラム分割処理を終了する。
【００７３】
以下、図１２のステップＳ３１，Ｓ３２，Ｓ３３の詳細を説明する。
（準備処理）
図１２のステップＳ３１の準備処理では、以下に示すような分割作業用テーブルが作成される。
【００７４】
図１３は、分割作業用テーブルの一例を示す図である。
分割作業用テーブルには、静的コールグラフｄ１０に含まれる関数と、その関数に対する分割名が含まれる。準備処理の段階では、分割名の初期値として、たとえば、図１３のように“ＭＡＩＮ”が与えられる。詳細は後述するが、再帰部やそれ以外の部分として分割された後には、異なった分割名に変更される。
【００７５】
（再帰検出処理）
図１４は、再帰検出処理の一例を示すフローチャートである。
以下に示す例では、静的コールグラフｄ１０から深さ優先探索により、再帰（閉路）となっている関数群を検出する例が示されている。
【００７６】
たとえば、ＲＡＭ１０２に記憶されている静的コールグラフｄ１０と分割作業用テーブルがＣＰＵ１０１に入力されると（ステップＳ４０）、初期化が行われる（ステップＳ４１）。
【００７７】
初期化処理では、ＣＰＵ１０１は、メイン関数からの探索の経路で関数ｆを通ったか否かを示す配列変数ｖｉｓｉｔｅｄ［ｆ］を初期化する。
図１５は、初期化後の配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示している。
【００７８】
配列変数ｖｉｓｉｔｅｄ［ｆ］の初期化では、ｆが関数ｍａｉｎのときはｔｒｕｅ、それ以外の場合には、ｆａｌｓｅに設定される。
また、初期化処理において、ＣＰＵ１０１は、関数ｍａｉｎから関数ｆに至る探索の経路を記憶するリスト型の変数ＰＡＴＨを空にし、さらに、再帰部が抽出できたか否かを表す変数ｆｌａｇをｆａｌｓｅに設定する。
【００７９】
続いて、ＣＰＵ１０１は、引数の関数ｆに関数ｍａｉｎを設定して、サブルーチンＡを実行し（ステップＳ４２）、サブルーチンＡの返却値（変数ｆｌａｇ及び再帰部の関数群）を再帰検出結果として、たとえば、ＲＡＭ１０２に出力する（ステップＳ４３）。
【００８０】
図１６は、サブルーチンＡの処理の一例を示すフローチャートである。
まず、ＣＰＵ１０１は、引数として渡された関数ｆを、変数ＰＡＴＨの末尾の変数に追加する（ステップＳ５０）。続いて、ＣＰＵ１０１は、関数ｆが呼び出す全ての子関数ｆｃについて、各々を引数として渡してサブルーチンＢを実行する（ステップＳ５１）。これにより再帰部が検出される。なお、子関数ｆｃが存在しない場合には、ステップＳ５１の処理では、なにも行われない。その後、ＣＰＵ１０１は、変数ＰＡＴＨの末尾の変数に追加された関数ｆを削除し（ステップＳ５２）、図１４のフローチャートに戻る。
【００８１】
図１７は、サブルーチンＢの処理の一例を示すフローチャートである。
なお、図１７中で、左辺の変数に対して右辺の値を代入（または設定）することを“：＝”で記し、左辺の変数の値と右辺の値との比較を“＝＝”で明示している。以降の図でも同様の意味とする。
【００８２】
まず、ＣＰＵ１０１は、再帰部が抽出できたか否かを表す変数ｆｌａｇの真偽を判定する（ステップＳ６０）。変数ｆｌａｇがｆａｌｓｅの場合には、ステップＳ６１の処理が行われ、変数ｆｌａｇがｔｒｕｅの場合には、サブルーチンＢの処理が終了する。
【００８３】
変数ｆｌａｇがｆａｌｓｅの場合、ＣＰＵ１０１は、配列変数ｖｉｓｉｔｅｄ［ｆｃ］の真偽を判定する（ステップＳ６１）。配列変数ｖｉｓｉｔｅｄ［ｆｃ］がｆａｌｓｅの場合、ステップＳ６２の処理が行われ、ｔｒｕｅの場合、ステップＳ６５の処理が行われる。
【００８４】
配列変数ｖｉｓｉｔｅｄ［ｆｃ］がｆａｌｓｅの場合、ＣＰＵ１０１は、配列変数ｖｉｓｉｔｅｄ［ｆｃ］をｔｒｕｅに設定し（ステップＳ６２）、引数として渡された子関数ｆｃをサブルーチンＡの引数の関数ｆとして設定し、図１６に示したサブルーチンＡを実行する（ステップＳ６３）。
【００８５】
その後、ＣＰＵ１０１は、引数として渡された子関数ｆｃの配列変数ｖｉｓｉｔｅｄ［ｆｃ］をｆａｌｓｅに設定し（ステップＳ６４）、図１６に示したサブルーチンＡに戻る。
【００８６】
一方、ステップＳ６１の処理において、配列変数ｖｉｓｉｔｅｄ［ｆｃ］がｔｒｕｅの場合、ＣＰＵ１０１は分割作業用テーブルにおいて、変数ＰＡＴＨの子関数ｆｃ以降の関数の分割名が、再帰部を示すもの以外で全て同一か否かを判定する（ステップＳ６５）。
【００８７】
変数ＰＡＴＨの子関数ｆｃ以降の関数の分割名が、再帰部を示すもの以外で全て同一の場合、ＣＰＵ１０１は、変数ＰＡＴＨの子関数ｆｃ以降の関数群を再帰部として抽出し（ステップＳ６６）、変数ｆｌａｇをｔｒｕｅに設定する（ステップＳ６７）。
【００８８】
ステップＳ６７の処理の後、または、変数ＰＡＴＨの子関数ｆｃ以降の関数の分割名が、再帰部を示すもの以外で違うものがある場合にはステップＳ６６に示すような抽出は行われず、サブルーチンＡに戻る。
【００８９】
たとえば、以下に示すような静的コールグラフに対して、上記の再帰検出処理を適用した場合について説明する。
図１８は、複数の再帰部を含む静的コールグラフの例を示す図である。
【００９０】
図１８に示す静的コールグラフｄ１０は、図１０に示したものと同じであるが、関数の呼び出し関係を矢印で示してある。たとえば、関数ｍａｉｎは関数ｆ１ａを呼び出し、関数ｆ１ａは、関数ｆ２ａを呼び出していることが、矢印で示されている。ここで、関数ｆ１ａ〜ｆ９ａの部分が閉路であり、再帰部１１０となっている。また関数ｆ３ｂ〜ｆ６ｂの部分も閉路であり、再帰部１１１となっている。
【００９１】
以下では、再帰部１１０を上記の再帰検出処理で検出する例を説明する。
図１４に示されるステップＳ４１の初期化処理が行われた後、関数ｍａｉｎを引数（関数ｆ）として、図１６に示されるサブルーチンＡが実行される。このときサブルーチンＡのステップＳ５０の処理では、変数ＰＡＴＨ＝（ｍａｉｎ）となる。関数ｍａｉｎの子関数ｆｃは関数ｆ１ａ，ｆ１ｂである。ステップＳ５１の処理では、図１０、図１８に示した静的コールグラフｄ１０登録順に処理するとした場合、まずは、関数ｆ１ａを引数としてサブルーチンＢが実行される。
【００９２】
図１７に示されるサブルーチンＢにおいて、ステップＳ６０では、変数ｆｌａｇがｆａｌｓｅに設定されているので、ステップＳ６１の処理が行われる。また、ステップＳ６１の処理では、図１５に示されているように配列変数ｖｉｓｉｔｅｄ［ｆ１ａ］がｆａｌｓｅであるのでステップＳ６２の処理が行われ、配列変数ｖｉｓｉｔｅｄ［ｆ１ａ］はｔｒｕｅに設定され、配列変数ｖｉｓｉｔｅｄ［ｆ］が更新される。
【００９３】
図１９は、更新された配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
図１５に示した初期状態の配列変数ｖｉｓｉｔｅｄ［ｆ］では関数ｆ１ａに関する配列変数ｖｉｓｉｔｅｄ［ｆ］の部分はｆａｌｓｅであったが、図１９に示されている配列変数ｖｉｓｉｔｅｄ［ｆ］ではｔｒｕｅに変更されている。
【００９４】
その後、ＣＰＵ１０１は、引数（関数ｆ）として関数ｆ１ａをサブルーチンＡに渡して、サブルーチンＡを実行する。
サブルーチンＡのステップＳ５０の処理では、変数ＰＡＴＨの末尾に関数ｆ１ａが追加され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ）となる。その後、関数ｆ１ａの子関数ｆｃは関数ｆ２ａであるので、関数ｆ２ａを引数としてサブルーチンＢが実行される。
【００９５】
サブルーチンＢにおいて、ステップＳ６０では、変数ｆｌａｇがｆａｌｓｅであるので、ステップＳ６１の処理が行われる。また、ステップＳ６１の処理では、図１９に示されているようにｖｉｓｉｔｅｄ［ｆ２ａ］がｆａｌｓｅであるのでステップＳ６２の処理が行われ、ｖｉｓｉｔｅｄ［ｆ２ａ］がｔｒｕｅとなり、配列変数ｖｉｓｉｔｅｄ［ｆ］が更新される。
【００９６】
その後、ＣＰＵ１０１は、ステップＳ６３の処理において、引数として関数ｆ２ａをサブルーチンＡに渡して、サブルーチンＡを実行する。
以下、同様の処理が繰り返される。関数ｆ９ａが引数としてサブルーチンＢに渡され、ステップＳ６２の処理により更新されたときの配列変数ｖｉｓｉｔｅｄ［ｆ］は、以下のようになる。
【００９７】
図２０は、関数ｆ９ａについてまで更新された、配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
図２０に示されているように、関数ｍａｉｎ，ｆ１ａ〜ｆ９ａについての配列変数ｖｉｓｉｔｅｄ［ｆ］が、ｔｒｕｅとなっている。
【００９８】
その後、ＣＰＵ１０１は、ステップＳ６３の処理において、引数として関数ｆ９ａをサブルーチンＡに渡して、サブルーチンＡを実行する。
サブルーチンＡのステップＳ５０の処理では、変数ＰＡＴＨの末尾に関数ｆ９ａが追加され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，ｆ８ａ，ｆ９ａ）となる。その後、関数ｆ９ａの子関数ｆｃは関数ｆ１ａであるので、関数ｆ１ａを引数としてサブルーチンＢが実行される。
【００９９】
サブルーチンＢにおいて、ステップＳ６０では、変数ｆｌａｇがｆａｌｓｅであるので、ステップＳ６１の処理が行われる。また、ステップＳ６１の処理では、図２０に示されているように配列変数ｖｉｓｉｔｅｄ［ｆ１ａ］がｔｒｕｅであるのでステップＳ６５の処理が行われる。
【０１００】
ステップＳ６５の処理において、引数（子関数ｆｃ）として渡された関数ｆ１ａ以降、すなわち、関数ｆ１ａ〜ｆ９ａの分割名は、図１３に示した分割作業用テーブルを見ると、全てＭＡＩＮである。つまり、関数ｆ１ａ以降の関数群の分割名が初期値のＭＡＩＮで、再帰部ではないことを示しており、しかも同一であるので、ステップＳ６６の処理が行われる。
【０１０１】
ステップＳ６６の処理では、再帰部として、変数ＰＡＴＨの子関数ｆｃ、つまり関数ｆ１ａ以降の関数群（関数ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，ｆ８ａ，ｆ９ａ）が再帰部として抽出される。その後、ステップＳ６７の処理で変数ｆｌａｇがｔｒｕｅに設定され、サブルーチンＡの処理に戻り、ステップＳ５２の処理が行われる。
【０１０２】
ステップＳ５２の処理では、変数ＰＡＴＨの末尾の関数ｆ、すなわち関数ｆ９ａが削除され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，ｆ８ａ）となる。その後、サブルーチンＢの処理に復帰し、ステップＳ６４の処理が行われる。ステップＳ６４の処理では、子関数ｆｃの関数ｆ９ａについての配列変数ｖｉｓｉｔｅｄ［ｆ９ａ］がｆａｌｓｅに設定される。
【０１０３】
図２１は、関数ｆ９ａにおける配列変数ｖｉｓｉｔｅｄ［ｆ］が変更された例を示す図である。
図２０に示した配列変数ｖｉｓｉｔｅｄ［ｆ］では関数ｆ９ａに関する配列変数ｖｉｓｉｔｅｄ［ｆ］の部分はｔｒｕｅであったが、図２１に示されている配列変数ｖｉｓｉｔｅｄ［ｆ］ではｆａｌｓｅに変更されている。
【０１０４】
その後、同様の処理が行われ、変数ＰＡＴＨが空になり、配列変数ｖｉｓｉｔｅｄ［ｆ］が全ての関数についてｆａｌｓｅになると、サブルーチンＡが終了し、図１４に示した処理フローに復帰し、ステップＳ４３の処理が行われる。すなわち、再帰部として検出された関数ｆ１ａ〜ｆ９ａと、変数ｆｌａｇ＝ｔｒｕｅが、再帰検出結果として出力される。
【０１０５】
続いて、図１２に示したステップＳ３３の分割処理の詳細を説明する。
（分割処理）
以下では、ｉ番目に検出された再帰部の関数群を示す再帰関数リストにしたがって分割処理を行う例について説明する。
【０１０６】
図２２は、分割処理の一例を示すフローチャートである。
分割処理が開始され、たとえば、ＲＡＭ１０２に格納されている再帰部の関数群を示した再帰関数リストと、分割作業用テーブルがＣＰＵ１０１に入力されると（ステップＳ７０）、カウンタ変数ｊを１に初期化する（ステップＳ７１）。
【０１０７】
続いて、ＣＰＵ１０１は、入力された再帰関数リストのｊ番目に当たる関数ｆ＿ｉ，ｊの分割名をＲｉとして設定する（ステップＳ７２）。その後、ＣＰＵ１０１は、カウンタ変数ｊが、ｉ番目の再帰部の関数の数ｎ（ｉ）よりも小さいか否かを判定する（ステップＳ７３）。
【０１０８】
カウンタ変数ｊが、ｎ（ｉ）よりも小さい場合には、ＣＰＵ１０１はカウンタ変数ｊをインクリメントし（ステップＳ７４）、ステップＳ７２からの処理を繰り返す。カウンタ変数ｊが、ｎ（ｉ）に達した場合、ＣＰＵ１０１はカウンタ変数ｊを再度、１に初期化する（ステップＳ７５）。
【０１０９】
前述した再帰部１１０の検出処理後の分割処理における、ステップＳ７５の処理時点での分割作業用テーブルは、たとえば、以下のようになる。
図２３は、分割作業用テーブルの更新例を示す図である。
【０１１０】
図２３に示されているように、再帰部１１０の関数群である、関数ｆ１ａ〜ｆ９ａの分割名が、ＭＡＩＮからＲ１に変更されている。
その後、ＣＰＵ１０１は、再帰関数リストの関数ｆ＿ｉ，ｊの子孫関数のうち、分割作業用テーブルの分割名が、ＲｊでもＲｋ（ｋ＜ｊ）でもｒｋ，ｌ（ｌは自然数）でもないものについて、分割名ｒｉ，ｊを設定する（ステップＳ７６）。これは、関数ｆ＿ｉ，ｊの子孫関数のうち、再帰を構成している子関数（ｆ＿ｉ，（ｊ＋１））以外のもので、以前に再帰部の関数として分割名が設定された関数及びそれの子孫関数を除いた関数について、分割名ｒｉ，ｊを与えるということを、意味している。
【０１１１】
たとえば、図１８に示した静的コールグラフｄ１０から、再帰部１１０が検出された後、再帰部１１０に含まれる関数ｆ２ａの子孫関数である関数ｆ３ｂについては、まだ再帰部１１１の関数としての分割名が設定されていないため、分割名ｒ１，１が設定される。
【０１１２】
その後、再び、ＣＰＵ１０１は、カウンタ変数ｊが、ｉ番目の再帰部の関数の数ｎ（ｉ）よりも小さいか否かを判定する（ステップＳ７７）。
カウンタ変数ｊが、ｎ（ｉ）よりも小さい場合には、ＣＰＵ１０１はカウンタ変数ｊをインクリメントし（ステップＳ７８）、ステップＳ７６からの処理を繰り返す。カウンタ変数ｊが、ｎ（ｉ）に達した場合、ＣＰＵ１０１は、分割作業用テーブルを出力し（ステップＳ７９）、たとえば、ＲＡＭ１０２に格納して、ステップＳ３３の分割処理を終える。
【０１１３】
カウンタ変数ｊが、ｎ（ｉ）に達した時点での、分割作業用テーブルは、たとえば、以下のようになる。
図２４は、１つ目の再帰部の検出後に行われる分割処理後の分割作業用テーブルの例を示す図である。
【０１１４】
再帰部１１０に含まれる関数ｆ２ａの子孫関数である、関数ｆ３ｂ，ｆ４ｂ，ｆ５ｂ，ｆ５ｄ，ｆ６ｂ，ｆ７ｂについては、分割名ｒ１，１が設定されている。再帰部１１０に含まれる関数ｆ４ａの子孫関数である、関数ｆ５ｃ，ｆ６ｃ，ｆ７ｃ，ｆ８ｃについては、分割名ｒ１，２が設定されている。再帰部１１０に含まれる関数ｆ７ａの子孫関数である、関数ｆ７ｄについては、分割名ｒ１，３が設定されている。
【０１１５】
このような分割処理が行われると、再び、図１２のステップＳ３２の再帰検出処理が行われる。
以下では、図１８に示した静的コールグラフｄ１０の再帰部１１１を検出する例を説明する。
【０１１６】
再帰部１１０を検出する際と同様に、図１４、図１６、図１７に示した処理が行われる。前述と同様に処理が進み、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，ｆ８ａ，ｆ９ａ）となり、引数として渡された関数ｆ１ａに関するサブルーチンＢが実行される。サブルーチンＢのステップＳ６１の判定では、配列変数ｖｉｓｉｔｅｄ［ｆ１ａ］がｔｒｕｅであるので、ステップＳ６５の処理が実行される。
【０１１７】
ステップＳ６５の処理において、ＣＰＵ１０１は、図２４に示したような分割作業用テーブルを参照する。ここで、変数ＰＡＴＨの関数ｆ１ａ以降の分割名は全て、Ｒ１となっている。分割名Ｒ１は、再帰部１１０を示すものであるため、サブルーチンＢの処理が終了し、サブルーチンＡに復帰し、ステップＳ５２の処理が行われる。
【０１１８】
ステップＳ５２の処理では、変数ＰＡＴＨの末尾の関数ｆ、すなわち関数ｆ９ａが削除され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，ｆ８ａ）となる。その後、サブルーチンＢの処理に復帰し、ステップＳ６４の処理が行われる。ステップＳ６４の処理では、子関数ｆｃの関数ｆ９ａについての配列変数ｖｉｓｉｔｅｄ［ｆ９ａ］がｆａｌｓｅに設定される。
【０１１９】
その後、同様に、サブルーチンＡのステップＳ５２の処理が行われ、変数ＰＡＴＨの末尾の関数ｆ８ａが削除され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ）となる。その後、サブルーチンＢのステップＳ６４の処理が行われる。ステップＳ６４の処理では、子関数ｆｃの関数ｆ８ａについての配列変数ｖｉｓｉｔｅｄ［ｆ８ａ］がｆａｌｓｅに設定される。
【０１２０】
続いて、サブルーチンＡのステップＳ５１において、関数ｆ７ａのもう１つの子関数ｆｃである関数ｆ７ｄが引数としてサブルーチンＢに渡され、サブルーチンＢが実行される。
【０１２１】
サブルーチンＢにおいて、ステップＳ６０では、変数ｆｌａｇがｆａｌｓｅであるので、ステップＳ６１の処理が行われる。また、ステップＳ６１の処理では、関数ｆ７ｄの探索はこれまで行われていなかったので、配列変数ｖｉｓｉｔｅｄ［ｆ７ｄ］はｆａｌｓｅである。これにより、ステップＳ６２の処理が行われ、配列変数ｖｉｓｉｔｅｄ［ｆ７ｄ］はｔｒｕｅに設定され、配列変数ｖｉｓｉｔｅｄ［ｆ］が更新される。
【０１２２】
図２５は、更新された配列変数ｖｉｓｉｔｅｄ［ｆ］の例を示す図である。
図２５の配列変数ｖｉｓｉｔｅｄ［ｆ］では、関数ｆ７ｄに関する配列変数ｖｉｓｉｔｅｄ［ｆ］の部分がｔｒｕｅに変更されている。
【０１２３】
その後、ステップＳ６３の処理において、関数ｆ７ｄを引数として、サブルーチンＡが実行される。
サブルーチンＡのステップＳ５０の処理では、変数ＰＡＴＨの末尾に関数ｆ７ｄが追加され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ，７ｄ）となる。その後、関数ｆ７ｄの子関数ｆｃは存在しないので、ステップＳ５１のサブルーチンＢは実行されず、ステップＳ５２の処理が実行され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ，ｆ７ａ）となる。
【０１２４】
続いて、サブルーチンＢのステップＳ６４の処理に戻り、関数ｆ７ｄについての配列変数ｖｉｓｉｔｅｄ［ｆ７ｄ］がｆａｌｓｅに設定される。
その後、サブルーチンＡのステップＳ５２の処理に戻り、変数ＰＡＴＨの末尾の関数ｆ７ａが削除され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ａ，ｆ４ａ，ｆ５ａ，ｆ６ａ）となる。
【０１２５】
以下、同様の処理が進むと、サブルーチンＡのステップＳ５１において、関数ｆ２ａの、もう１つの子関数である関数ｆ３ｂを引数としたサブルーチンＢが実行される。
サブルーチンＢにおいて、ステップＳ６０では、変数ｆｌａｇがｆａｌｓｅであるので、ステップＳ６１の処理が行われる。また、ステップＳ６１の処理では、関数ｆ３ｂの探索はこれまで行われていなかったので、配列変数ｖｉｓｉｔｅｄ［ｆ３ｂ］はｆａｌｓｅである。これにより、ステップＳ６２の処理が行われ、配列変数ｖｉｓｉｔｅｄ［ｆ３ｂ］はｔｒｕｅに設定され、配列変数ｖｉｓｉｔｅｄ［ｆ］が更新される。
【０１２６】
その後、関数ｆ３ｂを引数としたサブルーチンＡが実行される。ステップＳ５０の処理において、変数ＰＡＴＨの末尾に関数ｆ３ｂが追加され、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ｂ）となる。
【０１２７】
次に、関数ｆ３ｂの子関数ｆｃである関数ｆ４ｂ、関数ｆ４ｂの子関数ｆｃであり、静的コールグラフｄ１０の上位に位置する関数ｆ５ｂ、関数ｆ５ｂの子関数ｆｃである関数ｆ６ｂについても同様の処理が行われる。
【０１２８】
関数ｆ６ｂの子関数ｆｃである関数ｆ３ｂを引数としたサブルーチンＢの実行時、配列変数ｖｉｓｉｔｅｄ［ｆ３ｂ］がｔｒｕｅに設定されているので、サブルーチンＢのステップＳ６１の判定処理により、ステップＳ６５の処理が行われることになる。
【０１２９】
ステップＳ６５の処理の時点において、変数ＰＡＴＨは、変数ＰＡＴＨ＝（ｍａｉｎ，ｆ１ａ，ｆ２ａ，ｆ３ｂ，ｆ４ｂ，ｆ５ｂ，ｆ６ｂ）となっている。図２４に示したような分割作業用テーブルでは、関数ｆ３ｂ以降の関数ｆ４ｂ，ｆ５ｂ，ｆ６ｂの分割名が、同一の分割名ｒ１，１となっており、再帰部１１０を示すものでもないため、ステップＳ６６の処理が行われる。
【０１３０】
すなわち、ＣＰＵ１０１は、変数ＰＡＴＨの関数ｆ３ｂ以降を再帰部１１１として抽出する。そして、ステップＳ６７の処理で、変数ｆｌａｇがｔｒｕｅに設定される。その後は、前述の再帰部１１０の検出処理と同様に、配列変数ｖｉｓｉｔｅｄ［ｆ］をｆａｌｓｅに設定する処理と変数ＰＡＴＨの末尾の関数を削除する処理とが繰り返された後、図１４のステップＳ４３の処理に戻り、再帰検出結果として、再帰部１１１となる関数群（関数ｆ３ｂ〜ｆ６ｂ）と変数ｆｌａｇ＝ｔｒｕｅが、出力される。
【０１３１】
その後、再び、図２２に示したような分割処理が行われる。
詳細な説明は省略するが、上記のように検出されたｉ＝２番目に検出された再帰部１１１の関数群（関数ｆ３ｂ〜ｆ６ｂ）を示す再帰関数リストにしたがって、図２２の処理が実行される。
【０１３２】
２つの目の再帰部１１１の各関数については、ステップＳ７２の処理により、分割名としてＲ２が与えられる。
図２６は、ステップＳ７９の処理で出力される分割作業用テーブルの例を示す図である。
【０１３３】
再帰部１１１に含まれる関数ｆ３ｂ〜ｆ６ｂについて、分割名Ｒ２が与えられている。また、関数ｆ３ｂの子孫関数のうち、再帰部１１１に含まれない関数ｆ５ｄに分割名ｒ２，１が付与され、関数ｆ７ｂに分割名ｒ２，２が付与される。
【０１３４】
（分割情報出力処理）
図１２に示したステップＳ３４の処理では、ＣＰＵ１０１は、たとえば、図１１に示した関数サイズ情報と、図２６のように更新された分割作業用テーブルをもとに、分割情報を生成して出力する。
【０１３５】
図２７は、分割情報の例を示す図である。
分割情報には、各分割名の関数のリストと、各分割名の関数の合計コードサイズと、後述する分割案と、採用分割案が含まれる。分割情報の初期値において、分割案と採用分割案はＮＵＬＬとなっている。
【０１３６】
続いて、図８のステップＳ２２の再帰部の分割案作成処理の詳細を説明する。
（再帰部の分割案作成処理）
図２８は、再帰部の分割案作成処理の一例を示すフローチャートである。
【０１３７】
ＣＰＵ１０１は、たとえば、図２７に示したような、分割情報を入力する（ステップＳ８０）。そして、ＣＰＵ１０１は、再帰部の番号をカウンタ変数ｉとして、まず、カウンタ変数ｉの初期値に１を設定する（ステップＳ８１）。また、ＣＰＵ１０１は、再帰部の中で分割する関数の番号をカウンタ変数ｊとして、カウンタ変数ｊの初期値に１を設定する（ステップＳ８２）。また、ＣＰＵ１０１は、カウンタ変数ｋの初期値にカウンタ変数ｊの値を設定する（ステップＳ８３）。
【０１３８】
次に、ＣＰＵ１０１は、分割名Ｒｉの再帰部に含まれる関数ｆｊの手前と関数ｆｋの手前で分割した時の、各関数群の合計コードサイズσ，τを含む分割案（ｊ，ｋ）＝（σ，τ），分割案（ｋ，ｊ）＝（τ，σ）を算出する（ステップＳ８４）。
【０１３９】
たとえば、図１８に示した再帰部１１０において、関数ｆ１ａの手前と関数ｆ２ａの手前で分割するとは、再帰部１１０を、関数ｆ１ａと、関数ｆ２ａ〜関数ｆ９ａの２つの分割部に分割するということである。
【０１４０】
ここでは、図１８に示した再帰部１１０において、関数ｆ１ａ〜ｆ９ａを、ｊ＝１〜９の関数ｆ１〜ｆ９とする。たとえば、ｊ＝１、ｋ＝２の場合、関数ｆ１の手前と、関数ｆ２の手前で分割したときの分割案（１，２），（２，１）が求められ、σは関数ｆ１のコードサイズ、τは関数ｆ２〜ｆ９の合計コードサイズとなる。
【０１４１】
コードサイズσ，τは以下の式で表される。
【０１４２】
【数１】
0005776347.tif 000002
【０１４３】
【数２】
0005776347.tif 000003
【０１４４】
式（１）において、ｓ（ｆi,t）は、ｉ番目の再帰部のｔ番目の関数ｆi,tのコードサイズを示している。また、式（２）において、ｓ（ｆi,u）は、ｉ番目の再帰部のｕ番目の関数ｆi,uのコードサイズを示している。ｎ（ｉ）は、ｉ番目の再帰部に含まれる関数の数を示している。
【０１４５】
次に、ＣＰＵ１０１は、カウンタ変数ｋが、ｎ（ｉ）よりも小さいか否かを判定する（ステップＳ８５）。
カウンタ変数ｋが、ｎ（ｉ）よりも小さい場合には、ＣＰＵ１０１はカウンタ変数ｋをインクリメントし（ステップＳ８６）、ステップＳ８４からの処理を繰り返す。カウンタ変数ｋが、ｎ（ｉ）に達した場合、ＣＰＵ１０１は、カウンタ変数ｊが、ｎ（ｉ）よりも小さいか否かを判定する（ステップＳ８７）。
【０１４６】
カウンタ変数ｊが、ｎ（ｉ）よりも小さい場合には、ＣＰＵ１０１はカウンタ変数ｊをインクリメントし（ステップＳ８８）、ステップＳ８３からの処理を繰り返す。カウンタ変数ｊが、ｎ（ｉ）に達した場合、ＣＰＵ１０１は、カウンタ変数ｉが、再帰部の数を示すＮよりも小さいか否かを判定する（ステップＳ８９）。
【０１４７】
カウンタ変数ｉが、Ｎよりも小さい場合には、ＣＰＵ１０１はカウンタ変数ｉをインクリメントし（ステップＳ９０）、ステップＳ８２からの処理を繰り返す。カウンタ変数ｉが、Ｎに達している場合、ＣＰＵ１０１は、上記の分割案入りの分割情報を出力し、たとえばＲＡＭ１０２などに格納する（ステップＳ９１）。
【０１４８】
図２９は、分割案入りの分割情報の例を示す図である。
図２９に示される分割情報には、分割名Ｒ１の再帰部１１０の分割案としてテーブルｔｂｌ１が追加されている。また、分割名Ｒ２の再帰部１１１の分割案としてテーブルｔｂｌ２が追加されている。
【０１４９】
図３０は、テーブルｔｂｌ１の例を示す図である。
図３０には、再帰部１１０の関数ｆ１ａ〜ｆ９ａにおいて、分割する位置に応じた関数群のコードサイズ（前述のσとτ）が示されている。なお、図３０では、関数ｆ１ａ〜ｆ９ａのコードサイズは、それぞれ１ＫＢとしている。
【０１５０】
たとえば、関数ｆ１ａの手前と、関数ｆ２ａの手前で分割したとき（分割案（ｆ１ａ，ｆ２ａ））、σは関数ｆ１ａのコードサイズとなり１ＫＢ、τは関数ｆ２ａ〜ｆ９ａの合計コードサイズとなり８ＫＢとなる。そのため、図３０に示されているように、（１，８）が得られる。なお、分割案（ｆ１ａ，ｆ１ａ），（ｆ２ａ，ｆ２ａ）などは、分割しないことを示している。
【０１５１】
図３１は、テーブルｔｂｌ２の例を示す図である。
図３１には、再帰部１１１の関数ｆ３ｂ〜ｆ６ｂにおいて、分割する位置に応じた関数群のコードサイズ（前述のσとτ）が示されている。なお、図３１では、関数ｆ３ａのコードサイズは、０．５ＫＢ、関数ｆ４ｂのコードサイズは、１．０ＫＢ、関数ｆ５ｂのコードサイズは、１．５ＫＢ、関数ｆ６ｂのコードサイズは、２．０ＫＢとしている。
【０１５２】
たとえば、関数ｆ６ｂの手前と関数ｆ３ｂの手前で分割したとき（分割案（ｆ６ｂ，ｆ３ｂ））、τは関数ｆ６ｂのコードサイズとなり２．０ＫＢ、σは関数ｆ３ｂ〜ｆ５ｂの合計コードサイズとなり３．０ＫＢとなる。そのため、図３１に示されているように、（２．０，３．０）が得られる。
【０１５３】
以上のようなテーブルｔｂｌ１，ｔｂｌ２が、図８に示した分割案ｄ１３として、分割情報ｄ１２とともに、ステップＳ２３の処理で用いられる。
続いて、図８のステップＳ２３の関数割り当て処理の詳細を説明する。
【０１５４】
（関数割り当て処理）
図３２は、関数割り当て処理の一例を示すフローチャートである。
ＣＰＵ１０１は、たとえば、ＲＡＭ１０２に保持されている、分割情報ｄ１２、分割案ｄ１３、メモリバンク構成情報ｄ３、関数サイズ情報ｄ１１などの情報を入力する（ステップＳ１００）。
【０１５５】
その後、ＣＰＵ１０１は各種変数の初期化を行う（ステップＳ１０１）。
図３３は、初期化後の変数ｍ＿ｒｅｓｔ［Ｍ］の一例を示す図である。
変数ｍ＿ｒｅｓｔ［Ｍ］は、各メモリバンクの残り容量を示している。Ｍはメモリバンクの番号を示している。ＣＰＵ１０１は、図９に示したようなメモリバンク構成情報ｄ３をもとに、変数ｍ＿ｒｅｓｔ［Ｍ］に、各メモリバンクの容量を設定する。
【０１５６】
図３４は、初期化後の分割情報の一例を示す図である。
ＣＰＵ１０１は、分割情報に、その分割名の関数の割り当てが済んでいるか否かを示す情報を追加し、初期化時には、その情報を“未”としておく。
【０１５７】
また、ステップＳ１０１の処理では、以下のような割り当て情報が生成される。
図３５は、初期化時の割り当て情報の一例を示す図である。
割り当て情報には、分割名とその分割名で示される関数と、その分割名の関数が割り当てられるメモリバンクの番号が含まれる。初期化時には、メモリバンクへの割り当ては行われていないので、メモリバンク番号の欄はブランクとなっている。
【０１５８】
初期化が終わると、ＣＰＵ１０１は、分割名がＭＡＩＮの関数について、メモリバンクへの割り当てを行う（ステップＳ１０２）。ＣＰＵ１０１は、関数ｍａｉｎを含む分割名ＭＡＩＮの関数群については、たとえば、電力制御状態を常時通常状態とするメモリバンクに割り当てる。常時通常状態とするメモリバンクを、Ｍ＝０のメモリバンクとすると、図３５に示した割り当て情報の分割名がＭＡＩＮの欄のメモリバンク番号が、０に設定される。また、ＣＰＵ１０１は、図３４に示した分割情報において、割り当てが済んでいるか否かを示す情報を、“未”から“済”に更新する。また、ＣＰＵ１０１は、図３３に示したＭ＝０のメモリバンクの変数ｍ＿ｒｅｓｔから、分割名がＭＡＩＮの関数の合計コードサイズを差し引く。なお、電力制御状態を常時通常状態とするメモリバンクに、他の分割名の関数を配置させない場合には、Ｍ＝０のメモリバンクの変数ｍ＿ｒｅｓｔ［０］を０．０ＫＢとしてもよい。
【０１５９】
続いて、ＣＰＵ１０１は、残り容量が最大のメモリバンクＭ＿Ｍａｘと、合計コードサイズが最大の分割部Ｆ＿Ｍａｘを選択する（ステップＳ１０３）。Ｍ＿Ｍａｘには、変数ｍ＿ｒｅｓｔ［Ｍ］が最大のメモリバンクが選択される。Ｆ＿Ｍａｘには、合計コードサイズが最大の分割名の関数群が選択される。
【０１６０】
そして、ＣＰＵ１０１は、選択されたＦ＿Ｍａｘが再帰部であるか否かを判定する（ステップＳ１０４）。Ｆ＿Ｍａｘが再帰部である場合には、ステップＳ１０５の処理が行われ、再帰部でない場合には、ステップＳ１０９の処理が行われる。
【０１６１】
たとえば、図３４に示した分割情報では、分割名がＲ１の関数群の合計コードサイズが最大となり、分割案として、ｔｂｌ１が設定されているので、再帰部として判定され、ステップＳ１０５の処理が行われる。分割案がＮＵＬＬの場合には、再帰部ではないと判定される。なお、ＣＰＵ１０１は、分割名からＦ＿Ｍａｘが再帰部であるか否かを判定するようにしてもよい。たとえば、分割名Ｒ１，Ｒ２は、再帰部を示しているので、このような分割名をもつＦ＿Ｍａｘの場合には、再帰部であると判定されるようにしてもよい。
【０１６２】
Ｆ＿Ｍａｘが再帰部である場合、ＣＰＵ１０１は、図３４に示したような分割情報を参照して、採用する分割案が設定済であるか否かを判定する（ステップＳ１０５）。設定済でない場合には、ステップＳ１０６の処理が行われ、設定済の場合にはステップＳ１０８の処理が行われる。
【０１６３】
たとえば、分割情報において、図３４のように、採用分割案がＮＵＬＬのままである場合には、ステップＳ１０６の処理が行われる。
採用する分割案が設定済でない場合、ＣＰＵ１０１は、採用分割案を選択して、Ｍ＿Ｍａｘに割り当てる関数群Ｆを設定する（ステップＳ１０６）。
【０１６４】
ステップＳ１０６の処理では、ＣＰＵ１０１は、図３０、図３１のような分割案を示すテーブルｔｂｌ１，ｔｂｌ２を参照する。たとえば、Ｆ＿Ｍａｘとして選択された分割名Ｒ１の分割部では、分割案としてテーブルｔｂｌ１が設定されている。ＣＰＵ１０１は、分割したときの２つの関数群のそれぞれのコードサイズのうち、第２要素が変数ｍ＿ｒｅｓｔを超えない範囲で最大となる分割案を選択する。
【０１６５】
最大のｍ＿ｒｅｓｔ［Ｍ］が８ＫＢの場合、図３０に示される分割案のうち、たとえば、関数ｆ１ａ，ｆ２ａのそれぞれ手前で分割することで得られる（ｆ１ａ，ｆ２ａ）＝（１，８）が選択される。この分割案の第２要素のコードサイズ（８ＫＢ）となる関数群（ｆ２ａ〜ｆ９ａ）が、関数群Ｆとして設定される。
【０１６６】
その後、ＣＰＵ１０１は、採用分割案を分割情報に設定する（ステップＳ１０７）。上記の例の場合、ＣＰＵ１０１は、分割名Ｒ１の分割部の採用分割案の部分を、ＮＵＬＬから、（ｆ１ａ，ｆ２ａ）に変更する。その後、ステップＳ１１０の処理が行われる。
【０１６７】
ステップＳ１０５の処理で、採用分割案が設定済みと判定した場合、ＣＰＵ１０１は、採用分割案の２つの要素のうち未割り当て側を関数群Ｆとして設定する（ステップＳ１０８）。たとえば、分割案（ｆ１ａ，ｆ２ａ）が採用されている場合で、関数群（ｆ２ａ〜ｆ９ａ）のメモリバンクへの割り当てが済んでいる場合、残っている関数ｆ１ａが、関数群Ｆとして設定される。その後、ステップＳ１１０の処理が行われる。
【０１６８】
一方、ステップＳ１０４の処理で、Ｆ＿Ｍａｘが再帰部ではないと判定された場合、関数群Ｆとして、Ｆ＿Ｍａｘが設定される。
次に、ＣＰＵ１０１は、関数群Ｆのコードサイズｓ（Ｆ）が、Ｍ＿Ｍａｘの残り容量（ｍ＿ｒｅｓｔ［Ｍ＿Ｍａｘ］）以下であるか判定する（ステップＳ１１０）。ｓ（Ｆ）がｍ＿ｒｅｓｔ［Ｍ＿Ｍａｘ］以下であれば割り当てが可能なので、ＣＰＵ１０１は、関数群Ｆを、Ｍ＿Ｍａｘに割り当てる（ステップＳ１１１）。また、ＣＰＵ１０１は、ｓ（Ｆ）を、ｍ＿ｒｅｓｔ［Ｍ＿Ｍａｘ］から減じる。
【０１６９】
たとえば、分割名Ｒ１の分割部のうち、関数ｆ２ａ〜ｆ９ａをＭ＝１のメモリバンクに割り当てたとき、割り当て情報は以下のようになる。
図３６は、割り当て情報の更新例を示す図である。
【０１７０】
分割名Ｒ１の分割部（再帰部）が、さらに２つに分割されているので、図３６に示されているように、一方の分割名をＲ１＿１、他方をＲ１＿２としている。本実施の形態の例では、これらのうち、コードサイズの大きいものが最初にメモリバンクに割り当てられる。図３６の例では、分割名Ｒ１＿１の関数ｆ２ａ〜ｆ９ａが、メモリバンク番号が１のメモリバンクに割り当てられ、残りの分割名Ｒ１＿２の関数ｆ１ａは、未割り当て状態となっている。
【０１７１】
図３７は、分割情報の更新例を示す図である。
分割名Ｒ１の分割部について、採用分割案として（ｆ１ａ，ｆ２ａ）が設定されている。割り当て情報の分割名Ｒ１＿１の関数群についてはメモリバンクへの割り当てが済んでいる場合でも、分割名Ｒ１＿２の関数群についての割り当てが済んでいない場合には、分割情報で管理されている割り当て済みか否かを示す情報は、“未”のままである。
【０１７２】
関数群ＦのＭ＿Ｍａｘへの割り当て後、ＣＰＵ１０１は、割り当て情報に含まれる全ての分割名の関数群の割り当てが済んでいるか判定する（ステップＳ１１２）。
全て割り当て済みの場合には、ＣＰＵ１０１は、更新した割り当て情報を出力し（ステップＳ１１３）、たとえば、ＲＡＭ１０２などに格納し、関数割り当て処理が終了する。割り当てていないものがある場合には、ステップＳ１０３からの処理が繰り返される。
【０１７３】
たとえば、分割名Ｒ１の分割部のメモリバンクへの割り当ての際、分割名Ｒ１＿２の関数群の割り当てが済んでいない場合、分割情報で管理されている分割名Ｒ１の分割部の割り当て済みか否かを示す情報は、図３７に示したように、“未”のままである。そのため、ステップＳ１０３の処理では、再び分割名Ｒ１の分割部がＦ＿Ｍａｘとして選択される。
【０１７４】
その後、ステップＳ１０５の判定処理から、ステップＳ１０８の処理に進み、未割り当ての分割名Ｒ１＿２の関数群が関数群Ｆとして設定され、ステップＳ１１１にてＭ＿Ｍａｘに割り当てられることになる。
【０１７５】
一方、ステップＳ１１０の処理において、ｓ（Ｆ）が、ｍ＿ｒｅｓｔ［Ｍ＿Ｍａｘ］を超える場合には、その関数群Ｆはどのメモリバンクにも割り当てられないので、エラーが出力される（ステップＳ１１４）。ＣＰＵ１０１は、たとえば、グラフィック処理装置１０４を制御して、モニタ１０４ａの画面上にエラーを表示させ、関数割り当て処理を終了する。
【０１７６】
図３８は、出力される割り当て情報の例を示す図である。
図３８の例では、各分割名の関数が、メモリバンク番号が０〜４のメモリバンクに割り当てられている。
【０１７７】
以上のような関数割り当て処理が終了すると、図３８に示したような割り当て情報を用いて、図８のステップＳ２４のアドレス計算が行われる。
以下、アドレス計算処理の詳細を説明する。
【０１７８】
（アドレス計算処理）
図３９は、アドレス計算処理の一例を示すフローチャートである。
ＣＰＵ１０１は、たとえば、ＲＡＭ１０２に保持されている、割り当て情報ｄ１４、メモリバンク構成情報ｄ３、関数サイズ情報ｄ１１などの情報を入力する（ステップＳ１２０）。
【０１７９】
その後、ＣＰＵ１０１は変数の初期化を行う（ステップＳ１２１）。ここでは、ＣＰＵ１０１は、メモリバンク構成情報ｄ３をもとに、関数の開始アドレスを示す変数ｓｔａｒｔ＿ａｄｄｒ［Ｍ］を、メモリバンク番号がＭのメモリバンクの開始アドレスに設定する。
【０１８０】
続いてＣＰＵ１０１は、割り当て情報ｄ１４から、同じ分割名のついた関数群を抽出する（ステップＳ１２２）。たとえば、図３８に示したような割り当て情報から、まず、メモリバンク番号が０のメモリバンクに割り当てられる分割名ＭＡＩＮの関数ｍａｉｎ，ｆ１ｂ，ｆ２ｂ，ｆ２ｃが抽出される。
【０１８１】
そして、ＣＰＵ１０１は、カウンタ変数ｉに１を設定し（ステップＳ１２３）、抽出した関数群のうち、ｉ番目の関数ｆｉの開始アドレスとして、変数ｓｔａｒｔ＿ａｄｄｒ［Ｍ］を割り当てる（ステップＳ１２４）。
【０１８２】
その後、ＣＰＵ１０１は、割り当てた関数ｆｉのコードサイズをもとに、変数ｓｔａｒｔ＿ａｄｄｒ［Ｍ］を更新した後（ステップＳ１２５）、カウンタ変数ｉが抽出した関数の数ｎよりも小さいか否かを判定する（ステップＳ１２６）。ｉ＜ｎの場合には、ＣＰＵ１０１は、カウンタ変数ｉをインクリメントし（ステップＳ１２７）、ステップＳ１２４からの処理を繰り返す。カウンタ変数ｉがｎに達した場合、ＣＰＵ１０１は、割り当て情報ｄ１４の全ての分割名の関数群について割り当てが完了したか判定する（ステップＳ１２８）。
【０１８３】
全ての割り当てが完了した場合には、ＣＰＵ１０１は、メモリマップを出力し（ステップＳ１２８）、たとえば、ＲＡＭ１０２に格納し、アドレス計算処理を終える。全ての割り当てが完了していない場合には、ＣＰＵ１０１は、ステップＳ１２２からの処理を繰り返す。
【０１８４】
図４０は、出力されるメモリマップの一例を示す図である。
メモリマップには、各メモリバンクに割り当てられた、各関数の開始アドレスが設定されている。
【０１８５】
以上のようなアドレス計算処理が終了し、メモリマップが作成されると、図７に示したように、ステップＳ１２の電力制御コード挿入処理が行われる。以下、電力制御コード挿入処理の詳細を説明する。
【０１８６】
（電力制御コード挿入処理）
図４１は、電力制御コード挿入処理の一例を示すフローチャートである。
ＣＰＵ１０１は、たとえば、ＲＡＭ１０２に保持されている、プログラム（アセンブリ）ｄ２、メモリマップｄ４などの情報を入力する（ステップＳ１３０）。次に、ＣＰＵ１０１は、プログラムｄ２の先頭から命令を取り出していき（ステップＳ１３１）、その命令が関数呼び出し命令であるか否か判定する（ステップＳ１３２）。
【０１８７】
命令が、関数呼び出し命令である場合には、ステップＳ１３３の処理が行われ、関数呼び出し命令ではない場合、ステップＳ１３５の処理が行われる。
命令が、関数呼び出し命令の場合、ＣＰＵ１０１は、メモリマップｄ４を参照して、呼び出し元関数と呼び出し先関数のメモリバンクが同一か否かを判定する（ステップＳ１３３）。
【０１８８】
呼び出し元関数と呼び出し先関数のメモリバンクが同一でない場合には、ステップＳ１３４の処理が行われ、同一の場合には、ステップＳ１３５の処理が行われる。
呼び出し元関数と呼び出し先関数のメモリバンクが同一でない場合、ＣＰＵ１０１は、電力制御コードを生成して、関数呼び出し命令の直前と直後に挿入する（ステップＳ１３４）。
【０１８９】
関数呼び出し命令の直前に挿入される電力制御コードは、呼び出し元関数が配置されているメモリバンクの電力制御状態を省電力状態とし、呼び出し先関数が配置されているメモリバンクの電力制御状態を通常状態とするものである。
【０１９０】
また、関数呼び出し命令の直後に挿入される電力制御コードは、呼び出し元関数が配置されているメモリバンクと、関数ｍａｉｎが配置されているメモリバンク以外のメモリバンクの電力制御状態を省電力状態とするものである。
【０１９１】
その後、ＣＰＵ１０１は、取り出した命令が、関数の末尾のものか否かを判定する（ステップＳ１３５）。ＣＰＵ１０１が取り出した命令が、関数の末尾であれば、ステップＳ１３６の処理が行われ、関数の末尾でなければ、ステップＳ１３８の処理が行われる。
【０１９２】
取り出した命令が関数の末尾である場合、ＣＰＵ１０１は、関数とその関数の全ての呼び出し元関数のメモリバンクが同一であるか否かを判定する（ステップＳ１３６）。
関数とその関数の全ての呼び出し元関数のメモリバンクが同一ではない場合、ステップＳ１３７の処理が行われ、同一の場合には、ステップＳ１３８の処理が行われる。
【０１９３】
関数とその関数の全ての呼び出し元関数のメモリバンクが同一ではない場合、ＣＰＵ１０１は、関数の末尾に、電力制御コードを挿入する（ステップＳ１３７）。
この電力制御コードは、その関数を呼び出している全ての関数が配置されているメモリバンクの電力制御状態を、通常状態とするものである。
【０１９４】
続いて、ＣＰＵ１０１は、プログラム全体の末尾を検出する（ステップＳ１３８）。プログラム全体の末尾が検出された場合、ＣＰＵ１０１は、電源制御コード入りのプログラム（アセンブリ）ｄ５を出力し（ステップＳ１３９）、たとえば、ＲＡＭ１０２などに記憶し、電力制御コード挿入処理を終える。
【０１９５】
一方、ステップＳ１３８の処理で、プログラム全体の末尾が検出されていない場合には、ステップＳ１３１からの処理が繰り返される。
以上のようにして生成された電源制御コード入りのプログラム（アセンブリ）ｄ５は、図７に示したように、アセンブルにより、電力制御コード入りプログラム（オブジェクト）ｄ６となる。さらに、リンカにより、メモリマップｄ４など他のライブラリとリンクされ、電力制御コード入りプログラム（バイナリ）ｄ７が生成され（ステップＳ１４）、プログラム生成処理が終了する。
【０１９６】
以上のようにして生成された電力制御コード入りプログラムｄ７が、図２に示したような電子装置５０に入力されると、たとえば、プロセッサ２０は、メモリマップｄ４をもとに、関数を命令コード用メモリ１２のメモリバンク１１−０〜１１−３…に割り当てる。
【０１９７】
そして、プロセッサ２０は、メモリバンク１１−０〜１１−３…の電力制御コード入りプログラムｄ７を実行していくことで、再帰部分を含むような呼び出し関係の多いプログラムを実行する場合であっても、メモリ部１０の消費電力を削減することができる。その結果、低消費電力の電子装置５０が得られる。
【０１９８】
以下、消費電力削減例について説明する。
たとえば、電力制御対象の電子装置５０の命令コード用メモリ１２が、４つのメモリバンク１１−０〜１１−３を有し、メモリバンク１１−０，１１−１の通常状態での消費電力が２ｍＷ、省電力状態での消費電力が０．５ｍＷとする。また、メモリバンク１１−２，１１−３の通常状態での消費電力が４ｍＷ、省電力状態での消費電力が１．０ｍＷとする。
【０１９９】
そして、プログラムは、関数ｆ１，ｆ２，ｆ３による再帰部と関数ｍａｉｎを有しているとする。また、関数ｍａｉｎはメモリバンク１１−０に、関数ｆ１はメモリバンク１１−１に、関数ｆ２はメモリバンク１１−２に、関数ｆ３はメモリバンク１１−３に配置されるものとする。
【０２００】
たとえば、ある入力に対して、プログラムが以下のように実行されたとする。
関数ｍａｉｎが１５ｍｓｅｃ実行された後、関数ｆ１が呼び出され、３８０ｍｓｅｃ実行された後、関数ｆ２が呼び出され、３ｍｓｅｃ実行された後、関数ｆ３が呼び出され、１０ｍｓｅｃ実行された後、関数ｆ２に復帰する。そして関数ｆ２が７ｍｓｅｃ実行された後、関数ｆ１に復帰し、関数ｆ１が５８０ｍｓｅｃ実行された後、関数ｍａｉｎに戻り、関数ｍａｉｎが５ｍｓｅｃ実行される。
【０２０１】
以上のようなプログラム動作が行われる場合、本実施の形態の電力制御方法によれば、メモリバンク１１−０〜１１−３の合計消費エネルギーは、６ｍＪである。一方、再帰部の処理の際、再帰部に含まれる関数ｆ１〜ｆ３が配置されるメモリバンク１１−１〜１１−３を常に通常状態としておく場合の合計消費エネルギーは、１１．８５ｍＪであるから、大幅な電力削減が可能となる。
【０２０２】
なお、上記の説明では、たとえば、図６に示したようなコンピュータ１００がプログラムを生成するとしたが、これに限定されない。たとえば、図２に示した電子装置５０のプロセッサ２０自体が、メモリ部１０に格納されたプログラムを読み込んで、上記のような電力制御コードが含まれるプログラムを生成するようにしてもよい。
【０２０３】
（第３の実施の形態）
上記の第２の実施の形態では、図３２に示したような関数割り当て処理の際、メモリバンクの容量より大きな再帰部を分割し、一方の関数群をそのメモリバンクに割り当て、他方の関数群を、他の分割部よりも先に、他のメモリバンクに割り当てていた。
【０２０４】
しかし、以下のようにすれば、少ないメモリバンクにも効率よく迅速に関数を割り当てることができるようになる。
図４２は、第３の実施の形態における関数割り当て処理の一例を示すフローチャートである。
【０２０５】
ＣＰＵ１０１は、図３２に示した例と同様に、各種情報の入力（ステップＳ１４０）と、各種変数の初期化（ステップＳ１４１）を行うが、以下に示すような項目を分割情報に追加する。
【０２０６】
図４３は、初期化後の分割情報の一例を示す図である。
図４３に示される分割情報には、前述の図３４に示したような、その分割名の関数の割り当てが済んでいるか否かを示す情報の代わりに、その分割名の分割部の“残りコードサイズ”という項目が追加されている。残りコードサイズは、その分割名で示される分割部に含まれる関数のうち、メモリバンクへの割り当てが行われていないものの合計コードサイズを示している。
【０２０７】
初期化が終わると、ＣＰＵ１０１は、前述の図３２のステップＳ１０２の処理と同様に、分割名がＭＡＩＮの関数について、メモリバンクへの割り当てを行う（ステップＳ１４２）。
【０２０８】
続いて、ＣＰＵ１０１は、残り容量が最大のメモリバンクＭ＿Ｍａｘと、残りコードサイズが最大の分割部Ｆ＿Ｍａｘを選択する（ステップＳ１４３）。Ｍ＿Ｍａｘには、変数ｍ＿ｒｅｓｔ［Ｍ］が最大のメモリバンクが選択される。Ｆ＿Ｍａｘには、残りコードサイズが最大の分割名の関数群が選択される。
【０２０９】
以下、ステップＳ１４４〜Ｓ１５４は、前述の図３２のステップＳ１０４〜Ｓ１１４の処理とほぼ同様である。ただし、ステップＳ１５１の処理において、ＣＰＵ１０１は、関数群ＦをＭ＿Ｍａｘに割り当てた後、分割情報において、割り当てた関数群Ｆを含む分割部の残りコードサイズから、関数群Ｆのコードサイズを減じる。
【０２１０】
図４４は、分割情報の更新例を示す図である。
図４４では、分割名Ｒ１の分割部のうち、関数ｆ２ａ〜ｆ９ａのメモリバンクへの割り当て後の分割情報の更新例が示されている。
【０２１１】
上記の例において、各関数ｆ２ａ〜ｆ９ａのコードサイズは１．０ＫＢであるから、合計コードサイズは８．０ＫＢである。ＣＰＵ１０１は、これを分割名Ｒ１の分割部の合計コードサイズから減じて、残りコードサイズを１．０ＫＢとする。
【０２１２】
これにより、ステップＳ１４３の処理に戻った際、分割情報で管理される分割部の中から、残りコードサイズが最大の分割名Ｒ２の分割部の関数ｆ３ｂ〜ｆ６ｂが関数群Ｆとして選択され、メモリバンクへの割り当てが行われる。
【０２１３】
図４５は、割り当て情報の更新例を示す図である。
分割名Ｒ１＿１の関数群が、メモリバンク番号が１のメモリバンクに割り当てられた後、分割名Ｒ１＿２の関数群よりも先に、分割名Ｒ２の関数群が、メモリバンク（メモリバンク番号＝２）に割り当てられている様子が示されている。
【０２１４】
小さいコードサイズのものを先にメモリバンクに割り当てると、後で、メモリバンクの残り容量が足りなくて、大きな関数群を配置できなくなり、エラーとなる可能性がある。
しかし、以上のような関数割り当て処理によれば、残りコードサイズが大きい分割部から、メモリバンクに割り当てられるようにしたので、少ないメモリバンクにも効率よく迅速に関数を割り当てることができるようになる。
【０２１５】
（第４の実施の形態）
以下では、さらに、より迅速に関数をメモリバンクに割り当てることが可能な関数割り当て処理について説明する。
【０２１６】
図４６は、第４の実施の形態における関数割り当て処理の一例を示すフローチャートである。
ＣＰＵ１０１は、第３の実施の形態と同様に、各種情報の入力（ステップＳ１６０）と、各種変数の初期化（ステップＳ１６１）を行う。
【０２１７】
その後、ＣＰＵ１０１は、以下に示すような早見表を作成する（ステップＳ１６２）。
図４７は、早見表の一例を示す図である。
早見表には、個々の分割案のコードサイズがまとめられている。なお、各分割案のコードサイズは、分割案の第２要素の値となっている。たとえば、図３０に示したような、テーブルｔｂｌ１では、分割案（ｆ１ａ，ｆ２ａ）で分割したときの各関数群のコードサイズは（１，８）となっているため、第２要素の値の８（ＫＢ）が、早見表におけるコードサイズとなる。
【０２１８】
分割名がｒ１，ｒ２、ＭＡＩＮなどの、再帰部ではない分割部については、分割案はＮＵＬＬとなっており、その分割部のコードサイズが示されている。
ＣＰＵ１０１は、上記のような早見表の作成を終えると、前述の図３２のステップＳ１０２の処理と同様に、分割名がＭＡＩＮの関数について、メモリバンクへの割り当てを行う（ステップＳ１６３）。
【０２１９】
続いて、ＣＰＵ１０１は、残り容量が最大のメモリバンクＭ＿Ｍａｘと、早見表を参照して、コードサイズが最大の分割部Ｆ＿Ｍａｘを選択する（ステップＳ１６４）。複数のメモリバンクにおいて、最大の残り容量が８ＫＢの場合、図４７の早見表の例では、８ＫＢに収まる範囲では、分割案（ｆ１ａ，ｆ２ａ）のコードサイズが最大であるので、この分割案を有する分割名Ｒ１の分割部が分割部Ｆ＿Ｍａｘとして選択される。
【０２２０】
ステップＳ１６５〜Ｓ１７２は、図４２に示したステップＳ１４４〜Ｓ１５１の処理とほぼ同様であるが、ステップＳ１６７の処理では、早見表の前述した最大のコードサイズの分割案が選択され、その分割案の第２要素の関数群を関数群Ｆとして設定する。
【０２２１】
たとえば、前述の分割案（ｆ１ａ，ｆ２ａ）が設定され、第２要素の関数群（関数ｆ２ａ〜ｆ９ａ）が関数群Ｆとして設定される。
関数群ＦのＭ＿Ｍａｘへの割り当て後、ＣＰＵ１０１は、早見表を更新する（ステップＳ１７３）。たとえば、分割案（ｆ１ａ，ｆ２ａ）の第２要素の関数群（関数ｆ２ａ〜ｆ９ａ）をメモリバンクに割り当てた後、早見表は以下のように更新される。
【０２２２】
図４８は、早見表の更新例を示す図である。
図４８のように、メモリバンクに割り当てた分割名ＭＡＩＮと、分割名Ｒ１のデータ（以下エントリと呼ぶ）については、削除されている。ただし、分割名Ｒ１の分割部のうち、上記分割案（ｆ１ａ，ｆ２ａ）の第１要素である関数ｆ１ａについては未割り当てであるので、図４５に示した割り当て情報で記した分割名Ｒ１＿２のエントリが新たに早見表に追加される。
【０２２３】
分割名Ｒ１＿２のエントリは、コードサイズは、関数ｆ１ａのコードサイズであるから１．０ＫＢであり、分割案についてはＮＵＬＬとなっている。
図４６のステップＳ１７４〜Ｓ１７６の処理については、図４２のステップＳ１５２〜Ｓ１５４の処理と同じである。関数群ＦのＭ＿Ｍａｘへの割り当てと、早見表の更新が繰り返され、最後に割り当て情報が出力される。
【０２２４】
図４９は、早見表作成処理の例を示すフローチャートである。
ＣＰＵ１０１は、たとえば、図４３に示したような分割情報を入力し（ステップＳ１８０）、分割情報から１エントリ（図４３のようなテーブルの一行のデータ）を取得する（ステップＳ１８１）。
【０２２５】
そして、ＣＰＵ１０１は、取得したエントリが再帰部であるか否かを判定する（ステップＳ１８２）。再帰部であるか否かは、たとえば、分割情報の分割名により判別できる。図４３に示した分割情報の例では、分割名がＲ１またはＲ２の場合には、再帰部として判定され、ステップＳ１８４の処理が行われる。分割名がそれ以外の場合（たとえば、ＭＡＩＮ、ｒ１，２など）には、再帰部ではないと判定され、ステップＳ１８８の処理が行われる。
【０２２６】
ＣＰＵ１０１は、エントリを再帰部と判定した場合、その再帰部に対する分割案を１エントリ取得する（ステップＳ１８４）。たとえば、分割名Ｒ１の分割部（再帰部）の分割案は、図３０に示したテーブルｔｂｌ１のような組み合わせがあり、各組み合わせ（たとえば、（ｆ１ａ，ｆ１ａ）、（ｆ１ａ，ｆ２ａ）など）が１エントリとして取得される。
【０２２７】
そして、ＣＰＵ１０１は、早見表に、同一分割名で同一コードサイズのエントリが登録済みか否かを判定し（ステップＳ１８５）、登録済みでなければ、早見表にそのエントリを登録する（ステップＳ１８６）。
【０２２８】
早見表に登録した後、または、取得したエントリと同一分割名で同一コードサイズのエントリが登録済みの場合、ＣＰＵ１０１は、分割案の全エントリについてのステップＳ１８４〜Ｓ１８６の処理が完了したか否かを判定する（ステップＳ１８７）。分割案の全エントリについてのステップＳ１８４〜Ｓ１８６の処理が完了した場合には、ステップＳ１８９の処理が行われ、完了していないエントリが残っている場合には、そのエントリについて、ステップＳ１８４からの処理が繰り返される。
【０２２９】
一方、ＣＰＵ１０１は、ステップＳ１８２において、分割情報のエントリが再帰部ではないと判定した場合、そのエントリを早見表に登録して、ステップＳ１８９の処理に進む。
【０２３０】
分割案の全エントリについてのステップＳ１８４〜Ｓ１８６の処理が完了した場合、または、ステップＳ１８８の処理の後、ＣＰＵ１０１は、分割情報の全エントリについて、ステップＳ１８１〜Ｓ１８８の処理が完了したか否かを判定する（ステップＳ１８９）。
【０２３１】
分割情報の全エントリについて、ステップＳ１８１〜Ｓ１８８の処理が完了した場合には、ＣＰＵ１０１は、早見表を出力し（ステップＳ１９０）、たとえば、ＲＡＭ１０２などに格納し、早見表の作成処理を終了する。分割情報の全エントリについて、ステップＳ１８１〜Ｓ１８８の処理が完了していない場合には、ステップＳ１８１からの処理が繰り返される。
【０２３２】
以上のような処理により、図４７に示したような早見表が作成される。
図５０は、早見表の更新処理の例を示すフローチャートである。
ＣＰＵ１０１は、早見表と分割情報とを入力し（ステップＳ２００）、更新対象のエントリが分割案未決定の再帰部であるか否か判定する（ステップＳ２０１）。更新対象のエントリが分割案未決定の再帰部である場合には、ステップＳ２０２の処理が行われ、更新対象のエントリが分割案未決定の再帰部でない場合には、ステップＳ２０４の処理が行われる。
【０２３３】
たとえば、図４７に示したような早見表において、コードサイズが８．０ＫＢ、分割名Ｒ１、分割案（ｆ１ａ，ｆ２ａ）のエントリを更新する場合、図４３に示したような分割情報では分割名Ｒ１の分割案はＮＵＬＬである。そのため、分割案未決定の再帰部と判定され、ＣＰＵ１０１は、更新対象のエントリと同一の分割名のエントリを早見表から削除する（ステップＳ２０２）。
【０２３４】
その後、ＣＰＵ１０１は、分割案決定後のエントリを早見表に登録する（ステップＳ２０３）。これにより、たとえば、図４８に示したように、分割名Ｒ１のエントリが削除され、分割名Ｒ１＿２のエントリが追加された早見表が得られる。
【０２３５】
一方、更新対象のエントリが分割案未決定の再帰部でない場合には、ＣＰＵ１０１は、そのエントリを早見表から削除する（ステップＳ２０４）。
ステップＳ２０３またはＳ２０４の処理後、ＣＰＵ１０１は早見表を出力し（ステップＳ２０５）、たとえば、ＲＡＭ１０２などに格納し、早見表の更新処理を終了する。
【０２３６】
以上のように、早見表を用いてメモリバンクへの関数の割り当てを行うことにより、さらに迅速に関数をメモリバンクに割り当てることが可能となる。
なお、上記の電力制御方法や、電力制御コード入りのプログラムの生成処理は、たとえば、図６に示したようなハードウェア構成を有するコンピュータによって実現することができる。その場合、電子装置１，５０やコンピュータ１００が有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ＨＤＤ、フレキシブルディスク（ＦＤ）、磁気テープなどがある。光ディスクには、ＤＶＤ、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ／ＲＷなどがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０２３７】
プログラムを流通させる場合には、たとえば、そのプログラムが記録されたＤＶＤ、ＣＤ−ＲＯＭなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０２３８】
プログラムを実行するコンピュータは、たとえば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムにしたがった処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムにしたがった処理を実行することもできる。
【０２３９】
また、上記の処理機能の少なくとも一部を、ＤＳＰ、ＡＳＩＣ（Application Specific Integrated Circuit）、ＰＬＤ（Programmable Logic Device）などの電子回路で実現することもできる。
【０２４０】
以上、実施の形態に基づき、本発明の電力制御方法、電子装置、プログラム及びプログラムの生成方法の一観点について説明してきたが、これらは一例にすぎず、上記の記載に限定されるものではない。
【符号の説明】
【０２４１】
１，５０  電子装置
２，２０  プロセッサ
３ａ，３ｂ  メモリ領域
１０  メモリ部
１１−０〜１１−ｎ  メモリバンク
１２  命令コード用メモリ
１３  データ用メモリ
２１  プロセッサコア
２２  メモリコントローラ
３０  制御レジスタ部
４０  電力制御部
４０−０〜４０−ｎ  電力制御回路
４１  バス
４２  電源線
【図１】
0005776347.tif 000004
【図２】
0005776347.tif 000005
【図３】
0005776347.tif 000006
【図４】
0005776347.tif 000007
【図５】
0005776347.tif 000008
【図６】
0005776347.tif 000009
【図７】
0005776347.tif 000010
【図８】
0005776347.tif 000011
【図９】
0005776347.tif 000012
【図１０】
0005776347.tif 000013
【図１１】
0005776347.tif 000014
【図１２】
0005776347.tif 000015
【図１３】
0005776347.tif 000016
【図１４】
0005776347.tif 000017
【図１５】
0005776347.tif 000018
【図１６】
0005776347.tif 000019
【図１７】
0005776347.tif 000020
【図１８】
0005776347.tif 000021
【図１９】
0005776347.tif 000022
【図２０】
0005776347.tif 000023
【図２１】
0005776347.tif 000024
【図２２】
0005776347.tif 000025
【図２３】
0005776347.tif 000026
【図２４】
0005776347.tif 000027
【図２５】
0005776347.tif 000028
【図２６】
0005776347.tif 000029
【図２７】
0005776347.tif 000030
【図２８】
0005776347.tif 000031
【図２９】
0005776347.tif 000032
【図３０】
0005776347.tif 000033
【図３１】
0005776347.tif 000034
【図３２】
0005776347.tif 000035
【図３３】
0005776347.tif 000036
【図３４】
0005776347.tif 000037
【図３５】
0005776347.tif 000038
【図３６】
0005776347.tif 000039
【図３７】
0005776347.tif 000040
【図３８】
0005776347.tif 000041
【図３９】
0005776347.tif 000042
【図４０】
0005776347.tif 000043
【図４１】
0005776347.tif 000044
【図４２】
0005776347.tif 000045
【図４３】
0005776347.tif 000046
【図４４】
0005776347.tif 000047
【図４５】
0005776347.tif 000048
【図４６】
0005776347.tif 000049
【図４７】
0005776347.tif 000050
【図４８】
0005776347.tif 000051
【図４９】
0005776347.tif 000052
【図５０】
0005776347.tif 000053