(57)【特許請求の範囲】
【請求項１】
プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、
前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、
前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てるコード割当工程と、
を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法。
【請求項２】
前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、一つの前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる請求項１記載の割当方法。
【請求項３】
前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、アドレスが連続する２以上の前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる請求項１記載の割当方法。
【請求項４】
関数を表すコードを含むプログラムを読込むことによって、動作可能なプロセッサと、
前記プロセッサからの制御によって、供給される電圧状態を独立して切替可能なメモリバンクと、を備え、
前記プロセッサは
前記プロセッサに読み込まれた前記プログラム中の関数間の呼び出し関係を抽出する機能と、
前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする機能と、
前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てる機能と、を有することを特徴とするメモリシステム。
【請求項５】
前記メモリバンクの電圧状態を、前記プロセッサからの命令を受けて、設定する制御レジスタと、
前記制御レジスタからの信号を受けて、前記メモリバンクの電圧状態を制御する電源制御回路と、をさらに備えることを特徴とする請求項４記載のメモリシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
プログラムコードに含まれるコードをメモリ領域に割り当てる方法及びその方法を実行するメモリシステムに関する。
【背景技術】
【０００２】
ＣＰＵとメモリからなるシステムにおいて、ＣＰＵに供給されるソースプログラムの内容に応じて、メモリの消費電力を削減するように、ＣＰＵがメモリの動作を制御する方法が提案されている（特許文献１−２参照）。特に、ＣＰＵとメモリからなるシステムを半導体１チップに搭載するＳＯＣ（System On Chip）において、上記に記載した、消費電力を削減するメモリの動作制御方法が注目されようとしている。
【０００３】
特許文献１によれば、ソースプログラム中のループを単位とする各フェーズ及び各フェーズで参照する参照データを抽出することにより、ソースプログラムを分割するフェーズ分割処理を行い、各フェーズにおいて、参照データを記憶するのに必要なメモリ領域をＣＰＵのキャッシュメモリとＣＰＵ外のオンチップメモリとに最適に配分することにより電力の削減を図る方法が記載されている。
【０００４】
特許文献１から２の文献によれば、メモリが電力制御状態へ遷移する、又は電力制御状態から復帰する時間が、ＣＰＵに供給されるクロック周期に比較して長い場合に、性能が低下しないように、命令コードを記憶するメモリ領域の電力制御状態を最適に制御して消費電力の削減を図る方法が記載されている。
【０００５】
しかし、ソースプログラムの構造によっては、電力制御状態にすることができる、命令コードを記憶するメモリ領域が制限され、電力制御状態の制御によっては、消費電力の削減効果が減少する場合があった。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００８−１０２７３３号公報
【特許文献２】特開２０１０−２５７４３７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
記憶領域の電力状態の制御により消費電力削減をさせ得る、プログラムコードの記憶領域への割り当て状態を実現する方法及びその方法を実行するメモリシステムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記を解決するため、本発明の一側面によれば、プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、再帰呼出し部を表すプログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、プロセッサが、割り当てるコード割当工程と、を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法を提供する。
【発明の効果】
【０００９】
本発明によれば、プログラムに含まれるコードを記憶領域に割り当てる方法であって、その方法により実現された、記憶領域におけるコードの割当状態に応じて、記憶領域を構成するデバイスの電力状態を制御した場合、消費電力削減を実現させ得る方法及びその方法を実行するメモリシステムを提供することができる。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施例１のメモリシステム５０を示す図である。
【図２】図２はソースプログラムの例及びソースプログラムの命令コードに対するメモリ領域の割り当ての例を示す図である。
【図３】図３は、プログラムに含まれるコードに記憶領域を割り当てる割当方法を示す。
【図４】図４は呼出関係抽出ステップ工程Ｓ３１に関する、フローチャート、静的コールグラフ、及び、呼出し関係抽出後の出力データ表を図示する。
【図５】図５は再帰呼出抽出工程Ｓ３２Ａを説明するメインフローチャート及びサブルーチンＳ３２１を説明するサブルーチンフローチャートを示す。
【図６】図６はサブルーチンＳ３２２及びサブルーチンＳ３２２と再帰縮退工程Ｓ３３との関係を示すフローチャートである。
【図７】図７は再帰呼出抽出工程Ｓ３２Ａにおける、再帰読出部の検出について説明する図である。
【図８】図８は、再帰縮退工程Ｓ３３を説明するための図である。
【図９】図９は、再帰縮退工程Ｓ３３における具体的な処理動作の例を示す。
【図１０】図１０はメモリ割当工程Ｓ３４を説明するフローチャートである。
【図１１】図１１は関数に関するプログラムソースコードの割当状況を示す図である。
【図１２】図１２は、実施例１の変形例であるメモリシステム１１０及びそのメモリシステム１１０において生成される電源制御入り実行プログラムの生成方法に対するフローチャートを示す。
【図１３】図１３は、実施例２に係わる、プログラムに含まれるコードに記憶領域を割り当てる割当方法を説明する図である。
【図１４】図１４は呼出関係抽出工程Ｓ３５に関する、フローチャート、静的コールグラフ、及び、呼出抽出後の出力データ表を図示する。
【図１５】図１５は再帰縮退工程Ｓ３６を説明するための図である。
【図１６】図１６は、再帰縮退工程Ｓ３６における具体的な処理動作の例を示す。
【図１７】図１７は、実施例のメモリ割当工程Ｓ３７を説明するフローチャートである。
【図１８Ａ】図１８Ａは実施例３に係わるメモリ割当工程Ｓ４００５を示す。
【図１８Ｂ】図１８Ｂは実施例３に係わるメモリ領域割り当てルーチンＳ４００５０７を示す。
【図１９Ａ】図１９Ａは、第３実施例に係わるメモリ割当工程Ｓ４００５により関数を各メモリバンクに割り当てる具体例を示す。
【図１９Ｂ】図１９Ｂは第３実施例に係わるメモリ割当工程Ｓ４００５により関数を各メモリバンクに割り当てる具体例を示す。
【図１９Ｃ】図１９Ｃは、第３実施例に係わるメモリ割当工程Ｓ４００５により関数を各メモリバンクに割り当てる具体例を示す。
【図１９Ｄ】図１９Ｄは電力制御有りメモリ割当工程Ｓ４００５を行った結果を示す。
【図２０】図２０は実施例３に示したプログラムを実施した場合に、消費電力の削減効果が減少する例を示す。
【図２１Ａ】図２１Ａは、実施例４に係わるメモリ割当工程Ｓ４１０５を示す。
【図２１Ｂ】図２１Ｂは、関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４を説明する図である。
【図２２】図２２は、実施例４に係わるメモリ割当工程Ｓ４１０５により関数を各メモリバンクに割り当てる具体例を示す。
【発明を実施するための形態】
【００１１】
本発明は、以下に説明する実施例に対し、当業者が想到可能な、設計上の変更が加えられたもの、及び、実施例に現れた構成要素の組み換えが行われたものも含む。また、本発明は、その構成要素が同一の作用効果を及ぼす他の構成要素へ置き換えられたもの等も含み、以下の実施例に限定されない。
【実施例１】
【００１２】
図１は、実施例１のメモリシステム５０を示す図である。メモリシステム５０はメモリユニット１０、プロセッサ２０、制御レジスタ群３０、バス４０、電源線４５、電源制御装置４６を含む。（特願２００９−９０６５、特願２００９−２６６５７５、特願２０１０−９２６９参照）
プロセッサ２０はメモリコントローラを内蔵し、メモリユニット１０に含まれるメモリバンク１１、１２、１３、１４、１５へのデータ又は命令コードの書込又は読出をコントロールする。さらに、メモリバンク１１、１２、１３、１４、１５の電源制御を行うための電源制御信号を制御レジスタ群３０に出力する。
制御レジスタ群３０は、ＣＰＵからの電源制御信号に応じて、メモリバンク１１、１２、１３、１４、１５の電源制御状態を記憶するレジスタ群である。そこで、例えば、制御レジスタ群３０は、８個のレジスタからなり、“０００００１０１”とデジットが設定されると、メモリバンク１１とメモリバンク１３の電源がオンする。
【００１３】
電源制御装置４６は、電源線４５と各メモリバンク１１、１２、１３、１４、１５間に配置され、各メモリバンク１１、１２、１３、１４、１５の電源状態を、制御レジスタ群３０からの信号に応じて制御する。なお、電源状態とは、電源線４５から各メモリバンク１１、１２、１３、１４、１５への接続を切断している電源切断状態、電源線４５からの電源を、電圧を低下させて各メモリバンク１１、１２、１３、１４、１５へ供給する省電力供給状態、電源線４５からの電源を電圧を保持しながら各メモリバンク１１、１２、１３、１４、１５へ供給する通常電力供給状態を含む。
【００１４】
メモリユニット１０は命令コード用メモリ１６とデータ用メモリ１７を含む。命令コード用メモリ１６は、メモリバンク１１、１２、１３、１４を含む。また、データ用メモリ１７は複数のメモリバンク１５を含む。各メモリバンク１１、１２、１３、１４、１５の電源状態は電源制御装置４６によって制御されることはいうまでもない。
なお、電源切断状態においては、各メモリバンク１１、１２、１３、１４、１５は、データの保持もできないし、読出及び書込もできない。省電力供給状態においては、各メモリバンク１１、１２、１３、１４、１５は、データ保持はできるが、読出及び書込を正常に行えない。通常電力供給状態においては、各メモリバンク１１、１２、１３、１４、１５は、データ保持もできるし、読出及び書込を正常に行える。なお、メモリバンク１１はメモリユニット１０において、０ｘ００００番地から０ｘ０ｆｆｆ番地までの領域を占める。メモリバンク１２はメモリユニット１０において、０ｘ１０００番地から０ｘ１ｆｆｆ番地までの領域を占める。メモリバンク１３はメモリユニット１０において、０ｘ２０００番地から０ｘ２ｆｆｆ番地までの領域を占める。メモリバンク１４はメモリユニット１０において、０ｘ３０００番地から０ｘ３ｆｆｆ番地までの領域を占める。メモリバンク１５はデータ用メモリ１７において、０ｘ４０００番地以降のメモリ領域を占める。
【００１５】
従って、読出及び書込動作が発生しないときに、各メモリバンク１１、１２、１３、１４、１５を省電力供給状態とすることができる。そうすると、少数のメモリバンクに読出及び書込を集中させるほど、メモリシステム５０全体の電力を大きく削減することができる。
【００１６】
図２はソースプログラムの例及びソースプログラムの命令コードに対するメモリ領域の割り当ての例を示す図である。図２によれば、メモリバンク１１にメインプログラムが割り当てられ、メモリバンク１２に関数ｆｕｎｃ＿Ａ１を特定するプログラムが割り当てられ、メモリバンク１３に関数ｆｕｎｃ＿Ａ２を特定するプログラムが割り当てられている。
メインプログラムにおける、「メモリバンク１２  Ｓｌｅｅｐ解除コード片」は、メモリバンク１２を、省電力供給状態から通常電力供給状態へ移行させる命令コード片である。次いで、「ｃａｌｌ  Ｆｕｎｃ＿Ａ１」はメモリバンクに割り当てられているＦｕｎｃ＿Ａ１という関数を呼び出す命令コードである。次いで、「メモリバンク１２  Ｓｌｅｅｐコード片」は、メモリバンク１２を、通常電力供給状態から省電力供給状態へ移行させる命令コード片」である。
【００１７】
メインプログラムにおける、「メモリバンク１３  Ｓｌｅｅｐ解除コード片」は、メモリバンク１３を、省電力供給状態から通常電力供給状態へ移行させる命令コード片である。次いで、「ｃａｌｌ  Ｆｕｎｃ＿Ａ２」はメモリバンクに割り当てられているＦｕｎｃ＿Ａ２という関数を呼び出す命令コードである。次いで、「メモリバンク１３  Ｓｌｅｅｐコード片」は、メモリバンク１３を、通常電力供給状態から省電力供給状態へ移行させる命令コード片」である。
このように、メインプログラム中に関数を呼び出す命令コードがあると、関数を表す命令コードが割り当てられているメモリバンクは省電力供給状態から通常電力供給状態へ移行され、関数結果をメインプログラムに引き渡すと、そのメモリバンクは通常電力供給状態から省電力供給状態へ戻される。
【００１８】
図３は、プログラムに含まれるコードに記憶領域を割り当てる割当方法を示す。なお、その割当方法を実行することによって、記憶領域の電力状態の制御により消費電力を削減させ得る、記憶領域の割り当て状態を実現することができる。
コードを記憶領域に割り当てる割当方法は、図１のプロセッサ２０によって実行され、呼出し関係抽出工程Ｓ３１、再帰呼出抽出工程Ｓ３２Ａ、再帰呼出処理済み静的コールグラフ作成工程Ｓ３２Ｂ、再帰縮退工程Ｓ３３、及び、メモリ割当工程Ｓ３４を含む。
呼出し関係抽出工程Ｓ３１はプログラム６２のソースコード、アセンブリまたはオブジェクトを走査し、静的コールグラフを作成するステップである。静的コールグラフとは、ソースコード、アセンブリコード、またはオブジェクトコード上において、親関数又は関数間の呼出し関係を表現するものである。従って、静的コールグラフを作成するに先立ち、プロセッサ２０は、読み込まれたプログラム中の「関数間の呼び出し関係」を抽出することとなる。静的コールグラフについて、図４を用いてさらに説明する。
【００１９】
再帰呼出抽出工程Ｓ３２Ａは呼出し関係抽出工程Ｓ３１の呼出し関係に基づいて、親関数又は関数間の再帰呼出し部を抽出するステップである。再帰呼出し部を抽出した場合、再帰呼出し部の縮退を行うため再帰縮退工程Ｓ３３に進む。一方、再帰縮退工程Ｓ３３から戻ってきたときに、さらに再帰呼出し部を抽出しないときには、再帰読出処理済み静的コールグラフ作成工程Ｓ３２Ｂに進む。
ここで、再帰呼出しとは、呼出しに応じた関数又はその関数からさらに呼び出しを受けた関数を含む、呼び出し連鎖中の関数が、呼出し関係の元となった関数を呼び出すことをいう。
また、再帰呼出し部を抽出するとは、「関数間の呼出し関係」に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とするとすることである。再帰呼出し部の抽出について、図５、６、７を用いてさらに説明する。
再帰呼出処理済み静的コールグラフ作成工程Ｓ３２Ｂ：再帰呼出抽出工程Ｓ３２Ａ及び再帰縮退工程Ｓ３３を繰り返し行い、すべてのソースコードに対して、再帰呼出部の抽出と、再帰呼出部に対する再帰縮退が終了した時に、再帰呼出処理済み静的コールグラフ作成工程Ｓ３２Ｂにおいて、すべてのソースコードに対する、再帰呼出処理済み静的コールグラフ６３、再帰呼出済み関数サイズ情報６４、関数縮退情報６５が、作成される。
【００２０】
再帰縮退工程Ｓ３３は再帰呼出抽出工程Ｓ３２Ａにおいて、再帰呼出し部を抽出した場合、再帰呼出し部をまとめる再帰縮退を行う。再帰縮退を行った結果、ひとまとまりとなった再帰呼出し部は一つの関数と見立てられる。一つと見立てられた関数の記憶サイズは、関数サイズ情報６１から得られる、元の関数サイズに応じて、計算によって求められる。再帰縮退について、図８、図９、図１０を用いてさらに、説明する。
再帰読出処理済み静的コールグラフ作成工程Ｓ３２Ｂはすべての再帰読出部の検出と、その再帰縮退が終了した場合、与えられたソースコード全体について、再帰読出処理済み後の静的コールグラフ、再帰呼出し処理済み後の関数サイズ情報、関数縮退情報を作成する。
【００２１】
メモリ割当工程Ｓ３４は一つと見立てられた関数を表すプログラム中のコードについて、一体としてメモリ領域の同一のメモリバンクに割り振る工程である。すなわち、一つと見立てられた関数は、同一メモリバンクに格納される。ここで、一つと見立てられた関数が割り振られたメモリバンクは、図１に示すメモリバンク１１、１２、１３、１４、１５のように、電力供給状態が切替可能な、メモリバンクである。
【００２２】
図４は呼出関係抽出ステップ工程Ｓ３１に関する、フローチャート、静的コールグラフ、及び、呼出し関係抽出後の出力データ表を図示する。
図４の静的コールグラフは、例として与えられた、ソースコード上での関数の呼出し関係を表現している。すなわち、図４の静的コールグラフにおいては、メイン関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ２を経由して子関数ｆ＿Ｂ２を呼び出す経路と、メイン関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ３を経由して子関数ｆ＿Ｂ２を呼び出す経路と、メイン関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ３を経由して子関数ｆ＿Ｂ３を呼び出す経路と、子関数ｆ＿Ｂ２から子関数ｆ＿Ｂ３を呼び出す経路と、子関数ｆ＿Ｂ２から子関数ｆ＿Ａ３を呼び出す経路と、が記載されている。
図４の呼出し関係抽出工程Ｓ３１の出力データ表は、図４の静的コールグラフに対応する出力データ表である。図４の出力データ表の第１列は呼出し元の関数が記載され、第２列は呼出し先の関数が記載されている。図４の出力データ表によれば、メイン関数ｆ＿ＭＡＩＮは子関数ｆ＿Ａ２と、子関数ｆ＿Ａ３を呼び出す。子関数ｆ＿Ａ２及び子関数ｆ＿Ａ３は子関数ｆ＿Ｂ２を呼び出す。子関数ｆ＿Ａ３及び子関数ｆ＿Ｂ２は子関数ｆ＿Ｂ３を呼び出す。子関数ｆ＿Ｂ２は子関数ｆ＿Ａ３を呼び出す。
【００２３】
図４のフローチャートによれば、呼出関係抽出工程Ｓ３１は、関数開始記述抽出工程Ｓ３１１と、関数呼出し記述検出および出力データ表への追加工程Ｓ３１２を行うステップとを含む。
関数開始記述抽出工程Ｓ３１１は与えられたソースコードより関数の開始となる記述を抽出し、呼出し元の関数名を得る工程である。関数呼出し記述検出および出力表への追加工程Ｓ３１２は、与えられたソースコード中の関数呼出し記述を検出し、呼出し元関数と呼出し先関数を表形式で追加して行く工程である。例えば、図４の出力データ表に示すデータの作成が行われる。
【００２４】
図５は再帰呼出抽出工程Ｓ３２Ａを説明するメインフローチャート及びサブルーチンＳ３２１を説明するサブルーチンフローチャートを示す。再帰呼出抽出工程Ｓ３２Ａを説明するメインフローチャートは初期化工程Ｓ３２０１、サブルーチン実行工程Ｓ３２０２、フラッグ判定工程Ｓ３２０３を含む。
初期化工程Ｓ３２０１：再帰呼出抽出工程Ｓ３２Ａにおいて使用する変数ｖｉｓｉｔｅｄをすべてｆａｌｓｅに設定する。また、データＰＡＴＨを空にする。さらに、変数ｆｌａｇをｆａｌｓｅに設定する。
サブルーチン実行工程Ｓ３２０２：サブルーチンＳ３２１中の対象関数を示す変数ｆにメイン関数ｆ＿ＭＡＩＮを設定して、サブルーチンＳ３２１を実行する工程である。
フラッグ判定工程Ｓ３２０３：変数ｆｌａｇの真偽をチェックし、真であるときには初期化工程Ｓ３２０１に戻る。また、偽であるときには、再帰呼出抽出Ｓ３２Ａを終了する。ここで、変数ｆｌａｇが真であるときには、サブルーチンＳ３２１を行ったことにより再帰呼出部が見つかったことを意味する。また、再帰縮退工程Ｓ３３を行うことによって、ここで見つけた再帰呼出部は一つの関数と見立てられたことを意味する。
【００２５】
サブルーチンＳ３２１を説明するサブルーチンフローチャートは、ＰＡＴＨ追加工程Ｓ３２１０１、サブルーチン実行工程Ｓ３２１０２、ＰＡＴＨ削除工程Ｓ３２１０３を含む。
ＰＡＴＨ追加工程Ｓ３２１０１はメイン関数から呼び出されるすべての子関数について、メイン関数に引き続いてＰＡＴＨの変数に設定する工程である。なお、親関数から呼び出される子関数が複数あった場合、関数の呼出し連鎖からなるＰＡＴＨが複数存在することになる。
そこで、サブルーチン実行工程Ｓ３２１０２に進み、そのＰＡＴＨそれぞれにおいて、サブルーチンＳ３２２を行うことにより再帰呼出部を検出し、その再帰呼出部を一つと見立てる関数とする。その後、ＰＡＴＨ削除工程Ｓ３２１０３に進む。
ＰＡＴＨ削除工程Ｓ３２１０３はＰＡＴＨの変数から末尾の関数を削除する工程である。ＰＡＴＨ削除工程Ｓ３２１０３が終了した後、メインフローチャートへ戻る。
【００２６】
図６はサブルーチンＳ３２２及びサブルーチンＳ３２２と再帰縮退工程Ｓ３３との関係を示すフローチャートである。サブルーチンＳ３２２のフローチャートは、変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１、ＰＡＴＨに加えた関数に対して、呼出しが行われたか否かを示す変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３、サブルーチン実行工程Ｓ３２２０４、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０５、再帰呼出部設定工程Ｓ３２２０６、再帰縮退工程Ｓ３３を行う工程３２２０７、変数ｆｌａｇ設定工程Ｓ３２２０８を含む。
【００２７】
変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１：変数ｆｌａｇが真のときにはサブルーチンＳ３２２の終了ステージに進む。変数ｆｌａｇが偽のときには呼出しが行われたか否かを示す変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２へ進む。
変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２：変数ｖｉｓｉｔｅｄが真のときには再帰呼出部設定工程Ｓ３２２０６へ進む。変数ｖｉｓｉｔｅｄが偽のときには変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３へ進む。
変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３：呼出しが行われた関数の変数ｖｉｓｉｔｅｄを真に設定する。
サブルーチン実行工程Ｓ３２２０４：呼出しが行われた関数をサブルーチンＳ３２１中の対象関数を示す変数ｆに設定し、サブルーチンＳ３２１を行う。
変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０５：呼出しを行った関数に対する変数ｖｉｓｉｔｅｄを偽とする工程である。
【００２８】
再帰呼出部設定工程Ｓ３２２０６：サブルーチンＳ３２２を実行する際に、ＰＡＴＨの変数に追加されていた関数の内、変数ｖｉｓｉｔｅｄが真となった関数とそれ以降の関数を再帰呼出部とする工程である。
再帰縮退工程Ｓ３３を行う工程３２２０７：再帰呼出部設定工程Ｓ３２２０６において再帰呼出部とされた関数連鎖について再帰縮退工程Ｓ３３を行う工程である。
変数ｆｌａｇ設定工程Ｓ３２２０８：呼出しが行われた関数の変数ｖｉｓｉｔｅｄを真とする工程である。
【００２９】
図７は再帰呼出抽出工程Ｓ３２Ａにおける、再帰読出部の検出について説明する図である。図７によれば、再帰読出部を検出するため、ステージ１から５までがある。
ステージ１：ステージ１は図５、図６に示すフローチャートにおけるサブルーチン実行工程Ｓ３２１０２の１度目の開始時点を表すステージである。この状態に至るまでに、初期化工程Ｓ３２０１、サブルーチン実行工程Ｓ３２０２およびＰＡＴＨ追加工程Ｓ３２１０１を実行している。ＰＡＴＨ追加工程Ｓ３２１０１にて、ＰＡＴＨの末尾に追加する関数は、サブルーチン実行工程Ｓ３２０２にて関数ｆに設定した、親関数ｆ＿ＭＡＩＮであるため、ＰＡＴＨの関数は、親関数ｆ＿ＭＡＩＮのみで構成されている。
ここからまず、関数ｆ＿ＭＡＩＮの呼出し先の関数であるｆ＿Ａ２およびｆ＿Ａ３について、サブルーチンＳ３２２を開始する。以下では、先に関数ｆ＿Ａ２について、サブルーチンＳ３２２を開始した場合を示す。
ここで、関数ｆ＿Ａ２に対する変数ｆｌａｇと変数ｖｉｓｉｔｅｄは偽である。初期化工程Ｓ３２０１を行ったときから、今回の呼出しが、最初の子関数ｆ＿Ａ２の呼び出し、及び、訪問となるからである。そうすると、変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１と、変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２を経て、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３を行う。その結果、子関数ｆ＿Ａ２の変数ｖｉｓｉｔｅｄは真に設定された後、サブルーチン実行工程Ｓ３２２０４へ進む。
サブルーチン実行工程Ｓ３２２０４は、関数ｆを子関数ｆ＿Ａ２と設定した状態で、サブルーチンＳ３２１の実行を開始する。そして、ＰＡＴＨ追加工程Ｓ３２１０１にて、サブルーチン実行工程Ｓ３２２０４により関数ｆに設定した、子関数ｆ＿Ａ２をＰＡＴＨの末尾に追加する。その結果、ＰＡＴＨの関数は、親関数ｆ＿ＭＡＩＮと、子関数ｆ＿Ａ２とから構成される。なお、この子関数ｆ＿Ａ２はステージ１にて処理対象とした関数である。
ステージ２：ステージ２は図５、図６に示すフローチャートにおけるサブルーチン実行工程Ｓ３２１０２の２度目の開始時点を表すステージである。この状態から、関数ｆ＿Ａ２の呼び出し先関数ｆ＿Ｂ２について、サブルーチンＳ３２２を開始する。
ここで、関数ｆ＿Ｂ２に対する変数ｆｌａｇと変数ｖｉｓｉｔｅｄは偽である。初期化工程Ｓ３２０１を行ったときから、今回の呼出しが、最初の子関数ｆ＿Ｂ２の呼び出し、及び、訪問となるからである。そうすると、変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１と、変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２を経て、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３を行う。その結果、子関数ｆ＿Ｂ２の変数ｖｉｓｉｔｅｄは真に設定された後、サブルーチン実行工程Ｓ３２２０４へ進む。
サブルーチン実行工程Ｓ３２２０４により、関数ｆを子関数ｆ＿Ｂ２と設定した状態で、さらにサブルーチンＳ３２１の実行を開始する。
ＰＡＴＨ追加工程Ｓ３２１０では、サブルーチン実行工程Ｓ３２２０４により関数ｆに設定した、子関数ｆ＿Ｂ２をＰＡＴＨの末尾に追加し、ＰＡＴＨは親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２、子関数ｆ＿Ａ２から呼び出された子関数ｆ＿Ｂ２となる。
【００３０】
ステージ３：ステージ３は図５、図６の示すフローチャートにおけるサブルーチン実行工程Ｓ３２１０２の３度目の開始時点を表すステージである。ここから、子関数ｆ＿Ｂ２の呼び出し先関数である子関数ｆ＿Ａ３と子関数ｆ＿Ｂ３について、サブルーチンＳ３２２を開始する。ここでは、先に子関数ｆ＿Ａ３について、サブルーチンＳ３２２を開始した場合を示している。
ここで、関数ｆ＿Ａ３に対する変数ｆｌａｇと変数ｖｉｓｉｔｅｄは偽である。初期化工程Ｓ３２０１を行ったときから、今回の呼出しが、最初の子関数ｆ＿Ａ３の呼び出し、及び、訪問となるからである。そうすると、変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１と、変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２を経て、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３を行う。その結果、子関数ｆ＿Ａ３の変数ｖｉｓｉｔｅｄは真に設定された後、サブルーチン実行工程Ｓ３２２０４へ進む。
サブルーチン実行工程Ｓ３２２０４により、関数ｆを子関数ｆ＿Ａ３と設定した状態で、さらにサブルーチンＳ３２１の実行を開始する。
ＰＡＴＨ追加工程Ｓ３２１０では、サブルーチン実行工程Ｓ３２２０４により関数ｆに設定した、子関数ｆ＿Ａ３をＰＡＴＨの末尾に追加する。すなわち、ＰＡＴＨは、親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２、子関数ｆ＿Ａ２から呼び出された子関数ｆ＿Ｂ２、子関数ｆ＿Ｂ２から呼び出された子関数ｆ＿Ａ３である。
ステージ４：ステージ４は図５、図６の示すフローチャートにおけるサブルーチン実行工程Ｓ３２１０２の４度目の開始時点を表すステージである。この状態から、関数ｆ＿Ａ３の呼び出し先関数である子関数ｆ＿Ｂ２と子関数ｆ＿Ｂ３について、サブルーチンＳ３２２を開始する。ここでは、先に子関数ｆ＿Ｂ２について、サブルーチンＳ３２２を開始する場合を示す。
【００３１】
ステージ５：ステージ５は図５、図６の示すフローチャートにおける呼出しが行われたか否かを示す変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２のステージ４直後の開始時点を表すステージである。ここで、子関数ｆ＿Ｂ２に対する変数ｖｉｓｉｔｅｄは真であり、変数ｆｌａｇは偽である。ステージ５の前ステージで、子関数ｆ＿Ｂ２に対して変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３を行い、子関数ｆ＿Ｂ２の変数ｖｉｓｉｔｅｄを真に設定したからである。その結果、再帰呼出部設定工程Ｓ３２２０６へ進み、子関数ｆ＿Ｂ２と子関数ｆ＿Ａ３とを再帰呼出部として抽出し、ＣＹＣＬＥ＝（ｆ＿Ｂ２，ｆ＿Ａ３）を得る。次いで、再帰縮退工程Ｓ３３を行うステップ３２２０７へ進み、ＣＹＣＬＥ＝（ｆ＿Ｂ２，ｆ＿Ａ３）を引数に、再帰縮退工程Ｓ３３を行うことにより、子関数ｆ＿Ｂ２と子関数ｆ＿Ａ３とを一つの関数と見立てた静的コールグラフを得る。
次いで、変数ｆｌａｇ設定工程Ｓ３２２０８に進み、変数ｆｌａｇを真に設定する。そして、子関数ｆ＿Ａ３の呼び出し先としての子関数ｆ＿Ｂ２についてのサブルーチンＳ３２２を終了する。すると、ステージ４のサブルーチンＳ３２２を開始したところに戻ってくる。
続いて、子関数ｆ＿Ａ３の呼び出し先関数としての子関数ｆ＿Ｂ３について、サブルーチンＳ３２２を開始するが、先ほど変数ｆｌａｇ設定工程Ｓ３２２０８にて変数ｆｌａｇを真と設定したため、変数ｆｌａｇの真偽をチェックする工程Ｓ３２２０１にて、サブルーチンＳ３２２を終了する。以降、初期化工程Ｓ３２０１を再び実行し、変数ｆｌａｇを偽に戻さない限り、サブルーチンＳ３２２を新たに実行する場合は、何もしないサブルーチンとなる。続いて、ＰＡＴＨ削除工程Ｓ３２１０３に進む。
【００３２】
ＰＡＴＨ削除工程Ｓ３２１０３では、これまでのＰＡＴＨは、親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２、子関数ｆ＿Ａ２から呼び出された子関数ｆ＿Ｂ２、子関数ｆ＿Ｂ２から呼び出された子関数ｆ＿Ａ３であるところ、ＰＡＴＨの末尾の子関数ｆ＿Ａ３を削除して、ＰＡＴＨを親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２、子関数ｆ＿Ａ２から呼び出された子関数ｆ＿Ｂ２とする。
そして、ステージ４におけるサブルーチンＳ３２１を終了すると、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０５により、子関数ｆ＿Ａ３に関する変数ｖｉｓｉｔｅｄは偽に戻され、サブルーチンＳ３２２は終了する。すると、ステージ３においてサブルーチンＳ３２２を開始したサブルーチン実行工程Ｓ３２１０２に戻ってくる。
サブルーチン実行工程Ｓ３２１０２では子関数ｆ＿Ａ３から呼び出される、もうひとつの子関数ｆ＿Ｂ２についても、サブルーチンＳ３２２を新たに実行するが、変数ｆｌａｇを真であるため、何もせず終了する。
続いて、ＰＡＴＨ削除工程Ｓ３２１０３にて、これまでのＰＡＴＨは、親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２、子関数ｆ＿Ａ２から呼び出された子関数ｆ＿Ｂ２であるところ、ＰＡＴＨの末尾の子関数ｆ＿Ｂ２を削除して、ＰＡＴＨを親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２とし、ステージ３におけるサブルーチンＳ３２１を終了する。
そして、ステージ３におけるサブルーチンＳ３２１を終了すると、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０５により、子関数ｆ＿Ｂ２に関する変数ｖｉｓｉｔｅｄは偽に戻され、サブルーチンＳ３２２は終了する。すると、ステージ２においてサブルーチンＳ３２２を開始したサブルーチン実行工程Ｓ３２１０２に戻ってくる。
サブルーチン実行工程Ｓ３２１０２では、子関数ｆ＿Ｂ２以外に子関数ｆ＿Ａ２から呼び出される子関数が存在しないため、ＰＡＴＨ削除工程Ｓ３２１０３に進む。ＰＡＴＨ削除工程Ｓ３２１０３では、これまでのＰＡＴＨは、親関数ｆ＿ＭＡＩＮ、親関数ｆ＿ＭＡＩＮから呼び出された子関数ｆ＿Ａ２であるところ、ＰＡＴＨの末尾の子関数ｆ＿Ａ２を削除して、ＰＡＴＨを親関数ｆ＿ＭＡＩＮとし、ステージ２におけるサブルーチンＳ３２１を終了する。
そして、ステージ２におけるサブルーチンＳ３２１を終了すると、変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０５により、子関数ｆ＿Ａ２に関する変数ｖｉｓｉｔｅｄは偽に戻され、サブルーチンＳ３２２は終了し、ステージ２においてサブルーチンＳ３２２を開始したサブルーチン実行工程Ｓ３２１０２に戻ってくる。
サブルーチン実行工程Ｓ３２１０２では子関数ｆ＿ＭＡＩＮから呼び出される、もうひとつの子関数ｆ＿Ａ３についても、サブルーチンＳ３２２を新たに実行するが、変数ｆｌａｇを真であるため、何もせず終了する。そして、ＰＡＴＨ削除工程Ｓ３２１０３では、これまでのＰＡＴＨは、親関数ｆ＿ＭＡＩＮであるところ、ＰＡＴＨの末尾の子関数ｆ＿ＭＡＩＮを削除して、ＰＡＴＨを空とし、ステージ１におけるサブルーチンＳ３２１を終了する。そして、ステージ１におけるサブルーチンＳ３２１を終了すると、フラッグ判定工程Ｓ３２０３に進む。
フラッグ判定工程Ｓ３２０３では、変数ｆｌａｇ設定工程Ｓ３２２０８にて変数ｆｌａｇが真に設定されているため、初期化工程Ｓ３２０１に戻る。
以降、ほかの再帰呼出部を検出するために、再帰縮退工程Ｓ３３を行うステップ３２２０７にて得た静的コールグラフに対して、再びサブルーチン実行工程Ｓ３２０２以降を実行する。しかし、このコールグラフには再帰呼出部は存在しないため、すべての子関数について、呼出しが行われたか否かを示す変数ｖｉｓｉｔｅｄの真偽をチェックする工程Ｓ３２２０２において、すべて変数ｖｉｓｉｔｅｄ設定工程Ｓ３２２０３側へ進み、再帰読出部を検出するための再帰呼出工程Ｓ３２Ａが終了する。
【００３３】
図８は、再帰縮退工程Ｓ３３を説明するための図である。再帰縮退工程Ｓ３３は、呼出し関係抽出工程Ｓ３１からの出力と、再帰呼出部設定工程Ｓ３２２０６からの出力と、関数サイズ情報３３０４を受けて、工程Ｓ３３０１、工程Ｓ３３０２、工程Ｓ３３０３を実行するルーチンである。その結果、再帰縮退工程Ｓ３３は、再帰呼出し処理済み静的コールグラフ３３０５、関数縮退情報３３０６、再帰呼出し処理済関数サイズ情報３３０７を出力する。
【００３４】
呼出し関係抽出Ｓ３１からの出力及び再帰呼出部設定工程Ｓ３２２０６からの出力については、図４、図６に対する説明文において説明済みである。
関数サイズ情報３３０４は、親関数（ｆ＿ＭＡＩＮ）及び子関数（ｆ＿Ａ２、ｆ＿Ａ３等）を定義するソースコードのデータサイズである。
【００３５】
工程Ｓ３３０１は、呼出し関数抽出工程Ｓ３１からの出力としての静的コールグラフにおいて、検出した再帰呼出しに関係している各関数を同一の関数名に置き換える置換動作を行う。このときの置き換えルールを関数縮退情報３３０６として記憶する。なお、置き換えルールは、上記置換動作で使用した同一の関数名の情報を含む。そして、工程Ｓ３３０１の終了後、上記の関数縮退情報３３０６は、工程Ｓ３３０２、工程Ｓ３３０３のために出力される。工程Ｓ３３０１の置き換え処理について、図９において具体例を示す。
工程Ｓ３３０２は、関数縮退情報３３０６を用いて、関数呼出し関係（エントリ）の削除及び統合を行う工程である。すなわち、工程Ｓ３３０１の置換動作の結果、呼出し元の関数と呼出し先の関数が同一となった関数呼出し関係（エントリ）が生じた場合は、その関数呼出し関係は静的コールグラフより削除される。また、呼出し元の関数と呼出し先の関数が複数の関数呼出し関係（エントリ）において同一となり、重複する関数呼出し関係が生じたときは、静的コールグラフにおいて、複数の関数呼出し関係（エントリ）は一つに統合される。その結果、再帰呼出しに関連する関数は、静的コールグラフ上において、一つと見立てた関数として記述される。そして、工程Ｓ３３０２が終了すると、関数呼出し関係（エントリ）の削除及び統合が行われた後の静的コールグラフを再帰呼出し処理済み静的コールグラフ３３０５が出力される。関数呼出し関係（エントリ）の削除及び統合についても、図９において具体例を示す。
工程Ｓ３３０３は、関数縮退情報３３０６を用いて、再帰呼出し処理済み関数サイズ情報を作成する工程である。すなわち、関数サイズ情報３３０４に基づいて、一つと見立てた関数の関数サイズを見積もる。そして、工程Ｓ３３０３において、関数サイズ情報３３０４に一つと見立てた関数の関数サイズを追加して再帰呼出し処理済み関数サイズ情報３３０７を作成する。工程Ｓ３３０３の処理について、図９において具体例を示す。
【００３６】
図９は、再帰縮退工程Ｓ３３における具体的な処理動作の例を示す。図９は、呼出し関係出力Ｓ３１の出力、再帰呼出部設定工程Ｓ３２２０６の出力、工程Ｓ３３０１の出力、関数サイズ情報３３０４、及び、再帰縮退工程Ｓ３３の出力を図示する。
呼出し関係出力工程Ｓ３１の出力において、親関数（ｆ＿ＭＡＩＮ）は子関数ｆ＿Ａ２、子関数ｆ＿Ａ３を呼び出す関係にあり、子関数ｆ＿Ａ２は子関数ｆ＿Ｂ２を呼び出す関係にあり、子関数ｆ＿Ａ３は子関数ｆ＿Ｂ２、子関数ｆ＿Ｂ３を呼び出す関係にあり、子関数ｆ＿Ｂ２は子関数ｆ＿Ａ３、子関数ｆ＿Ｂ３を呼び出す関係にあることが記載されている。
再帰呼出部設定工程Ｓ３２２０３の出力において、子関数ｆ＿Ｂ２と子関数ｆ＿Ａ３は再帰呼出の関係にあることが記載されている。そこで、工程Ｓ３３０１においては、呼出し関係出力工程Ｓ３１の出力に対して、子関数ｆ＿Ｂ２と子関数ｆ＿Ａ３とを一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３に、子関数ｆ＿Ａ２及び子関数ｆ＿Ｂ２が置き換えられる。そして、関数縮退情報３３０６として、一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３は｛ｆ＿Ｂ２，ｆ＿Ａ３｝である旨が記憶される。
【００３７】
再帰縮退工程Ｓ３３の出力は、工程Ｓ３３０２の出力と、工程Ｓ３３０１の出力の一部と、工程Ｓ３３０３の出力を含む。ここで、工程Ｓ３３０１の出力の一部は、関数縮退情報３３０６である。
工程Ｓ３３０２において、工程Ｓ３３０１の出力の内、関数の呼出し関係について、一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３から一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３を呼び出す関係が複数あるため、それらの内一つを残して削除する。また、工程Ｓ３３０２において、一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３から子関数ｆ＿Ｂ３を呼び出す関数も複数あるため、一つに統合する。その結果、再帰呼出し処理済み静的コールグラフ３３０５が形成される。
工程Ｓ３３０３において、関数サイズ情報３３０４に基づいて、再帰呼出し処理済み静的コールグラフ３３０５中に存在する、親関数、子関数、一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３を表しデータのデータサイズを見積もる。その結果、再帰呼出し処理済み関数サイズ情報３３０７が形成される。
【００３８】
図１０はメモリ割当工程３４を説明するフローチャートである。メモリ割当工程３４は親関数配置工程Ｓ３４０１、合計コードサイズ計算工程Ｓ３４０２、電力制御を伴うメモリへの割当工程Ｓ３４０３、アドレス計算工程Ｓ３４０４を含む。
なお、メモリ割当工程３４を実行するには、再帰縮退工程Ｓ３３から出力された、ｂと表示した再帰処理済み静的コールグラフ、ｃと表示した再帰処理済み関数サイズ情報、ｄと表示した関数縮退情報を含む情報３４０７を使用する。また、メモリ割当工程３４を実行するには、ａと表示したメモリ構造情報３４０８を使用する。さらに、メモリ割当工程３４を実行するには、ｅと表示した静的コールグラフ、ｆと表示した関数サイズ情報を含む情報３４０９を使用する。なお、情報３４０７及び情報３４０９はソースコード、オブジェクト、又は、アセンブリ３４１１から得られる情報である。
親関数選択工程Ｓ３４０１において、親関数に関するコードに対し、メモリ領域を割り当てる。メモリ領域を割り当てるにあたり、ａと表示したメモリ構造情報、ｂと表示した再帰処理済み静的コールグラフ、ｃと表示した再帰処理済み関数サイズ情報を使用する。
合計コードサイズの計算工程Ｓ３４０２において、メモリ領域の確保のため、すべての関数に対してコードサイズを計算する。コードサイズを計算するにあたり、ｃと表示した再帰呼出済み関数サイズ情報を使用する。さらに、一つの関数と見立てた関数に対するコードサイズを把握する。コードサイズの把握にあたり、ｃと表示した再帰呼出済み関数サイズ情報を使用する。
電力制御を伴うメモリへの割当工程Ｓ３４０３において、一つの関数と見立てた関数のコードサイズと、ａと表示したメモリ構造情報から、一つの関数と見立てた関数が、単一のメモリバンクに割り当てられるように、メモリ領域を一つの関数と見立てた関数について割り当てる。メモリ領域を一つの関数と見立てた関数について割り当てる際に、ａと表示したメモリ構造情報と、合計コードサイズの計算工程Ｓ３４０２の結果を使用する。
アドレス計算工程Ｓ３４０４において、すべての関数についてメモリ領域に割当るととこに、メモリ領域と、そのメモリ領域に割り当てた関数についてメモリマップ情報を作成する。なお、メモリ領域に関数を割り当てる際に、図１０中のｅで示す静的グラフ、ｆで示す関数サイズ情報を使用する。ｅで示す静的グラフ、ｆで示す関数サイズ情報は、呼び出し関係抽出工程Ｓ３１で求めたものを使用することが望ましい。
【００３９】
図１１は関数に関するプログラムソースコードの割当状況を示す図である。図１１によって、メモリバンク１１ａからメモリバンク１６ａまで、メモリバンク１１ｂからメモリバンク１６ｂについて、関数に関するプログラムソースコードの割当状況が示される。
図１１の上段は、プログラムソースコードに対して、本実施例に係わる記憶領域の割当方法を適用しない場合の割当状況である。なお、図１１の上段中において、例示部分と表示した点線領域は、図４で説明した静的コールグラフに表した関数の呼出状況に対応している。
【００４０】
本実施例１に係わる記憶領域の割当方法を適用しない場合には、以下の順番で割当を行う。
プログラムソースコード中において、親関数から直接呼出しがかかる第１階層の関数を、アドレス順にメモリバンクに配置する。ついで、第１階層の関数からさらに呼出しがかかる第２階層の関数を第１階層の関数と同一のメモリバンクに配置できるときには配置する。ただし、再帰呼出しについては考慮されない。
従って、点線図形で囲った例示部分において、第１階層の子関数ｆ＿Ａ２と、子関数ｆ＿Ａ２から呼び出される第２階層の子関数ｆ＿Ｂ２はメモリバンク１３ａに割り当てられている。また、第１階層の子関数ｆ＿Ａ３と、子関数ｆ＿Ａ３から呼び出される第２階層の子関数ｆ＿Ｂ３はメモリバンク１４ａに割り当てられている。
【００４１】
なお、子関数ｆ＿Ａ１、子関数ｆ＿Ｃ１はメモリバンク１２ａに割り当てられている。子関数ｆ＿Ｂ１、子関数ｆ＿Ｄ１はメモリバンク１３ａに割り当てられている。子関数ｆ＿Ａ４、子関数ｆ＿Ｂ４はメモリバンク１５ａに割り当てられている。子関数ｆ＿Ａ５、子関数ｆ＿Ｂ５、子関数ｆ＿Ｃ２はメモリバンク１６ａに割り当てられている。親関数ｆ＿ＭＡＩＮはメモリバンク１１ａに割り当てられている。
【００４２】
一方、図１１の下段は、プログラムソースコードに対して、本実施例１に係わる記憶領域の割当方法を行った場合の割当状況である。
本実施例１に係わる記憶領域の割当方法を適用する場合には、以下のように割当が行われる。
【００４３】
図１１上段の例示部分に対応する、下段の点線図形で囲った例示部分において、第１階層の子関数ｆ＿Ａ２はメモリバンク１３ｂに割り当てられる。また、一つに見立てられた関数ｆ＿Ｂ２＊ｆ＿Ａ３は、第１階層の子関数としてメモリバンク１４ｂに割り当てられる。ここで、図１１上段では、子関数ｆ＿Ｂ３は単独の子関数であったが、本実施例１に係わる記憶領域の割当方法を適用することにより、子関数ｆ＿Ｂ３は一つと見立てられた子関数ｆ＿Ｂ３＊ｆ＿Ｂ４＊ｆ＿Ｂ５＊ｆ＿Ｃ２の構成要素となった。その結果、図１１下段の第２階層の子関数ｆ＿Ｂ３＊ｆ＿Ｂ４＊ｆ＿Ｂ５＊ｆ＿Ｃ２の一部として、子関数ｆ＿Ｂ３はメモリバンク１５ｂに配置されている。
【００４４】
なお、子関数ｆ＿Ａ１、子関数ｆ＿Ｃ１はメモリバンク１２ｂに割り当てられている。子関数ｆ＿Ｂ１、子関数ｆ＿Ｄ１はメモリバンク１３ｂに割り当てられている。子関数ｆ＿Ａ４はメモリバンク１５ｂに割り当てられている。子関数ｆ＿Ａ５はメモリバンク１６ｂに割り当てられている。親関数ｆ＿ＭＡＩＮはメモリバンク１１ｂに割り当てられている。
【００４５】
図１１の上段に示す、子関数ｆ＿Ａ３と子関数ｆ＿Ｂ２とは、再帰呼出関係にあるが、子関数ｆ＿Ａ３と子関数ｆ＿Ｂ２とは異なるメモリバンクに配置されている。そうすると、ＣＰＵは、メモリバンク１３ａとメモリバンク１４ａは、同時に通常電力供給状態とすることになる。メモリバンク１３ａ又はメモリバンク１４ａの内の一方が、省電力供給状態であり、他方が通常電力供給状態であるとすると、相互に再帰呼出を行えないからである。
一方、図１１の下段に示す、子関数ｆ＿Ａ３と子関数ｆ＿Ｂ２とは、一つと見立てられた子関数ｆ＿Ｂ２＊ｆ＿Ａ３として、同一のメモリバンク１４ｂに配置されている。従って、一つと見立てられた子関数ｆ＿Ｂ２＊ｆ＿Ａ３に関する呼出動作を行うにはメモリバンク１４ｂのみを通常供給状態とすればよく、メモリバンク１３ｂは省電力供給状態のまま維持することができる。
従って、実施例１のメモリシステム５０において、実施例１のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施し、メモリシステム５０に含まれるＣＰＵによって、関数の呼出状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。その結果、実施例１のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施によって、メモリシステム５０の消費電力を削減することができる。
【００４６】
なお、上記の説明において、各メモリバンクの電源状態のコントロールを、ＣＰＵがメモリバンクに割り当てた関数に関するソースプログラムコードの割当状態に応じて、行うこととした。しかし、図１２に示す方法によって、ＣＰＵがソースプログラムから、電源制御入り実行プログラムを生成し、電源制御入り実行プログラムによる制御によって、ＣＰＵがメモリバンクの電源状態をコントロールすることとしても、メモリシステムの消費電力を削減することができる。
【００４７】
図１２は、実施例１の変形例であるメモリシステム１２０及びそのメモリシステム１２０において生成される電源制御入り実行プログラムの生成方法に対するフローチャートを示す。図１２の左半分は電源制御入り実行プログラムの生成方法を説明するためのフローチャートであり、右半分は実施例１の変形例であるメモリシステム１２０を示す。
図１２のフローチャートにより示す実行プログラムの生成方法は、コンパイル工程Ｓ１、制御位置算出工程Ｓ２、メモリマップ決定工程Ｓ３、制御パラメータ決定・制御コード挿入工程Ｓ４、アセンブル・リンク工程Ｓ５を含む。
コンパイル工程Ｓ１において、ソースプログラムは、ＣＰＵ１１０内のプロセッサに読み込まれ、アセンブリコード又はオブジェクトに変換される。
制御位置算出工程Ｓ２において、ＣＰＵ１１０内のプロセッサはメモリバンクのオンオフを制御するアセンブリコード又はオブジェクトを検出する。
メモリマップ（レイアウト）決定工程Ｓ３において、呼出し関係抽出工程Ｓ３１からメモリ割当工程Ｓ３４までを行いメモリマップを決定し、メモリマップ情報を出力する。
ここで、メモリマップとは、再帰呼出し部を表すアセンブリコード又はオブジェクトと、アセンブリコード又はオブジェクトを格納した場所を示すメモリバンクのアドレスとの対応を示すマップである。また、メモリマップ情報は、メモリマップをコードで表したデータから構成されている。
制御パラメータ決定・制御コード挿入工程Ｓ４において、メモリマップ情報に基づいてメモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置を修正する。
アセンブル・リンク工程Ｓ５において、メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置が修正されたプログラムを、電力制御入り実行プログラムとしてプログラム記憶領域に記憶する。
【００４８】
図１２の右半分の図はメモリシステム１２０を示す。メモリシステム１２０は、ＣＰＵ１１０、制御レジスタ群３０、電源線４５、電源制御装置４６、メモリユニット１０、及び、バス４０を含む。
図１の説明において、制御レジスタ群３０、電源線４５、電源制御装置４６、メモリユニット１０、バス４０の説明をしたため、説明を省略する。
ＣＰＵ１１０は、プロセッサと、メモリコントローラと、ソースプログラム格納領域と、電源制御入り実行プログラム格納領域を含む。図１の説明において、メモリコントローラについては説明済みなため、説明を省略する。ソースプログラム格納領域は、外部から与えられたソースプログラムを記憶する領域である。電源制御入り実行プログラム格納領域は、ＣＰＵ１１０自身が、ソースプログラムから生成した電源制御入り実行プログラムを格納する領域である。
以上より、メモリシステム１２０は、図１に示したメモリシステム５０と比較し、ＣＰＵ内に、ソースプログラムから生成した電源制御入り実行プログラムを保持することになり、メモリユニット１０の制御を容易に行うことができる。
【実施例２】
【００４９】
図１３は、実施例２に係わる、プログラムに含まれるコードに記憶領域を割り当てる割当方法を説明する図である。
実施例２に係わる、プログラムに含まれるコードに記憶領域を割り当てる割当方法は、呼出関係抽出工程Ｓ３５、再帰呼出抽出工程Ｓ３２Ａ、再帰読出処理済み静的コールグラフ作成工程Ｓ３２Ｂ、再帰呼出縮退工程Ｓ３６、及び、メモリ割当工程Ｓ３７を含む。
再帰呼出抽出工程Ｓ３２Ａ及び再帰読出処理済み静的コールグラフ作成工程Ｓ３２Ｂは、図３に示す同様な符号を付したステップと同様なものであり、その説明を省略する。
呼出関係抽出工程Ｓ３５において、プログラムのソースコード、アセンブリまたはオブジェクトを走査し、出現する関数それぞれに対し、関数呼出回数をカウントする。次いで、カウントに応じて関数呼出しに重みを付加し、重み情報付きの静的コールグラフを作成する。再帰呼出抽出工程Ｓ３２について、図１４を用いてさらに説明を加える。
再帰縮退工程Ｓ３６において、再帰呼出抽出工程Ｓ３２Ａにおいて再帰呼出部を検出した場合、再帰呼出部をまとめる再帰縮退を行う。すなわち、再帰呼出部に関連する関数を、重み付け情報を有する一つと見立てられた関数とする。なお、再帰縮退工程Ｓ３６において、関数サイズ情報８１が使用される。なお、再帰縮退工程Ｓ３６について、図１５、図１６を用いてさらに説明を加える。
メモリ割当工程Ｓ３７において、重み付けされた一つと見立てられた関数について、一体としてメモリ領域を割り振る。すなわち、一つと見立てられた関数は、同一メモリバンクに格納される。なお、一つと見立てられた関数は、ソースコード、アセンブリ、又はオブジェクト８２から得られるコードから抽出されるものである。
【００５０】
図１４は呼出関係抽出工程Ｓ３５に関する、フローチャート、静的コールグラフ、及び、呼出抽出後の出力データ表を図示する。
図１４の重み情報付き静的コールグラフは、図４の静的コールグラフと、例として上げられている関数及びその呼出関係において同様である。ただし、関数の呼出関係において呼出回数に応じた重み付けがされている点で異なる。
図１４の呼出関係抽出工程Ｓ３５の出力データ表は、図１４の重み情報付き静的コールグラフに対応する出力データ表である。図４の出力データ表に記載されている項目に加えて、第３列に関数の呼出関係に対する重みの数値が記載されている点で異なる。
図１４のフローチャートによれば、呼出関係抽出工程Ｓ３５は、関数別呼出回数カウント工程Ｓ３５１、重み付け工程Ｓ３５２、重み情報付き静的コールグラフの作成工程Ｓ３５３、静的コールグラフに関するデータ作成工程Ｓ３５４を含む。
【００５１】
関数別呼出回数カウント工程Ｓ３５１は、アセンブリ及びオブジェクトと、関数の呼出履歴を受けて、呼出元の関数から呼出先の関数への呼出回数をカウントする工程である。
重み付け工程Ｓ３５２は、関数別呼出回数カウント工程Ｓ３５１における呼出回数に基づいて、呼出元となる関数と、呼出先となる関数との呼出関係について重み付けを付与するステップである。
ここで、プログラムソースコード、アセンブリまたはオブジェクトにおける呼出し関係に基づいて、親関数ｆ＿ＭＡＩＮが行う子関数の呼出しの回数を、ソースコード呼出し回数とする。また、プログラムを実行する際に、親関数ｆ＿ＭＡＩＮの関数形式に基づいて、すなわち、引数等に基づいて、親関数ｆ＿ＭＡＩＮが行う子関数の呼出しの回数を、関数依存呼出し回数とする。ソースコード呼出し回数は、プログラムソースコード、アセンブリまたはオブジェクトにより、一義的にきまるため、静的な呼出し回数といえる。一方、関数依存呼出し回数は、入力された引数等によりその回数が増減するため、動的な呼出し回数といえる。
そこで、関数依存呼出し回数を、ソースコード呼出し回数に対する重み付けとし、ソースコード呼出し回数を、関数依存呼出し回数とする。
ここで、関数依存呼出し回数をＸ（＝Ａ１１＋Ａ１２＋・・・＋Ａ１ｍ＋Ａ２１＋Ａ２２＋・・・＋Ａ２ｍ）、ソースコード呼出し回数をＹ（＝Ｙ１＋Ｙ２）とする。ここで、プログラムコード中における、親関数ｆ＿ＭＡＩＮからの子関数ｆ＿Ａ１のソースコード呼出し回数はＹ１であり、さらに、ソースコード中の各呼出しについて、親関数の関数形式に依存した子関数の関数依存呼出し回数は、Ａ１１、Ａ１２、・・・Ａ１ｍ（ｍは正の整数）である。また、プログラムコード中における、親関数ｆ＿ＭＡＩＮに対応する子関数ｆ＿Ａ２のソースコード呼出し回数はＹ２であり、さらに、ソースコード中に各呼出しについて、親関数の関数形式に依存した子関数の関数依存呼出し回数はＡ２１、Ａ２２、・・・Ａ２ｍ（ｍは正の整数）である。そうすると、重みは以下のように表される。
重みＰ（ｆ＿ＭＡＩＮ，ｆ＿Ａ１）＝（Ｙ１×Ｘ＋Ａ１１×Ｙ＋Ａ１２×Ｙ＋・・・＋Ａ１ｍ×Ｙ）
重みＰ（ｆ＿ＭＡＩＮ，ｆ＿Ａ２）＝（Ｙ２×Ｘ＋Ａ２１×Ｙ＋Ａ２２×Ｙ＋・・・＋Ａ２ｍ×Ｙ）
例えば、親関数ｆ＿ＭＡＩＮに対応するプログラムコード中に子関数ｆ＿Ａ１を３回、子関数ｆ＿Ａ２を２回呼び出しているとするならば、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ２への重みが３とされ、親関数ｆ＿ＭＡＩＮから数ｆ＿Ａ２への重みが２とされる。また、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ１へ１０回、子関数ｆ＿Ａ２へ２０回の呼出し履歴と、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ２へ１０回、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ３へ４０回の呼出しがあったとする。
重みＰ（ｆ＿ＭＡＩＮ，ｆ＿Ａ１）＝（３×８０＋５×１０＋５×１０）＝３４０
重みＰ（ｆ＿ＭＡＩＮ，ｆ＿Ａ２）＝（２×８０＋５×２０＋５×４０）＝４６０
となる。
重み情報付き静的コールグラフの作成工程Ｓ３５３は、重み情報を付加された静的コールグラフを作成し、その静的コールグラフに関するデータを作成する工程である。
【００５２】
図１５は再帰縮退工程Ｓ３６を説明するための図である。再帰縮退工程Ｓ３６は、呼出し関係抽出工程Ｓ３５からの出力と、再帰呼出設定工程Ｓ３２２０６からの出力と、関数サイズ情報３６０４を受けて、工程Ｓ３６０１、工程Ｓ３６０２、工程Ｓ３６０３を実行するルーチンである。その結果、再帰縮退工程Ｓ３６は、再帰呼出処理済み静的コールグラフ３６０５、関数縮退情報３６０６、再帰呼出処理済関数サイズ情報３６０７を出力する。
【００５３】
工程Ｓ３６０１は、呼出関数抽出Ｓ３１からの出力としての静的コールグラフにおいて、検出した再帰呼出しに関係している各関数を同一の関数名に置き換える置換動作を行う。このときの置き換えルールを関数縮退情報３６０６として記憶する。なお、置き換えルールは、上記置換動作で使用した同一の関数名の情報を含む。そして、工程Ｓ３３０１の終了後、上記の関数縮退情報３６０６は、工程Ｓ３６０２、工程Ｓ３６０３のために出力される。ステップＳ３６０１の置き換え処理について、図１６において具体例を示す。
工程Ｓ３６０２は、関数縮退情報３６０６を用いて、関数呼出関係の削除及び統合を行うステップである。すなわち、工程Ｓ３３０１の置換動作の結果、呼出元の関数と呼出先の関数が同一となった関数呼出し関係が生じた場合は、その関数呼出関数は静的コールグラフより削除される。また、呼出元の関数と呼出先の関数が複数の関数呼出関係において同一となり、重複する関数呼出し関係が生じたときは、静的コールグラフにおいて、複数の関数呼出し関係を一つに統合される。その結果、再帰呼出しに関連する関数は、静的コールグラフ上において、一つと見立てた関数として記述される。そして、工程Ｓ３６０２が終了すると、関数呼出し関係の削除及び統合が行われた後の静的コールグラフを再帰呼出し処理済静的コールグラフ３６０５が出力される。関数呼出し関係の削除及び統合についても、図１６において具体例を示す。
工程Ｓ３６０３は、関数縮退情報３６０６を用いて、再帰呼出処理済み関数サイズ情報を作成する工程である。すなわち、関数サイズ情報３６０４の基づいて、一つと見立てた関数の関数サイズを見積もる。また、一つと見立てた関数の重みは、再帰呼出しに関連する関数の重みを加算したものである。そして、工程Ｓ３６０３はにおいて、関数サイズ情報３６０４に一つと見立てた関数の関数サイズを追加して再帰呼出処理済み関数サイズ情報３６０７を作成する。工程Ｓ３６０３の処理について、図１６において具体例を示す。
【００５４】
図１６は、再帰縮退工程Ｓ３６における具体的な処理動作の例を示す。図１６は、呼出関係出力工程Ｓ３５の出力、再帰呼出設定工程Ｓ３２２０６の出力、工程Ｓ３６０１の出力、関数サイズ情報３３０４、及び、再帰縮退工程Ｓ３６の出力を図示する。
呼出関係抽出工程Ｓ３５の出力は、呼出関係出力工程Ｓ３１の出力に加え、呼出し関係の重み付けを表示する欄を含む。呼出し関係の重みを表示する欄において、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ２への呼出し関係に対する重みは１５０、親関数ｆ＿ＭＡＩＮから子関数ｆ＿Ａ３への呼出し関係に対する重みは４５０、親関係ｆ＿Ａ２から子関係ｆ＿Ｂ２の呼出し関係の重みは２００、親関数ｆ＿Ａ２から子関数ｆ＿Ａ３への呼出し関係に対する重みは１００、親関数ｆ＿Ａ３から子関数ｆ＿Ｂ３への呼出し関係に対する重みは３３０、親関数ｆ＿Ｂ２から子関数ｆ＿Ａ３への呼出し関係に対する重みは３００、親関数ｆ＿Ｂ２から子関数ｆ＿Ｂ３への呼出し関係に対する重みは５０である。なお、図１６のＳ３５中の重みの例は、図１４に示した例とは異なる例である。
【００５５】
再帰縮退工程Ｓ３６の出力は、工程Ｓ３６０２と、工程Ｓ３６０１の出力の一部と、工程Ｓ３６０３の出力を含む。ここで、工程Ｓ３６０１の出力の一部は、関数縮退情報３６０６である。
工程Ｓ３６０２において、工程Ｓ３６０１の出力の内、関数の呼出し関係について、一つの見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３について、工程Ｓ３３０２と同様に、削除と統合を行う。ただし、一つの見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３について、重み付けが付加される点では、工程Ｓ３６０２は工程Ｓ３３０２とは異なる。その結果、再帰呼出し処理済静的コールグラフ３６０５が形成される。
工程Ｓ３６０３において、親関数、子関数、一つと見立てた関数ｆ＿Ｂ２＊ｆ＿Ａ３のコードサイズを見積もる。その結果、再帰呼出し処理済関数のサイズ情報３６０７が形成される。
【００５６】
図１７は、実施例のメモリ割当工程Ｓ３７を説明するフローチャートである。メモリ割当工程Ｓ３７は親関数選択工程Ｓ３７０１、電力制御無しメモリ割当工程Ｓ３７０２、合計コードサイズ計算工程Ｓ３７０３、呼出頻度算出工程Ｓ３７０４、電力制御を伴うメモリへの割当工程Ｓ３７０５、アドレス計算工程Ｓ３７０６を含む。
なお、メモリ割当工程Ｓ３７を実行するには、再帰縮退工程Ｓ３６から出力された、ｂと表示した再帰処理済み静的コールグラフ、ｃと表示した再帰処理済み関数サイズ情報、ｄと表示した関数縮退情報を含む情報３７０７を使用する。また、メモリ割当工程３７を実行するには、ａと表示したメモリ構造情報３７０８を使用する。さらに、メモリ割当工程Ｓ３７を実行するには、ｅと表示した静的コールグラフ、ｆと表示した関数サイズ情報を含む情報３７０９を使用する。なお、情報３７０７及び情報３７０９はソースコード、オブジェクト、又は、アセンブリ３７１１から得られる情報である。
親関数選択工程Ｓ３７０１において、メイン関数を除くすべての関数について、呼出し頻度が最も高い呼出し元関数を、その関数の親関数として選択する。親関数の選択にあたり、ｂと表示した再帰処理済み静的コールグラフ、ソースコード、オブジェクト、又は、アセンブリ３７１１を使用する。この工程により、メイン関数を頂点とした親子関係の階層が特定される。
電力制御無しメモリ割当工程Ｓ３７０２において、親関数選択工程Ｓ３７０１にて特定したメイン関数を頂点とした親子関係の階層にて、メイン関数から一定の呼出し階層内の関数を選択し（この詳細は特許文献５にて開示）、選択した関数を電力制御を行わないメモリバンクに割り当てる。メモリバンクに選択した関数を割り当てるために、ａと表示したメモリ構造情報３７０８、ｃと表示した再帰呼出処理済み関数サイズ情報を使用する。
【００５７】
合計コードサイズ計算工程Ｓ３７０３において、電力制御を行わないメモリバンクに割り当てた関数の、親子関係の階層における直下の階層に属する各関数につき、各関数を代表関数とする関数群を作成し、その関数群の合計コードサイズを、その関数群を構成するコードサイズの合計により、計算する。この結果は、合計コードサイズテーブルとして保存される。なお、各関数を代表関数とする関数群は、代表関数および親子関係の階層における代表関数の子孫関数（呼出し先関数、呼出し先関数の呼出し先関数、呼出し先関数の呼出し先関数の呼出し先関数・・・すべてを指す）により構成される。合計コードサイズを計算するにあたり、ｃと表示した再帰処理済み関数サイズ情報を使用する。また、電力制御無しメモリ割当工程Ｓ３７０２で用いた、呼出し階層数の情報を合計コードサイズ計算工程Ｓ３７０３でも用いる。
【００５８】
呼出し頻度算出工程Ｓ３７０４において、ｂと表示した再帰呼出処理済み静的コールグラフを用いて、合計コードサイズ計算工程Ｓ３７０３において構成した関数群の間の呼出し頻度を算出する。この結果は関数群間の呼出頻度表として保存される。
電力制御を伴うメモリへの割当工程Ｓ３４０５において、電力制御無しメモリに割り当てられた関数以外の関数について、メモリ領域を割当てる。メモリ領域を関数に割り当てるにあたり、ａと表示したメモリ構造情報、合計コードサイズ計算工程Ｓ３７０３にて計算した合計コードサイズテーブル、および、呼出し頻度算出工程Ｓ３７０４にて算出した関数群間の呼出頻度表を使用する。合計コードサイズ計算工程Ｓ３７０３にて構成した関数群ごとに割り当てることにより、呼出し元の関数から一番呼出し頻度が高い呼出し先の関数を、呼出し元の関数と同一のメモリバンクに、また、呼出し頻度算出工程Ｓ３７０４の結果を用いることで二番目以降に呼出し頻度が関数についてもできるだけ呼出し元の関数と同一のメモリバンクに、割り当てることができる。
アドレス計算工程Ｓ３７０６において、電力制御無しメモリ割当工程Ｓ３７０２および電力制御を伴うメモリへの割当工程Ｓ３７０５において割り当てた各関数のうち再帰縮退工程Ｓ３６によって一つにまとめられた関数は元の関数に復元し、その後、各関数について開始アドレスを算出し、メモリマップ情報を作成する。開始アドレスを算出とメモリマップ情報作成にあたり、ａと表示したメモリ構造情報、ｄと表示した関数縮退情報、ｅと表示した静的コールグラフ、ｆと表示した関数サイズ情報を使用する。また、電力制御無しメモリ割当工程Ｓ３７０２における割り当て結果、および電力制御を伴うメモリへの割当工程Ｓ３７０５における割り当て結果を用いる。
【００５９】
以上より、実施例１のメモリシステム５０において、実施例２のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施し、メモリシステム５０に含まれるＣＰＵによって、関数の呼出し状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。ここで、実施例２のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施すると、呼出し元の子関数に対して、呼出し頻度の高い、呼出し先の子関数を選択して、同一バンクに割り当てることができる。そうすると、実施例１の割当方法により、子関数をメモリ領域に割り当てる場合に比較し、実施例２の割当方法により、子関数をメモリ領域に割り当てる方が、より通常電力供給状態とするメモリバンク数を減少させることができる。
呼出し元の子関数について、呼出し先の子関数が複数ある場合、呼出し頻度の低い子関数を同一バンクに割り当てる一方で、呼出し頻度の高い子関数を他のメモリバンクに割り当てる場合、複数のメモリバンクを通常電力供給状態とする頻度が高くなるからである。
【実施例３】
【００６０】
実施例２において、呼び出し頻度の高い、呼出し先の子関数を同一のメモリバンクに割り当てようとするが、割り当て先のメモリバンクの記憶容量が小さく、呼出し先の子関数すべてを同一のメモリバンクに割り当てられない場合が想定される。その場合に、メモリシステム５０において、以下に示す実施例３のプログラムを実行すると、同一のメモリバンクに割当られなかった関数は所定のメモリバンクに割り当てられる。ここで、実施例３のメモリ割当工程は、実施例２のメモリ割当工程Ｓ３７中の電力制御有りメモリ割当部Ｓ３７０５に代えて、以下に示す電力制御有りメモリ割当部Ｓ４００５を含む工程である。
図１８Ａ、及び１８Ｂは実施例３に係わる電力制御有りメモリ割当部Ｓ４００５を示す。
実施例３のメモリ割当工程は、親関数選択工程Ｓ３７０１、電力制御無しメモリ割当工程Ｓ３７０２、合計コードサイズ計算工程Ｓ３７０３、呼出頻度算出工程Ｓ３７０４、電力制御を伴うメモリへの割当工程Ｓ４００５、アドレス計算工程Ｓ３７０６を含む。このうち、親関数選択工程Ｓ３７０１、電力制御無しメモリ割当工程Ｓ３７０２、合計コードサイズ計算工程Ｓ３７０３、呼出し頻度算出工程Ｓ３７０４、アドレス計算工程Ｓ３４０６は実施例２と同一である。実施例３の電力制御を伴うメモリへの割当工程Ｓ４００５の実行は、スタート以下、次の工程を実行することとなる。
まず、残りメモリサイズ変数初期化工程Ｓ４００５０１を行う。残りメモリ領域サイズ変数初期化工程Ｓ４００５０１は残りメモリ領域サイズを記憶する変数ｍ＿ｒｅｓｔの値を初期化する工程である。すなわち、電力制御無しメモリ割当工程Ｓ３７０２において割り当てた電力制御を行わないメモリバンクＭに対しては、ｍ＿ｒｅｓｔ（ｍ＿ｒｅｓｔ［Ｍ］）の値を０、それ以外のメモリバンクＭに対するｍ＿ｒｅｓｔの値（ｍ＿ｒｅｓｔ［Ｍ］）をメモリバンクＭの容量と初期化する。
次いで、合計コードサイズ最大の関数群を選択する工程Ｓ４００５０２を行う。合計コードサイズ最大の関数群を選択する工程Ｓ４００５０２は、合計コードサイズテーブルを走査し、現時点でメモリバンクへ割り当てていない関数群のうちコードサイズ最大の関数群を選び最大関数群Ｆ＿Ｍａｘとして設定する。なお、実施例３および後述の実施例４において、「関数群」とは合計コードサイズ計算工程Ｓ３７０３において構成した関数群のことを意味している。
次いで、最大関数群を配置判断する工程Ｓ４００５０３を行う。最大関数群を配置判断する工程Ｓ４００５０３は最大関数群Ｆ＿Ｍａｘが配置できるメモリバンクを検出できるかを判断する工程である。最大関数群Ｆ＿Ｍａｘが配置できるメモリバンクを検出できた場合には、残りメモリサイズ変数を更新する工程Ｓ４００５０４へ進む。一方、最大関数群Ｆ＿Ｍａｘが配置できるメモリバンクを検出できなかった場合には、最大関数群Ｆ＿Ｍａｘ配置ルーチン（メモリバンク認識工程Ｓ４００５１３から残りメモリバンク更新工程Ｓ４００５１６を含む）に進む。
【００６１】
残りメモリサイズ変数を更新する工程Ｓ４００５０４は、コードサイズ最大の関数群Ｆ＿Ｍａｘのコード量（ｓ（Ｆ_Ｍａｘ））を、最大関数群を配置判断する工程Ｓ４００５０３にて検出したメモリバンクの残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）から差し引いて、最大関数群Ｆ＿Ｍａｘ配置後のメモリバンクの残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）を更新する工程である。
次いで、呼び出し頻度認識により集合Γを生成する工程Ｓ４００５０５を行う。呼び出し頻度認識工程により集合Γを生成するＳ４００５０５は最大関数群Ｆ＿Ｍａｘから呼び出し関係にあり、かつ、メモリバンクへ未割り当ての関数群Ｆからなる集合Γを生成する工程である。なお、最大関数群Ｆ＿Ｍａｘから呼び出し関係にあることの判定は、最大関数群Ｆ＿Ｍａｘからの呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ）が０より真に大きいことにより行う。呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ）は関数群Ｆ＿Ｍａｘに含まれる関数φ及び関数群Ｆに含まれる関数ψの組合せについて、重みＰ（φ，ψ）と重みＰ（ψ，φ）の合算値を、すべての組合せについて計算し、計算した合算値すべてについて和をとって得られるものである。ただし、関数群Ｆ＿Ｍａｘに含まれる関数は割り当て済みであり、呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ＿Ｍａｘ）は上記のとおりに計算しても集合Γから除外されるので、呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ＿Ｍａｘ）の値は０とする。すなわち、呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ）は以下の式で表される。
（数１）
Ｑ（Ｆ＿Ｍａｘ，Ｆ）＝０                                Ｆ＝Ｆ＿Ｍａｘのとき
Σ（Ｐ（φ，ψ）＋Ｐ（ψ，φ））  Ｆ≠Ｆ＿Ｍａｘのとき
φ∈Ｆ＿Ｍａｘ
ψ∈Ｆ
ここで、φは関数群Ｆ＿Ｍａｘに含まれる関数を示す。ψは関数群Ｆに含まれる関数を示す。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５０６を行う。集合Γが空集合であるときは、メモリ割当が終了したかを判断する工程Ｓ４００５１２に進む。一方、集合Γが空集合でないときは、メモリ領域割り当てルーチンＳ４００５０７へ進む。メモリ領域割り当てルーチンＳ４００５０７は最大関数群Ｆ＿Ｍａｘ以外の関数であって、集合Γに属する関数についてメモリ領域を割り当てるルーチンであり、図１８Ｂを用いて説明する。
【００６２】
メモリバンク認識工程Ｓ４００５１３は残りのメモリ領域が存在するメモリバンクを認識し、残りメモリ領域サイズが大きい順にＭ１、Ｍ２、・・・、Ｍｎ（ｎは正の整数）と名付ける工程である。なお、残りメモリ領域サイズが同一値であるメモリバンクが存在する場合は、同一値であるメモリバンク同士、同一値であるメモリバンクの次に残りメモリ領域サイズが多いメモリバンク、および、同一値であるメモリバンクの次に残りメモリ領域サイズが少ないメモリバンクが、可能な限りアドレスが連続するように名付けると、後述する理由により望ましい結果となる。
次いで、最大関数を割り当て可能なメモリバンクを認識する工程Ｓ４００５１４を行う。最大関数を割り当て可能なメモリバンクを認識する工程Ｓ４００５１４では、残りのメモリ領域を大きい順に加えていき、加算された残りのメモリ領域が最大関数群Ｆ＿Ｍａｘのコードサイズ以上となるときが何番目のメモリバンクにあたるかを検出する。すなわち、ｍ＿ｒｅｓｔ［Ｍ１］＋ｍ＿ｒｅｓｔ［Ｍ２］＋・・・＋ｍ＿ｒｅｓｔ［Ｍｍ］≧s(Ｆ＿Ｍａｘ)（ｍはｎ以下の正の整数）となるｍを検出することとなる。ここで、ｓ（Ｆ＿Ｍａｘ）は最大関数群Ｆ＿Ｍａｘのコードサイズを表す。
【００６３】
次いで、メモリ領域割当工程Ｓ４００５１５を行う。メモリ領域割当工程Ｓ４００５１５はＭ１からＭｍまでの複数のメモリバンクに、最大関数群Ｆ＿Ｍａｘを割り当てる工程である。なお、メモリバンクＭ１からＭｍまで、アドレスが連続しているとより望ましい結果となる。例えば、後に図１９Ｄに示すように、アドレスが連続しているメモリバンク４００５２１とメモリバンク４００５２２が、最大関数群Ｆ＿Ｍａｘを割り当てるメモリ領域として選択されることと望ましい結果となる。アドレスが連続するメモリバンクを選択すれば、メモリバンク間を移動するための分岐命令を省くことができ、プロセッサの消費電力を削減できるからである。
次いで、残りメモリ領域サイズ更新工程Ｓ４００５１６を行う。残りメモリ領域サイズ更新工程Ｓ４００５１６は、次の操作をする工程である。まず、ｍ＿ｒｅｓｔ［Ｍｉ］＝０  （ｉ＝１、・・・、ｍ−１）とした後、ｍ＿ｒｅｓｔ［Ｍｍ］＝（ｍ＿ｒｅｓｔ［Ｍ１］＋ｍ＿ｒｅｓｔ［Ｍ２］＋・・・＋ｍ＿ｒｅｓｔ［Ｍｎ］）−ｓ（Ｆ＿Ｍａｘ）とする。ここで、ｓ（Ｆ＿Ｍａｘ）は最大関数群Ｆ＿Ｍａｘのコード量を表す。すなわち、１からｍ−１番目までのメモリバンクの残りメモリ領域サイズを０にするとともに、最大関数群Ｆ＿Ｍａｘの内、１からｍ−１番目までのメモリバンクに配置しきれなかった部分のサイズを、ｍ番目のメモリバンクの元のメモリ領域サイズから、差し引き、ｍ番目のメモリバンクの残りメモリ領域サイズを求める。
残りのメモリ領域の更新工程Ｓ４００５１６が終了すると、呼び出し頻度認識工程Ｓ４００５０５へ進む。
【００６４】
メモリ割当が終了したかを判断する工程Ｓ４００５１２は、合計コードサイズテーブル中の関数群のすべてについて、メモリ領域を割り当てたかを判断する工程である。すなわち、最大関数群Ｆ＿Ｍａｘに含まれる関数及び最大関数群Ｆ＿Ｍａｘと呼び出し関係にある関数群に含まれる関数をメモリ領域に割当てた後、さらに合計コードサイズテーブル中に、メモリ領域に割り当てられていない他の関数群が存在するか否かを判断する工程である。ここで、合計コードサイズテーブル中に他の関数群が存在し、その関数群について、メモリ領域の割当が終了していないと判断する場合、合計メモリサイズ最大の関数群を選択する工程Ｓ４００５０２に進む。一方、メモリ領域の割り当てが終了していると判断する場合、実施例３のメモリ割当工程を終了する。
【００６５】
図１８Ｂは、メモリ領域割り当てルーチンＳ４００５０７について説明するフローチャートである。
メモリ領域割当ルーチンＳ４００５０７は、呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４００５０８と、残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）の判断工程Ｓ４００５０９と、関数をメモリ領域の残りに割り当てる工程Ｓ４００５１０と、集合Γ更新工程Ｓ４００５１１とを含む。
【００６６】
呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４００５０８は、集合Γに含まれる関数群Ｆの内、最大関数群Ｆ＿Ｍａｘとの呼出し頻度最大の関数を選び関数群Ｆ＿Ｒｅｌとして設定する工程である。但し、同一呼出し頻度の関数が複数存在する場合は、呼出し回数最大関数群Ｆ＿Ｒｅｌの候補となる関数群の内、コードサイズが最大となる関数を選択する。
残りメモリ領域サイズ判断工程Ｓ４００５０９は、メモリバンクＭの残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）が呼出し頻度最大の関数群Ｆ＿Ｒｅｌのコード量以上であるかを判断する工程である。ただし、前記メモリバンクＭは、最大関数群を配置判断する工程Ｓ４００５０３にて割り当てたメモリバンク、あるいはメモリ領域割当工程Ｓ４００５１５におけるメモリバンクＭｍを指している。どちらを指すかは最大関数群を配置判断する工程Ｓ４００５０３の判断結果に依存する。残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）が関数群Ｆ＿Ｒｅｌのコード量（ｓ（Ｆ＿Ｒｅｌ））以上である場合には、関数群Ｆ＿Ｒｅｌを残りメモリ領域に割り当てる工程Ｓ４００５１０に進み、残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）が関数群Ｆ＿Ｒｅｌのコード量（ｓ（Ｆ＿Ｒｅｌ））より真に小さい場合には、集合Γ更新工程Ｓ４００５１１へ進む。
【００６７】
集合Γ更新工程Ｓ４００５１１は、最大関数群Ｆ＿Ｍａｘから呼び出し関係にある関数群の集合Γから、関数群Ｆ＿Ｒｅｌを取り除いて、集合Γを更新する工程である。この工程は、残りメモリ領域サイズ判断工程Ｓ４００５０９の結果によらず行われる。なお、メモリバンクＭの残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）より呼出し頻度最大関数群Ｆ＿Ｒｅｌが大きい場合には、その関数群については、メモリ領域への割当が行われないが、メモリ割当が終了したかを判断する工程Ｓ４００５１２を経由して、メモリバンク認識工程Ｓ４００５１３から残りメモリ領域サイズ更新工程Ｓ４００５１６によってメモリ領域への割当が行われる。
【００６８】
以上より、関数群Ｆ＿Ｍａｘから呼び出し関係にある関数群Ｆの集合Γが空でない場合、メモリ領域割り当てルーチンＳ４００５０７にエントリし、集合Γを更新する工程Ｓ４００５１１を終了すると、フローチャートの集合Γが空集合か否かを判断する工程Ｓ４００５０６に進む。
【００６９】
図１９は、第３実施例に係わるメモリ割当工程Ｓ４００５により関数を各メモリバンクに割り当てる具体例を示す。
図１９Ａから図１９Ｃは、第３実施例に係わるメモリ割当工程Ｓ４００５を開始するにあたり、合計コードサイズ計算工程Ｓ３７０３、呼出し頻度計算工程Ｓ３７０４を行った結果をそれぞれ示す。
図１９Ａにおいて、呼出し元の関数を親関数として列挙し、それらに対する呼び出し先の関数と、呼出し回数に基づいた重み付けを列挙した左表を示す。また、一つの呼び出し先の関数に対し、呼出し元の関数が２以上ある場合に、重み付けに基づいて呼出し元の関数を一つに選択した状態の親関数と、その呼出し先の関数を列挙した右表を示す。左表と、右表を比較してみると、関数Ｂ４は、親関数Ａ２、Ａ３双方の呼出し先の関数となっているが、重み付けに従って、親関数Ａ２が関数Ｂ４の親関数として選択したことがわかる。
図１９Ｂにおいて、関数群名Ｆ＿Ａ１、Ｆ＿Ａ２、Ｆ＿Ａ３及び関数群それぞれの代表関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１、代表関数Ａ２、代表関数Ａ３が記載された表が示されている。関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１は再帰呼び出し関係にあるため、一つの関数と見なされた関数である。なお、図１９Ｂに示す表には、さらに、代表関数から子孫関係にある関数（代表関数からの呼び出し先の関数及びそれらからさらに呼び出される関数）と、代表関数とその子孫関数の合計コードサイズとが、記載されている。
図１９Ｃは呼出し頻度算出工程Ｓ３７０４により計算された関数群間の呼出し頻度を示す表である。呼出し頻度は２つの異なる関数群については、片方の関数群に属する関数が呼び出し元となり、もう一方の関数群に属する関数が呼び出し先となる呼出しが発生する頻度を表す。そこで、関数群Ｆ＿Ａ１、Ｆ＿Ａ２、Ｆ＿Ａ３から呼出し関係にある関数群Ｆ＿Ａ１、Ｆ＿Ａ２、Ｆ＿Ａ３に対する呼出し頻度を表した結果が、図１９Ｃに示されている。関数群Ｆ＿Ａ１に属する関数が呼出し元あるいは呼出し先となる呼出しの、それぞれ呼出し先、呼出し元は、メイン関数または関数群Ｆ＿Ａ１に属する関数であるため、関数群Ｆ＿Ａ１と関数群Ｆ＿Ａ１、Ｆ＿Ａ２、Ｆ＿Ａ３との呼出し頻度は０である。一方、関数群Ｆ＿Ａ２に属する関数が呼出し元あるいは呼出し先となる呼出しにおいては、関数Ａ３（関数群Ｆ＿Ａ３に属する）が関数Ｂ４（関数群Ａ２に属する）を頻度２０で呼び出しており、それ以外については呼出し先または呼出し元は、メイン関数または関数群Ｆ＿Ａ２に属する関数であるため、関数群Ｆ＿Ａ２と関数群Ｆ＿Ａ１、Ｆ＿Ａ２との呼出し頻度は０であるが、関数群Ｆ＿Ａ３との呼出し頻度は２０である。同様に、関数群Ｆ＿Ａ３と関数群Ｆ＿Ａ１、Ｆ＿Ａ３に属する関数を呼出し頻度は０であるが、関数群Ｆ＿Ａ２との呼出し頻度は２０である。
図１９Ｄは電力制御有りメモリ割当工程Ｓ４００５を行った結果を示す。図１９Ｄにおいて、メイン関数４００５１７、関数Ａ１を含む一つとみなされた関数（関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１）を代表関数とする関数群（Ｆ＿Ａ１）４００５１８、関数Ａ２を代表関数とする関数群（Ｆ＿Ａ２）４００５１９、関数Ａ３を代表関数とする関数群（Ｆ＿Ａ３）４００５２０、メモリバンク４００５２１、メモリバンク４００５２２、メモリバンク４００５２３、及び、メモリバンク４００５２４を示す。
【００７０】
メモリバンク４００５２１、４００５２２、４００５２３の容量は４ＫＢであり、電力制御ありのメモリバンクである。また、メモリバンク４００５２１、４００５２２、４００５２３のメモリ領域は、アクセスするためのアドレスが連続している。
メイン関数４００５１７は、関数Ａ１、関数Ａ２、関数Ａ３を呼び出す関数である。また、関数の出入りで電力を制御する方式では電力削減効果が減少するため、メイン関数４００５１７は、電力制御無しのメモリバンク４００５２４へ割り当てられている。以下、図１９Ｄに示す電力制御有りメモリ割当工程Ｓ４００５を行った結果が得られるまで、図１８Ａ、Ｂのフローチャートにそって各工程の具体例を示す。
まず、残りメモリサイズ変数初期化工程Ｓ４００５０１を行う。メモリサイズ変数初期化の対象は、メモリバンク４００５２１、４００５２２、４００５２３、４００５２４であり、初期化の結果それぞれのメモリバンクの残りメモリ領域サイズｍ＿ｒｅｓｔ［Ｍ］は、４ＫＢ、４ＫＢ、４ＫＢ、０ＫＢとなる。すでに、メモリバンク４００５２４にはメイン関数４００５１７が配置され、電力制御なしのメモリバンクとして使用することが決定してているため、メモリバンク４００５２４の残りメモリ領域サイズは０である。
関数Ａ１を含む一つとみなされた関数（関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１）を代表関数とする関数群Ｆ＿Ａ１（４００５１８）は、関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１、関数Ｃ２を含む。関数群Ｆ＿Ａ１（４００５１８）の合計コードサイズは５ＫＢである。
関数Ａ２を代表関数とする関数群Ｆ＿Ａ２（４００５１９）は、関数Ａ２、関数Ｂ２、関数Ｂ３、関数Ｂ４を含む。関数群Ｆ＿Ａ２（４００５１９）の合計コードサイズは４ＫＢである。
関数Ａ３を代表関数とする関数群Ｆ＿Ａ３（４００５２０）は、関数Ａ３、関数Ｂ５、関数Ｂ６を含む。関数群Ｆ＿Ａ３（４００５２０）は３ＫＢである。
【００７１】
次いで、合計コードサイズ最大の関数群を選択する工程Ｓ４００５０２を行う。その結果、関数群Ｆ＿Ａ１（４００５１８）が関数群Ｆ＿Ｍａｘとして選択される。
次いで、最大関数群を配置判断する工程Ｓ４００５０３を行う。その結果、関数群Ｆ＿Ａ１（４００５１８）は５ＫＢであるため、どのメモリバンクにも配置できないと判断される。  次いで、メモリバンク認識工程Ｓ４００５１３を行う。その結果、各メモリバンクの残り容量、残りメモリ領域サイズｍ＿ｒｅｓｔ［Ｍ］は４ＫＢ、４ＫＢ、４ＫＢ、０ＫＢであると認識するとともに、メモリバンク４００５２１、４００５２２、４００５２３、４００５２４の順に並べ、Ｍ１、Ｍ２、Ｍ３、Ｍ４と名付ける。
次いで、最大関数を割当可能なメモリバンクを認識する工程Ｓ４００５１４を行う。その結果、Ｍ１の残りメモリサイズｍ＿ｒｅｓｔ［Ｍ１］、Ｍ２の残りメモリ領域サイズｍ＿ｒｅｓｔ［Ｍ２］を加算すると８ＫＢとなり、関数群Ｆ＿Ａ１（４００５１８）の容量ｓ（Ｆ＿Ｍａｘ）以上となるため、最小のｍは２である。
次いで、メモリ領域割当工程Ｓ４００５１５を行う。その結果、関数群Ｆ＿Ａ１（４００５１８）の内、４ＫＢ分は、メモリバンク４００５２１に割り当てられ、残りの１ＫＢ分はメモリバンク４００５２２に割り当てられる。
次いで、残りメモリ領域サイズ更新工程Ｓ４００５１６を行う。メモリバンク４００５２１、４００５２２、４００５２３、４００５２４の残りのメモリ容量は０ＫＢ、３ＫＢ、４ＫＢ、０ＫＢと更新される。
次いで、呼び出し頻度認識により集合Γを生成する工程Ｓ４００５０５を行う。その結果、関数群Ｆ＿Ｍａｘから呼び出し頻度が０以上の関数群Ｆの集合Γは、図１９Ｃより空となる。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５０６を行う。その結果、集合Γは空であるから、メモリ割当が終了したかを判断する工程Ｓ４００５１２に進む。その結果、関数群Ｆ＿Ａ２（４００５１９）、関数群Ｆ＿Ａ３（４００５２０）の割当が未了なため、最大コードサイズの関数群を選択する工程Ｓ４００５０２に進む。
次いで、最大コードサイズの関数群を選択する工程Ｓ４００５０２を行う。その結果、関数群Ｆ＿Ａ２（４００５１９）が関数群Ｆ＿Ｍａｘとして選択される。
次いで、最大コードサイズの関数群を配置判断する工程Ｓ４００５０３を行う。その結果、関数群Ｆ＿Ａ２（４００５１９）の合計コードサイズと、メモリバンク４００５２３のメモリ領域は４ＫＢと同一であり、関数群Ｆ＿Ａ２（４００５１９）はメモリバンク４００５２３からはみ出すことなく割り当てられる。そこで、残りメモリサイズ変数を更新する工程Ｓ４００５０４へ進む。
次いで、残りメモリサイズ変数を更新する工程Ｓ４００５０４を行う。その結果、メモリバンク４００５２１、４００５２２、４００５２３、４００５２４の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）は、０ＫＢ、３ＫＢ、０ＫＢ、０ＫＢと更新される。
次いで、呼び出し頻度認識により集合Γを生成する工程Ｓ４００５０５を行う。関数群Ｆ＿Ａ２（４００５１９）をＦ＿Ｍａｘとした場合、現時点で最大関数群Ｆ＿Ｍａｘから呼び出し頻度が０でない関数群Ｆあって、メモリバンク領域に割り当てられていない関数群Ｆとして関数群Ｆ＿Ａ３が存在するため、関数群Ｆ＿Ａ３を含む集合Γを生成する。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５０６を行う。呼び出し頻度が０でない関数が集合Γに存在するので、メモリ領域割当ルーチンＳ４００５０７へ進む。
次いで、メモリ領域割当ルーチンＳ４００５０７中の呼出し頻度最大の関数Ｆ＿Ｒｅｌを選択する工程Ｓ４００５０８を行う。その結果、関数群Ｆ＿Ａ３を関数群Ｆ＿Ｒｅｌと設定する。
次いで、残りメモリ領域サイズ判断工程Ｓ４００５０９を行う。メモリバンク４００５２３の残りメモリ領域サイズ３ＫＢが関数群Ｆ＿Ｒｅｌの合計コードサイズ３ＫＢ以上であるので、残りメモリ領域に割り当てる工程Ｓ４００５１０に進む。
次いで、集合Γ更新工程Ｓ４００５１１を行う。集合Γから、関数群Ｆ＿Ｆｅｌ、すなわち、関数群Ｆ＿Ａ３を除く。
次いで、メモリ領域割当ルーチンＳ４００５０７を抜けて、集合Γが空集合か否かを判断する工程Ｓ４００５０６を行う。その結果、集合Γは空であるため、メモリ割当が終了したかを判断する工程Ｓ４００５１２に進む。その結果、関数群関数群Ｆ＿Ａ３（４００５２０）がメモリバンクに割当られていないため、最大コードサイズの関数群を選択する工程Ｓ４００５０２に進む。
次いで、最大コードサイズの関数群を選択する工程Ｓ４００５０２を行う。その結果、関数群Ｆ＿Ａ３（４００５２０）が関数群Ｆ＿Ｍａｘとして選択される。
次いで、最大コードサイズの関数群を配置判断する工程Ｓ４００５０３を行う。その結果、関数群Ｆ＿Ａ３（４００５２０）の合計コードサイズは３ＫＢ、メモリバンク４００５２２の残りメモリ領域は３ＫＢなので、関数群Ｆ＿Ａ３（４００５２０）はメモリバンク４００５２３からはみ出すことなく割り当てられる。そこで、残りメモリサイズ変数を更新する工程Ｓ４００５０４へ進む。
次いで、残りメモリサイズ変数を更新する工程Ｓ４００５０４を行う。その結果、メモリバンク４００５２１、４００５２２、４００５２３、４００５２４の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）は、０ＫＢ、０ＫＢ、０ＫＢ、０ＫＢと更新される。
次いで、呼び出し頻度認識により集合Γを生成する工程Ｓ４００５０５を行う。関数群Ｆ＿Ａ３（４００５２０）をＦ＿Ｍａｘとした場合、現時点で関数群Ｆ＿Ｍａｘからの呼び出し頻度が０でない関数群Ｆであって、メモリバンク領域に割り当てられていない関数群Ｆはないので、集合Γは空に設定される。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５０６を行う。集合Γは空であるため、メモリ割当が終了したかを判断する工程Ｓ４００５１２に進む。
次いで、メモリ割当が終了したかを判断する工程Ｓ４００５１２を行う。メモリ領域に割り当てられていない関数群が、合計コードサイズテーブル中に存在しないため、実施例３のメモリ割当工程Ｓ４００５を終了する。
【００７２】
以上より、メモリシステム５０において、実施例３のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施した場合、関数Ａ１＊Ｂ１＊Ｃ１＊Ｄ１を代表関数とする関数群Ｆ＿Ａ１（４００５１８）はメモリバンク４００５２１のメモリ領域より大きいため、メモリバンク４００５２１とメモリバンク４００５２２の２つのメモリバンクに集中して割り当てられる。また、関数Ａ２を代表関数とする関数群Ｆ＿Ａ２の合計コードサイズ量は、メモリバンク４００５２３のメモリ領域より小さいため、その関数群Ｆ＿Ａ２に含まれる関数は、一つのメモリバンク４００５２３に集中して配置される。さらに、関数Ａ３を代表関数とする関数群Ｆ＿Ａ３の合計コードサイズ量は、メモリバンク４００５２２の残りのメモリ領域より小さいため、その関数群Ｆ＿Ａ３に含まれる関数は、メモリバンク４００５２３に集中して配置される。
そこで、メモリシステム５０に含まれるＣＰＵによって、関数の呼出し状態に応じて、メモリバンクの電源状態を制御すれば、通常電力供給状態とするメモリバンク数を減少させることができる。
【実施例４】
【００７３】
実施例３で示したプログラムは、最大関数群をメモリバンクに割り当てた後、新たなメモリバンクを使用しない範囲で、呼出し関係のある関数群（最大関数群との呼出し頻度が０より真に大きい関数群）を割り当てる方式に基づくものである。この方式は、複数のメモリバンクに割り当てられる関数群を削減できるという利点があるものの、この方式によりいくつかの関数群を割り当てた結果、各メモリバンクとも残りメモリ領域サイズは少量となり、残りの関数群が多数のメモリバンクに割り当てられるという状況が発生しうる。この状況となり、かつその関数群が少数の関数で構成されており（そのため、該当関数群の各関数に割り当てられるメモリバンク数も多くなる）、それらの関数の実行時間がほかの関数に比べて長い場合には、消費電力の削減効果が減少する場合もあり得る。
図２０は実施例３に示したプログラムを実施した場合に、消費電力の削減効果が減少する例を示す。
メモリ割当工程Ｓ４００５を実行するにあたり、合計コードサイズ計算工程Ｓ３７０３、呼出し頻度計算工程Ｓ３７０４において、図１９Ａから図１９Ｃに示すような結果が得られているとする。ただし、図１９Ｂに示す関数群Ｆ＿Ａ１の合計コードサイズは２．５ＫＢ、関数群Ｆ＿Ａ２の合計コードサイズは７ＫＢ、関数群Ｆ＿Ａ３の合計コードサイズは３ＫＢであるとする。また、図１９Ｄに示されている実施例３のメモリシステム５０の構成要素に加えて、メモリシステム５０の構成要素として、メモリ容量１ＫＢのメモリバンク４００５２５が追加されている。さらに、図２０に係わるメモリシステム５０においては、メモリバンク４００５２５にはメイン関数４００５１７が配置されており、メモリバンク４００５２４はメモリバンク４００５２３とアドレスが連続したメモリ領域を有している。
メイン関数４００５１７、関数群Ｆ＿Ａ１（４００５１８）、関数群Ｆ＿Ａ２（４００５１９）、関数群Ｆ＿Ａ３（４００５２０）、メモリバンク４００５２１、メモリバンク４００５２２、及び、メモリバンク４００５２３については、図１９Ｄと同様なものであるので、説明を省略する。
図２０に係わるメモリシステム５０において、実施例３にメモリ割り当て工程Ｓ４００５を行うと、まず、最大関数群として関数群Ｆ＿Ａ２（４００５１９）が設定され、メモリバンク４００５２１、４００５２２に割り当てられる。このとき、メモリバンク４００５２１、４００５２２の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）はそれぞれ、０ＫＢ、１ＫＢとなる。最大関数群Ｆ＿Ｍａｘ（＝関数群Ｆ＿Ａ２）から呼び出し頻度が０でない関数群であって、メモリバンク領域に割り当てられていない関数群として、関数群Ｆ＿Ａ３（４００５２０）が存在するが、メモリバンク４００５２２の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）は１ＫＢであり、関数群Ｆ＿Ａ３（４００５２０）の合計コードサイズ（３ＫＢ）より小さいため、関数群Ｆ＿Ａ３はこの時点ではメモリバンクに割り当てられない。
続いて、最大関数群として関数群Ｆ＿Ａ３（４００５２０）が設定され、メモリバンク４００５２３に割り当てられる。このときのメモリバンク４００５２３の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）は１ＫＢとなる。最大関数群Ｆ＿Ｍａｘ（＝関数群Ｆ＿Ａ３）から呼び出し頻度が０でない関数群であって、メモリバンク領域に割り当てられていない関数群は存在しないため、再び最大関数群の選択を実行する。
続いて、最大関数群として関数群Ｆ＿Ａ１（４００５１８）が設定されるが、この時点でのメモリバンク４００５２１、４００５２２、４００５２３、４００５２４の残りメモリ領域サイズ（ｍ＿ｒｅｓｔ［Ｍ］）はそれぞれ、０ＫＢ、１ＫＢ、１ＫＢ、１ＫＢである。したがって、関数群Ｆ＿Ａ１（４００５１８）は、メモリバンク４００５２２、４００５２３、４００５２４にわたって配置されることとなる。
ここでもし、関数群Ｆ＿Ａ１（４００５１８）の関数を実行している間、メモリバンク４００５２２、４００５２３、４００５２４が通常電力供給状態となってしまうと、通常電力供給状態のメモリバンクが多くなるため、関数群Ｆ＿Ａ１（４００５１８）の関数実行中の消費電力は高くなる。さらに、関数群Ｆ＿Ａ１（４００５１８）の全プログラム中における実行時間の比率が高いと、プログラム全体の消費電力も高くなる。
このように、実施例１のメモリシステム５０において、以下に示す実施例４のプログラムを実行して、メモリバンクに空きが発生しないように割り当てることが考えられる。
実施例４において示すメモリ割当工程Ｓ４１０５を、実施例２のメモリ割当工程Ｓ３７中の電力制御有りメモリ割当部Ｓ３７０５に代えて、実行することにより、
実施例３のプログラムの場合、多数のメモリバンクに割り当てられ、かつその多数のメモリバンクに割り当てられた関数群の実行時間が長くなる場合に、消費電力を削減することができる。
図２１Ａは、実施例４に係わるメモリ割当工程Ｓ４１０５を示す。実施例４のメモリ割当工程Ｓ４１０５の実行は、スタート以下、次の工程を行うことにより実行される。
まず、残りメモリ領域サイズ変数初期化工程Ｓ４１０５２１を行う。残りメモリ領域サイズ変数初期化工程Ｓ４１０５２１は残りメモリ領域サイズを記憶する変数ｍ＿ｒｅｓｔの値を初期化する工程である。すなわち、電力制御を行わないメモリバンクＭに対しては、ｍ＿ｒｅｓｔ（ｍ＿ｒｅｓｔ［Ｍ］）の値を０、それ以外のメモリバンクＭに対するｍ＿ｒｅｓｔの値（ｍ＿ｒｅｓｔ［Ｍ］）をメモリバンクＭの容量と初期化する。
次いで、合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２を行う。合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２は、合計コードサイズテーブルを走査し、合計コードサイズ最大の関数群を選び、最大関数群Ｆ＿Ｍａｘとして設定する。
次いで、メモリバンク認識工程Ｓ４１０５２３を行う。メモリバンク認識工程Ｓ４１０５２３は残りメモリ領域サイズが大きい順にＭ１、Ｍ２、・・・、Ｍｎ（ｎは正の整数）と名付ける工程である。なお、残りメモリ領域サイズが同一値であるメモリバンクが存在する場合は、同一値であるメモリバンク同士、同一値であるメモリバンクの次に残りメモリ領域サイズが多いメモリバンク、および、同一値であるメモリバンクの次に残りメモリ領域サイズが少ないメモリバンクが、可能な限りアドレスが連続するように名付けると、より望ましい結果となる。
次いで、最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４を行う。なお、最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４は、図２１を用いて別途説明する。
【００７４】
次いで、呼び出し頻度認識により集合Γを生成する工程Ｓ４１０５２５を行う。呼び出し頻度認識により集合Γを生成する工程Ｓ４１０５２５は最大関数群Ｆ＿Ｍａｘから呼び出し関係にあり、かつ、メモリバンクへ未割り当ての関数群Ｆを集合Γとする工程である。なお、最大関数群Ｆ＿Ｍａｘから呼び出し関係にあることの判定は、最大関数群Ｆ＿Ｍａｘからの呼び出し頻度Ｑ（Ｆ＿Ｍａｘ，Ｆ）が０より真に大きいことにより行う。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５２６を行う。集合Γが空であるときは、メモリ割当が終了したかを判断する工程Ｓ４１０５２７に進む。一方、集合Γが空でないときは、呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４１０５２８へ進む。
次いで、呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４１０５２８を行う。呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４１０５２８は、集合Γに含まれる関数の内、最大関数群Ｆ＿Ｍａｘとの呼出し頻度最大の関数群を選び関数群Ｆ＿Ｒｅｌとして設定する工程である。但し、同一呼出し頻度の関数群が複数存在する場合は、呼出し回数最大関数群Ｆ＿Ｒｅｌの候補となる関数群の内、コードサイズが最大となる関数群を選択する。
次いで、関数群Ｆ＿Ｒｅｌについてメモリバンクに割り当てるルーチンＳ４１０５２９を行う。なお、関数群Ｆ＿Ｒｅｌをメモリバンクに割り当てるルーチンＳ４１０５２９は、図２１Ｂを用いて別途説明する。
【００７５】
次いで、集合Γ更新工程Ｓ４１０５３０を行う。集合Γ更新工程Ｓ４１０５３０は、最大関数群Ｆ＿Ｍａｘから呼び出し関係にある関数群の集合Γから、関数群Ｆ＿Ｒｅｌを除いて、集合Γを更新する工程である。
次いで、集合Γが空集合か否かを判断する工程Ｓ４１０５２６に戻る。集合Γが空になるまで、呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４１０５２８から集合Γ更新工程Ｓ４１０５３０までの工程を繰り返す。次いで、集合Γが空になると、メモリ割当が終了したかを判断する工程Ｓ４１０５２７へ進む。
【００７６】
メモリ割当が終了したかを判断する工程Ｓ４１０５２７は、最大関数群Ｆ＿Ｍａｘに含まれる関数及び最大関数群Ｆ＿Ｍａｘと呼び出し関係にある関数群に含まれる関数をメモリ領域に割り当てた後、さらに合計コードサイズテーブル中にメモリ領域に割り当てられていない他の関数群が存在するか否かを判断する工程である。ここで、合計コードサイズテーブル中にさらに関数群が存在し、その関数群について、メモリ領域の割当が終了していないと判断する場合は、合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２を行う。
一方、合計コードサイズテーブル中に関数が存在しない場合は、実施例４に係わるメモリ割当工程Ｓ４１０５を終了する。
【００７７】
図２１Ｂは、最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４を説明する図である。最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４は以下の工程を含む。
まず、関数群すべてを割り当て可能であるメモリバンクを認識する工程Ｓ４１０５２４ａを行う。関数群すべてを割り当て可能であるメモリバンクを認識する工程Ｓ４１０５２４ａは、メモリバンク認識工程Ｓ４１０５２３により認識された、アドレスが連続するＭ１、Ｍ２、・・・、Ｍｎについて、１番目からｍ番目（ｍはｎ≧ｍとなる正の整数）までのメモリ領域を加算した結果得られるメモリ領域が、最大関数群Ｆ＿Ｍａｘのコードサイズ以上となる最小のｍを検出する工程である。
次いで、メモリ領域割当工程Ｓ４１０５２４ｂを行う。メモリ領域割当工程Ｓ４１０５２４ｂはＭ１からＭｍまでのメモリバンクに、最大関数群Ｆ＿Ｍａｘを割り当てる工程である。
次いで、残りメモリ領域サイズ更新工程Ｓ４１０５２４ｃを行う。残りメモリ領域サイズ更新工程Ｓ４１０５２４ｃは、ｍ＿ｒｅｓｔ［Ｍｉ］＝０  （ｉ＝１、・・・、ｍ−１）とするとともに、ｍ＿ｒｅｓｔ［Ｍｍ］＝（ｍ＿ｒｅｓｔ［Ｍ１］＋ｍ＿ｒｅｓｔ［Ｍ２］＋・・・＋ｍ＿ｒｅｓｔ［Ｍｍ］）−ｓ（Ｆ＿Ｍａｘ）とする工程である。
なお、上記の最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４は、最大関数群Ｆ＿Ｍａｘについて処理をするルーチンであったが、関数群Ｆ＿Ｒｅｌをメモリバンクに割り当てるルーチンＳ４１０５２９は、最大関数群Ｆ＿Ｍａｘのかわりに、関数群Ｆ＿Ｒｅｌについて、関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４と同様の工程を行うルーチンである。
【００７８】
図２２は、実施例４に係わるメモリ割当工程Ｓ４１０５により関数を各メモリバンクに割り当てる具体例を示す。
メモリ割当工程Ｓ４１０５を実行するにあたり、合計コードサイズ計算工程Ｓ３７０３、呼出し頻度計算工程Ｓ３７０４において、図１９Ａから図１９Ｃに示すような結果が得られているとする。ただし、図１９Ｂに示す関数群Ｆ＿Ａ１の合計コードサイズは２．５ＫＢ、関数群Ｆ＿Ａ２の合計コードサイズは７ＫＢ、関数群Ｆ＿Ａ３の合計コードサイズは３ＫＢであるとする。また、図１９Ｄに示されている実施例３のメモリシステム５０の構成要素に加えて、メモリシステム５０の構成要素として、メモリ容量１ＫＢのメモリバンク４００５２５が追加されている。さらに、実施例４に係わるメモリシステム５０においては、メモリバンク４００５２５にはメイン関数４００５１７が配置されており、メモリバンク４００５２４はメモリバンク４００５２３とアドレスが連続したメモリ領域を有している。
メイン関数４００５１７、関数群Ｆ＿Ａ１（４００５１８）、関数群Ｆ＿Ａ２（４００５１９）、関数群Ｆ＿Ａ３（４００５２０）、メモリバンク４００５２１、メモリバンク４００５２２、及び、メモリバンク４００５２３については、図１９Ｄと同様なものであるので、説明を省略する。
上記のメモリシステム５０において、実施例４に係わるメモリ割当工程Ｓ４１０５を行うと、合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２の実行により、まず、関数群Ｆ＿Ａ２が合計コードサイズ最大の関数群Ｆ＿Ｍａｘとして選択される。
次いで、最大関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４が実行されると、メモリバンク４００５２１、４００５２２のメモリ容量を加算した結果、最大関数群Ｆ＿Ｍａｘのコードサイズを超えることが検出される（関数群すべてを割当可能であるメモリバンクを認識する工程Ｓ４１０５２４ａ）。次いで、メモリバンク４００５２１、４００５２２、４００５２３、４００５２４の残りメモリ領域サイズが更新される（残りのメモリ領域の更新工程Ｓ４１０５２４ｃ）。
次いで、呼び出し頻度認識工程Ｓ４１０５２５を行う。その結果、未だメモリバンクへの割当が行われておらず、関数群Ｆ＿Ｍａｘ（現時点で関数群Ｆ＿Ａ２）から呼び出し頻度が０でない、関数群Ｆ＿Ａ３（４００５２０）を含む集合Γが設定される。
次いで、集合Γが空集合か否かを判断する工程Ｓ４００５２６を行う。集合Γは空でないので、呼出し頻度最大の関数群Ｆ＿Ｒｅｌを選択する工程Ｓ４１０５２８を実行し、関数群Ｆ＿Ａ３を関数群Ｆ＿Ｒｅｌとし、メモリバンクに割り当てるルーチンＳ４１０５２９を行う。その結果、関数群Ｆ＿Ａ３はメモリバンク４００５２３に割当られる。
次いで、再び、集合Γが空集合か否かを判断する工程Ｓ４００５２６を行う。集合Γは空なので、関数群はすべて割当済かを判断する工程Ｓ４１０５２７を実行する。メモリバンクに割り当てられていない関数群Ｆ＿Ａ１（４００５１８）が存在するので、合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２に進む。
次いで、合計コードサイズ最大の関数群を選択する工程Ｓ４１０５２２を行い関数群Ｆ＿Ａ１（４００５１８）を関数群Ｆ＿Ｍａｘとして選択する。
次いで、メモリバンク認識工程Ｓ４１０５２３、関数群Ｆ＿Ｍａｘをメモリバンクに割り当てるルーチンＳ４１０５２４を行い、メモリバンク４００５２３、４００５２４に現時点での関数群Ｆ＿Ｍａｘである関数群Ｆ＿Ａ１（４００５１８）が割り当てられる。
次いで、呼び出し頻度認識工程Ｓ４１０５２５を行う。合計コードサイズ最大の関数群Ｆ＿Ｍａｘを関数群Ｆ＿Ａ１とする場合、図１９Ｃより、集合Γは空となる。
次いで、再び、集合Ｆが空集合か否かを判断する工程Ｓ４００５２６を行う。集合Ｆは空なので、関数群はすべて割当済かを判断する工程Ｓ４１０５２７を実行する。すべての関数群はメモリバンクに割当られていると判断されるので、実施例４のメモリ割当工程Ｓ４１０５は終了する。
【００７９】
以上より、メモリシステム５０において、実施例４のプログラムに含まれるコードに記憶領域を割り当てる割当方法を実施した場合、以下のような動作が行われる。まず、最大関数群（未だメモリバンクへの割当が行われていない関数群のうち合計コードサイズ量が最大であるもの）と、その最大関数から呼び出し関係にある未だメモリバンクへの割当が行われていない関数群の合計コードサイズ量より、メモリ領域が大きくなる複数のメモリバンクを検出する。その後、順次、最大関数群と、その最大関数群から呼び出し関係にある未だメモリバンクへの割当が行われていない関数群が、上記で検出した複数のメモリバンクに配置される。
そうすると、メモリシステム５０に含まれるＣＰＵによって、最大関数及びその最大関数から呼出される関係にある関数について処理が行われる場合、通常電力供給状態とするメモリバンクを容易に特定することができる。その結果、余分なメモリバンクを通常電力状態とすることがなくなるため、通常電力供給状態とするメモリバンク数を減少させることができる。従って、メモリバンクが消費する電力を削減することができる。
また、アドレスが連続していないメモリ領域に配置されていると、通常電力供給状態と、そうでない状態とを切り替える場合に、ＣＰＵは、数回の命令を必要とする。しかし、最大関数及びその最大関数から呼出される関係にある関数が、アドレスが連続しているメモリ領域に配置されている場合は、通常電力供給状態と、そうでない状態とを切り替える場合に、ＣＰＵは、一括して１回の命令で行える。従って、アドレスが連続している場合は、ＣＰＵの負荷を軽減でき、ＣＰＵの消費電力を削減することができる。
【００８０】
以下に本発明の特徴を付記する。
（付記１）
プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、
前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、
前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てるコード割当工程と、
を備えることを特徴とするプログラムに含まれるコードをメモリ領域に割り当てる割当方法。
（付記２）
前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、一つの前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる付記１記載の割当方法。
（付記３）
前記コード割当工程において、前記プロセッサは、前記再帰呼出し部を表す前記プログラムに含まれるコードを、一体として、アドレスが連続する２以上の前記メモリバンクに割り当てることを特徴とする、プログラムに含まれるコードをメモリ領域に割り当てる付記１記載の割当方法。
（付記４）
関数を表すコードを含むプログラムを読込むことによって、動作可能なプロセッサと、
前記プロセッサからの制御によって、供給される電圧状態を独立して切替可能なメモリバンクと、を備え、
前記プロセッサは
前記プロセッサに読み込まれた前記プログラム中の関数間の呼び出し関係を抽出する機能と、
前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする機能と、
前記再帰呼出し部を表す前記プログラムに含まれるコードを、供給される電圧状態を独立して切替可能なメモリバンクに、前記プロセッサが、割り当てる機能と、を有することを特徴とするメモリシステム。
（付記５）
前記メモリバンクの電圧状態を、前記プロセッサからの命令を受けて、設定する制御レジスタと、
前記制御レジスタからの信号を受けて、前記メモリバンクの電圧状態を制御する電源制御回路と、をさらに備えることを特徴とする付記４記載のメモリシステム。
（付記６）
プロセッサとメモリバンクを備えるメモリシステムにおいて、
ソースプログラムを前記プロセッサに読み込みこませ、前記ソースプログラムをアセンブリコード又はオブジェクトに変換するコンパイル工程と、
メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトを前記プロセッサが検出する制御位置算出工程と（制御位置算出工程Ｓ２）、
前記プロセッサに読み込まれたプログラム中の関数間の呼び出し関係を、プロセッサが抽出する工程と、
前記関数間の呼出し関係に基づく、関数の呼び出し連鎖に沿って、前記呼出し関係を追跡していき、一度呼出された関数が再度呼出された場合に、一度目の呼出しから２度目の呼出しまでの間に経由した関数群を再帰呼出し部とする再帰呼出し抽出工程と、
前記プロセッサが、前記プログラムに含まれる、前記再帰呼出し部を表すアセンブリコード又はオブジェクトを、供給される電圧状態を独立して切替可能な前記メモリバンクに割り当て、前記再帰呼出し部を表すアセンブリコード又はオブジェクトを格納した場所を示す前記メモリバンクのアドレスをメモリマップ情報として出力するコード割当工程と、
前記メモリマップ情報に基づいて前記メモリバンクのオンオフを制御するアセンブリコード又はオブジェクトの位置を修正する工程と、を備えることを特徴とする電源制御入り実行プログラムの生成方法。
【産業上の利用可能性】
【００８１】
本発明によれば、プログラムコードに含まれるコードを記憶領域に割り当てる方法であって、記憶領域の電力状態の制御により消費電力削減させ得る、記憶領域の割り当て状態を実現する方法及びその方法を実行するメモリシステムを提供することができる。
【符号の説明】
【００８２】
１０  メモリユニット
１１、１２、１３、１４、１５  メモリバンク
２０  プロセッサ
３０  制御レジスタ群
４０  バス
４５  電源線
４６  電源制御装置
５０  メモリシステム
６１  関数サイズ情報
６２  プログラム
６３  再帰呼出し処理済み静的コールグラフ
６４  再帰呼出し処理済関数サイズ情報
６５  関数縮退情報
６６  メモリマップ情報
Ｓ３１  呼出関係抽出
Ｓ３２Ａ  再帰呼出抽出
Ｓ３２Ｂ  再帰処理済み静的コールグラフ作成
Ｓ３３  再帰呼出縮退
Ｓ３４  メモリ割当
【図１】
0005598375.tif 000002
【図２】
0005598375.tif 000003
【図３】
0005598375.tif 000004
【図４】
0005598375.tif 000005
【図５】
0005598375.tif 000006
【図６】
0005598375.tif 000007
【図７】
0005598375.tif 000008
【図８】
0005598375.tif 000009
【図９】
0005598375.tif 000010
【図１０】
0005598375.tif 000011
【図１１】
0005598375.tif 000012
【図１２】
0005598375.tif 000013
【図１３】
0005598375.tif 000014
【図１４】
0005598375.tif 000015
【図１５】
0005598375.tif 000016
【図１６】
0005598375.tif 000017
【図１７】
0005598375.tif 000018
【図１８Ａ】
0005598375.tif 000019
【図１８Ｂ】
0005598375.tif 000020
【図１９Ａ】
0005598375.tif 000021
【図１９Ｂ】
0005598375.tif 000022
【図１９Ｃ】
0005598375.tif 000023
【図１９Ｄ】
0005598375.tif 000024
【図２０】
0005598375.tif 000025
【図２１Ａ】
0005598375.tif 000026
【図２１Ｂ】
0005598375.tif 000027
【図２２】
0005598375.tif 000028