(57)【要約】      （修正有）【課題】プロセッサ上で実行されるプログラムの実行速度を低下させることなく、そのプログラムの実行時におけるプロセッサ内の各リソースの制御を行ってプロセッサの低消費電力化を可能とするプログラムの実行モジュールを生成するコンパイラ及びコンパイル方法を提供する。【解決手段】コンパイラ４１は、電源の供給を制御可能な１以上のリソースを有するプロセッサにおいて実行されるプログラムをコンパイルする。コンパイラ４１は、プログラムのソースコード４２をコンパイルするコンパイラ５１と、コンパイルされて生成されたアセンブラコード５６と、タスク情報テーブル４３とから、各リソースの使用あるいは不使用の情報を含むリソーステーブル５７を作成するリソーステーブル作成部５２と、リソーステーブル５７に基づいてリソース制御ルーチンを生成するコア制御ルーチン生成部５３と、リンカ５４とを有する。【選択図】図４
2010039785.tif 000002
【特許請求の範囲】
【請求項１】
電源の供給を制御可能な１以上のリソースを有するプロセッサにおいて実行されるプログラムをコンパイルするコンパイラであって、
前記プログラムのソースコードをコンパイルするコンパイル部と、
該コンパイル部によりコンパイルされて生成されたアセンブラコードと、前記プログラムについて予め記憶された各リソースの使用状態を示すプログラム情報とから、前記各リソースの使用あるいは不使用の情報を含むリソーステーブルを作成するリソーステーブル作成部と、
前記リソーステーブルに基づいて、前記プログラムについて前記プロセッサのリソースを制御するリソース制御ルーチンを生成するリソース制御ルーチン生成部と、
前記コンパイル部によりコンパイルされて生成されたオブジェクトコードに、前記リソース制御ルーチン生成部により生成された前記リソース制御ルーチンを追加するリンク部とを有することを特徴とするコンパイラ。
【請求項２】
前記各リソースは、前記プロセッサに含まれるレジスタ、ローカルメモリ、命令キャッシュ及びデータキャッシュ及びコプロセッサの少なくとも１つであることを特徴とする請求項１に記載のコンパイラ。
【請求項３】
前記リソーステーブルにおける、前記プログラムの実行ファイル名、ローカルメモリサイズ、命令キャッシュサイズ、及びデータキャッシュサイズの各情報は、前記プログラム情報から取得され、前記プロセッサに含まれる前記レジスタ及び前記コプロセッサの各情報は、前記アセンブラコードから取得されることを特徴とする請求項２に記載のコンパイラ。
【請求項４】
前記プロセッサは、動作クロックを可変に制御可能なプロセッサであって、前記プログラム情報が、前記プロセッサの動作クロックの情報を含む場合、前記リソース制御ルーチンは、前記動作クロックを変更する処理を含むことを特徴とする請求項１に記載のコンパイラ。
【請求項５】
電源の供給を制御可能な１以上のリソースを有するプロセッサにおいて実行されるプログラムをコンパイルするコンパイル方法であって、
前記プログラムのソースコードをコンパイルし、
コンパイルされて生成されたアセンブラコードと、前記プログラムについて予め記憶された各リソースの使用状態を示すプログラム情報とから、前記各リソースの使用あるいは不使用の情報を含むリソーステーブルを作成し、
前記リソーステーブルに基づいて、前記プログラムについて前記プロセッサのリソースを制御するリソース制御ルーチンを生成し、
コンパイルされて生成されたオブジェクトコードに、生成された前記リソース制御ルーチンを追加することを特徴とするコンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ及びコンパイル方法に関し、特に、電源の供給を制御可能な１以上のリソースを有するプロセッサにおいて実行されるプログラムをコンパイルするコンパイラ及びコンパイル方法に関する。
【背景技術】
【０００２】
プロセッサは、コプロセッサ、レジスタ、ローカルメモリ、キャッシュメモリ等の各種リソースを有する。プロセッサは、それらのリソースを利用しながら、プログラムを実行する。しかし、プロセッサ上でプログラムが動作されるとき、これらの全てのリソースが常に使用されるとは限らない。使用されないリソースに対しても電力が供給されている状態は消費電力の無駄となる。
【０００３】
そのため、このような消費電力の無駄を無くすために、種々の技術が提案されている。  
例えば、高速なコアCPU上で、高速実行が要求されないプログラムが動作されるときには、コアCPUの動作クロックを低くすることで消費電力を抑えるようにする技術が提案されている（例えば、特許文献１参照）。あるいは、コンパイルした後のプログラムに対して最低動作電圧を求めて、プロセッサをその最低動作電圧で動作させる技術も提案されている（例えば、特許文献２参照）。
【０００４】
さらに、消費電力を抑えるための制御を行いたい場合に、プログラムの書き手であるプログラマが、明示的にプログラム内にコアCPUのリソースを制御する処理を記述する方法もある。例えば、アプリケーションプログラムの命令列中に、コアCPU中の電源供給を停止可能なリソースについて細かく制御するためのコードが追加される技術がある（例えば、特許文献３参照）。
【０００５】
しかし、このような技術を用いた場合、プログラマの意図しないリソース制御命令がプログラム中に挿入されるために、所望の機能を実現するプログラム自体の実行速度が低下するという問題があった。
【０００６】
さらに、このような技術を用いた場合、リソース制御命令がプログラムに含まれるため、そのプログラムのデバッグ時に、そのプログラムの可読性が低下するという問題もある。
【特許文献１】特開2003-271267号公報
【特許文献２】特開2003-202942号公報
【特許文献３】特開2004-318502号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
そこで、本発明は、プロセッサ上で実行されるプログラムの実行速度を低下させることなく、そのプログラムの実行時におけるプロセッサ内の各リソースの制御を行ってプロセッサの低消費電力化を可能とするプログラムの実行モジュールを生成するコンパイラ及びコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の一態様によれば、電源の供給を制御可能な１以上のリソースを有するプロセッサにおいて実行されるプログラムをコンパイルするコンパイラであって、前記プログラムのソースコードをコンパイルするコンパイル部と、該コンパイル部によりコンパイルされて生成されたアセンブラコードと、前記プログラムについて予め記憶された各リソースの使用状態を示すプログラム情報とから、前記各リソースの使用あるいは不使用の情報を含むリソーステーブルを作成するリソーステーブル作成部と、前記リソーステーブルに基づいて、前記プログラムについて前記プロセッサのリソースを制御するリソース制御ルーチンを生成するリソース制御ルーチン生成部と、前記コンパイル部によりコンパイルされて生成されたオブジェクトコードに、前記リソース制御ルーチン生成部により生成された前記リソース制御ルーチンを追加するリンク部とを有するコンパイラを提供することができる。
【発明の効果】
【０００９】
本発明のコンパイラ及びコンパイル方法によれば、プロセッサ上で実行されるプログラムの実行速度を低下させることなく、そのプログラムの実行時におけるプロセッサ内の各リソースの制御を行ってプロセッサの低消費電力化を可能とするプログラムの実行モジュールを生成することができる。
【発明を実施するための最良の形態】
【００１０】
以下、図面を参照して本発明の実施の形態を説明する。 
（構成）
まず、図１に基づき、本実施の形態に係わるプロセッサの構成を説明する。図１は、本実施の形態に係わるプロセッサの構成を示すブロック図である。図１に示すプロセッサ１は、２つのコアCPU（以下、単にコアともいう）２A,２Bを有するマルチコアシステムである。
【００１１】
なお、ここでは、プロセッサ１は、複数のコアとして２つのコアを有するが、プログラムが実行されるものであれば、１CPUのものでもよいし、３以上のCPUのものでもよい。
【００１２】
コア２Aは、コアCPUであるCPU３Aと、ALU（Arithmetic and Logic Unit）４Aと DSP(Digital Signal Processor)５Aの２つのコプロセッサを含む。さらに、コア２Aは、電源制御部６Aと、クロック制御部７Aも含む。CPU３Aと、ALU４Aと、DSP５Aは、バス１５Aで接続されている。  
CPU３Aは、図示しない演算部が使用するレジスタ群１１A、それぞれがキャッシュメモリである命令キャッシュ１２A及びデータキャッシュ１３A、及び、ローカルメモリ１４Aを含む。
【００１３】
コア２Bは、コアCPUであるCPU３Bと、ALU（Arithmetic and Logic Unit）４Bと DSP(Digital Signal Processor)５Bの２つのコプロセッサを含む。さらに、コア２Bは、電源制御部６Bと、クロック制御部７Bも含む。CPU３Bと、ALU４Bと、DSP５Bは、バス１５Bで接続されている。  
CPU３Bは、図示しない演算部が使用するレジスタ群１１B、それぞれがキャッシュメモリである命令キャッシュ１２B及びデータキャッシュ１３B、及び、ローカルメモリ１４Bを含む。
【００１４】
２つのコア２Aと２Bは、バス１５を介して接続されている。  
なお、本実施の形態では、コア２Aと２Bは同じ構成であるので、以下、コア２Aの構成と動作を説明し、コア２Bの構成と動作については異なる点について主として説明する。
【００１５】
電源制御部６Aは、CPU３Aからの指示に基づいて、レジスタ群１１Aの全体あるいは一部のレジスタに対する電源Vの供給を制御するための電源制御信号VCを出力する。さらに、電源制御部６Aは、CPU３Aからの指示に基づいて、命令キャッシュ１２A、データキャッシュ１３A、ローカルメモリ１４A、ALU４A、並びにDSP５Aに対する電源Vの供給を制御するための電源制御信号VCも出力する。
【００１６】
クロック制御部７Aは、CPU３Aからの指示に基づいて、CPU３Aの動作クロック数を変更するクロック制御信号FCを、CPU３Aの動作周波数設定部（図示せず）に出力する。CPU３Aは、動作周波数設定部に設定されたクロック制御信号FCに応じた動作周波数で動作する。  
以上のように、プロセッサ１は、電源の供給を制御可能な１以上のリソースを有するプロセッサであって、かつ各コアCPUの動作クロックも可変に制御可能なプロセッサである。
【００１７】
図２は、プロセッサ１がプログラムを実行する場合のシステム構成を説明するための図である。
【００１８】
プロセッサ１上でプログラムが実行されるとき、ハードウエア部分（H/W）は、図１に示すプロセッサ１であり、そのプロセッサ１には、OSとして、ここではリアルタイムOS（以下、RTOSという）２１が搭載され、そのRTOS２１上で、アプリケーションプログラム等のプログラム２２が実行される。プログラム２２は、複数のタスク１〜ｎを含む。
【００１９】
ここでは、特に消費電力低減のための後述するような制御が行われていなければ、全てのリソースに電源が供給されて、CPU３A,3Bの動作クロックは、２００MHｚであるとする。このような動作状態を、以下、標準状態という。
【００２０】
プログラマがこれらのｎ個のタスクを記述し、各タスクがコンパイルされて実行ファイルが生成される。
【００２１】
図３と図４は、本実施の形態に係るコンパイラを説明するための図である。  
本実施の形態に係るコンパイラは、パーソナルコンピュータ（PC）等の情報処理装置上で実行されるソフトウエアプログラムである。図３は、そのコンパイラを実行する情報処理装置の構成例を示す図である。図３には、情報処理装置としてのPCが、CPU３１ａ等を含む本体３１と、グラフィカルユーザインターフェース（GUI）を提供する表示装置３２と、後述するコンパイラ、各種データ等を記憶する記憶装置３３とを有して構成されている。図３では、記憶装置３３には、コンパイラ４１，プログラム２２のソースコード４２，タスク情報テーブル４３，プログラム２２の実行ファイル４４が少なくとも記憶される。
【００２２】
図４は、本実施の形態に係るコンパイラの構成を説明するための構成図である。本実施の形態に係るコンパイラ４１には、コンパイルするべきプログラム２２のソースコード４２が入力される。ソースコード４２は、上述したｎ個のタスクを含む。コンパイラ４１は、さらにタスク情報テーブル４３からプログラム情報を入力して、最終的には、実行ファイル４４を出力する。プログラム情報は、プログラム２２の各タスクについての各リソースの使用状態を示す情報であり、プログラマにより、記憶装置３３の所定の記憶領域のタスク情報テーブル４３に予め記述され、設定されている。また、各タスクの実行モジュールである実行ファイル４４は、生成されると、記憶装置３３の他の所定の記憶領域に記憶される。
【００２３】
コンパイラ４１は、コンパイル部であるコンパイラ５１と、リソーステーブル作成部５２と、コア制御ルーチン生成部５３と、リンカ５４とを含む。
【００２４】
はじめに、コンパイラ４１の全体の処理の流れについて説明する。ソースコード４２は、コンパイラ５１に入力される。コンパイラ５１は、ソースコード４２をコンパイルして、オブジェクトファイル５５を生成し、かつアセンブラコード５６も生成して出力する。すなわち、コンパイラ５１は、ソースコード４２の記述内容だけから、オブジェクトコードのオブジェクトファイル５５と、アセンブラコード５６とを生成する。ここで、コンパイラ５１は、字句解析、構文解析、最適化、コード生成といった公知の処理を含んで、ソースコード４２に対してコンパイルを行うコンパイル部である。
【００２５】
コンパイラ５１によるコンパイル後に、リソーステーブル作成処理が、リソーステーブル作成部５２により行われる。リソーステーブル作成部５２は、タスク情報テーブル４３と、アセンブラコード５６とからリソーステーブル５７を作成する。タスク情報テーブル４３は、プログラム２２の各タスクについての各リソースの使用状態を示すタスク情報、すなわちプログラム情報、を含む。リソーステーブル作成部５２の処理内容については、後述する。
【００２６】
リソーステーブル作成部５２によるリソーステーブル作成処理後に、コア制御ルーチン生成処理が、コア制御ルーチン生成部５３により行われる。コア制御ルーチン生成部５３は、リソーステーブル５７に基づいて、リソース制御ルーチンであるコア制御ルーチンを生成するリソース制御ルーチン生成部である。リソーステーブル５７は、各リソースの使用あるいは不使用の情報を含む。コア制御ルーチン生成部５３の処理内容についても、後述する。
【００２７】
リソース制御ルーチン生成部であるコア制御ルーチン生成部５３によるコア制御ルーチン生成処理後に、リンク処理が、リンカ５４により行われる。リンカ５４は、オブジェクトファイル５５のオブジェクトコードと、コア制御ルーチン生成部５３により生成されたコア制御ルーチンとをリンクして、実行モジュールを生成して、実行ファイル４４として出力する。
【００２８】
図５は、タスク情報テーブル４３の構成の例を示すテーブルである。タスク情報テーブル４３には、各タスクを含むプログラム２２の情報がプログラマ等により予め記述されて、記憶装置３３に記憶されて設定される。タスク情報テーブル４３に含まれるタスク情報は、プロセッサ１において実行させる各タスクの使用状態を示すプログラム情報であり、予め設定された各タスク固有の実行ファイル名等の情報が記述される。
【００２９】
具体的には、タスク情報テーブル４３には、各タスクについて、実行ファイル名、ローカルメモリサイズ、命令キャッシュサイズ、データキャッシュサイズ、動作クロック、及びコア指定、の各タスク情報が設定される。例えば、図５の場合、タスク１は、実行ファイル名は「Prog1.exe」であり、ローカルメモリサイズは１６KB（キロバイト）であり、命令キャッシュサイズは０KBであり、データキャッシュサイズは０KBであり、動作クロックは１００MHzであり、コア指定は、そのプログラムを実行するコアがコア１であることが示されている。
【００３０】
また、タスク２は、実行ファイル名は「Prog2.exe」であり、ローカルメモリサイズは３２KB（キロバイト）であり、命令キャッシュサイズは８KBであり、データキャッシュサイズは８KBであり、動作クロックは２００MHzであり、コア指定は、そのプログラムを実行するコアがコア２であることが示されている。ここでは、コア１を指定することは、コア２Aを指定することを意味し、コア２を指定することは、コア２Bを指定することを意味する。  
プログラマが各タスクを記述するときに、各タスクがどのような処理を実行するかを知っているので、プログラマは、図５に示すような各タスク情報を、タスク情報テーブル４３に設定することができる。
【００３１】
次に、リソーステーブル作成部５２の処理内容について説明する。図６は、リソーステーブル作成部５２の処理の流れの例を示すフローチャートである。図６の処理は、本体３１のCPU３１ａによって実行される。
【００３２】
まず、コンパイラ５１へ与えられるコマンドのオプション情報から、実行ファイル名を抽出する（ステップS1）。このステップS1で抽出された実行ファイル名を実行ファイルAとする。ステップS1は、ユーザがコンパイルの対象とした実行ファイル名を特定する処理である。ステップS1における処理は、コンパイラ５１へのコマンドをテキスト解析することによって、コマンド中のオプション情報の部分に含まれる、実行ファイル名Aを抽出することができる。
【００３３】
次に、CPU３１ａは、使用するレジスタの情報を、アセンブラコード５６から抽出する（ステップS2）。このステップS2の処理も、アセンブラコード５６をテキスト解析して、アセンブラコード５６中に、レジスタを指定する字句を特定して抽出することによって行われる。
【００３４】
アセンブラコード５６には、アセンブラコードレベルで命令とレジスタが記述されており、レジスタ番号も特定できるので、コアが持つレジスタのうち、例えば０番レジスタ(＄０)、１番レジスタ(＄１)、・・・、ｍ番レジスタ(＄ｍ)のどのレジスタを使用するかを特定することができる。よって、ここでは、レジスタを示す記号「＄」を検出することによって、使用するレジスタを抽出することができる。
【００３５】
さらに、CPU３１ａは、使用するコプロセッサ命令を、アセンブラコード５６から抽出する（ステップS3）。上述したように、アセンブラコード５６には、アセンブラコードレベルで命令とレジスタが記述されているので、使用する命令がコプロセッサ固有のものであれば、どのコプロセッサを使用するかを特定することができる。よって、このステップS3の処理も、アセンブラコード５６をテキスト解析して、アセンブラコード５６中に、コプロセッサに対する所定の命令の示す字句を抽出することによって行われる。
【００３６】
そして、CPU３１ａは、使用するコプロセッサを、抽出したコプロセッサ命令から特定する（ステップS4）。このステップS4の処理は、抽出したコプロセッサ命令が、どのコプロセッサに対する命令かを判定することによって行われる。ここでは、ALU４Aに対する命令と、DSP５Aに対する命令は、異なっているので、命令がどのコプロセッサに対する命令かは判定することができる。
【００３７】
次に、変数Nが１にセットされる（ステップS5）。  
そして、CPU３１ａは、記憶装置３３のタスク情報テーブル４３を参照して、Ｎ番目のタスク情報を読み込む（ステップS6）。はじめは、N=1なので、１番目のタスク情報が読み出される。
【００３８】
１番目のタスク情報は、タスク情報が登録されたタスク情報テーブル４３の最初のデータ、例えば、図５のタスク１の情報である。
【００３９】
CPU３１ａは、読み出したN番目の、ここでは１番目の、タスク情報の実行ファイル名を抽出する（ステップS7）。このステップS7で抽出された実行ファイル名を実行ファイルBとする。
【００４０】
次に、CPU３１ａは、ステップS1で抽出した実行ファイル名Aと、ステップS7で読み出した実行ファイル名Bとを比較し両者が一致しているか否かを判定する（ステップS8）。
【００４１】
実行ファイル名Aと実行ファイル名Bとが一致している場合は、ステップS8でYESとなり、そのN番目のタスク情報に、ステップS2で抽出したレジスタとステップS4で特定したコプロセッサの情報を追加した情報を、リソース情報として、リソーステーブル５７（図７）に追加登録する（ステップS9）。そして、処理は、終了する。
【００４２】
なお、本実施の形態では、タスク情報テーブル４３とは別にリソーステーブル５７を設けているが、タスク情報テーブル４３に、レジスタの情報と、コプロセッサの情報を追加して、リソーステーブルとしてもよい。
【００４３】
また、実行ファイル名Aと実行ファイル名Bとが一致しない場合は、ステップS8でNOとなり、そのNに１を加算する（ステップS10）。はじめは、N=1なので、Nは２となる。
【００４４】
そして、Nが最大数よりも大きいか否かが判定される（ステップS11）。
【００４５】
この最大数は、タスク情報テーブル４３に登録されているタスク情報の数であり、タスク情報テーブル４３を参照することによって、得ることができる。
【００４６】
Nが最大数よりも大きくない場合は、ステップS11でNOとなり、処理は、ステップS6に戻る。これにより、２番目のタスク情報について、実行ファイル名Bを抽出して、実行ファイル名Aとの比較を行って、２番目のタスク情報から、リソース情報を生成できるかが判定される。もしも、２番目のタスク情報についても、実行ファイル名Aと一致するファイル名Bが無ければ、ステップS8でNOとなり、３番目以降のタスク情報について、上述した処理を繰り返す。
【００４７】
以上により、コンパイルしたプログラムについて、タスク情報テーブル４３に登録されたタスク情報があれば、そのタスク情報を利用して、リソース情報が生成される。
【００４８】
そして、Nが最大数よりも大きい場合は、ステップS11でYESとなり、（N+1）番目のタスク情報として、実行ファイルAをタスク情報テーブル４３に追加する（ステップS12）。
【００４９】
そして、（N+1）番目のタスク情報に、ステップS2で抽出したレジスタとステップS4で特定したコプロセッサの情報を追加した情報を、リソース情報として、リソーステーブル５７に追加する（ステップS13）。そして、処理は、終了する。
【００５０】
ステップS12とS13においてタスク情報とリソース情報が追加された場合、タスク情報のうち、ローカルメモリサイズ、命令キャッシュサイズ、データキャッシュサイズ、動作クロック、コア指定の情報は未登録である。未登録であることは、表示装置３２の画面上への表示等により、ユーザに告知され、ユーザは、その未登録の情報を、リソーステーブル５７に追加して登録する。
【００５１】
以上の処理により、リソース情報を含むリソーステーブル５７が生成される。  
図７は、リソーステーブル５７の構成の例を示す図である。リソーステーブル５７は、タスク情報テーブル４３から抽出したタスク情報５７ａと、アセンブラコード５６から抽出した情報５７ｂとを含む。
【００５２】
情報５７ａは、実行ファイル名、ローカルメモリサイズ、命令キャッシュサイズ、データキャッシュサイズ、動作クロック、及びコア指定、の各情報を含む。  
情報５７ｂは、レジスタ群１１A中で使用するレジスタ、及び各コプロセッサの使用の有無、の各情報を含む。
【００５３】
以上のように、アセンブラコード５６から取得した情報と、前述のタスク情報を組み合わせた情報が、リソーステーブル５７のリソース情報であり、リソーステーブル５７に登録されたリソース情報は、各タスクについて、各リソースの使用あるいは不使用の情報を含む情報である。
【００５４】
次に、リソース制御ルーチン生成部であるコア制御ルーチン生成部５３の処理内容について説明する。  
コア制御ルーチン生成部５３は、リソーステーブル５７を参照して、そのプログラムすなわちタスクが必要とする各リソースをチェックし、使用しないリソースを特定する。そして、コア制御ルーチン生成部５３は、その使用しない１以上のリソースを低消費電力状態に移行するための処理を行う関数を、プログラムの開始関数（startup関数）、すなわちスタートアップルーチンとして、生成する。さらに、コア制御ルーチン生成部５３は、上記の開始関数によって低消費電力状態に移行された各リソースの状態を、標準状態に戻すための処理を行う関数を、プログラムの終了関数（exit関数）、すなわち、exitシステムコールとして、生成する。上述したように、標準状態とは、全てのリソースに電源が供給されて、CPU３A,3Bの動作クロックは、２００MHzである動作状態をいう。コア制御INとコア制御OUTは、当該タスクのコア毎の各リソースを制御するリソース制御ルーチンである。
【００５５】
以上のようにして、実行ファイルAについて、リソース情報が生成されると、その実行ファイルAについて、コア制御ルーチンが生成される。図８と図９は、コア制御ルーチン生成部５３の処理内容の例を示すフローチャートである。  
CPU３１ａは、まず、実行ファイル名を抽出する（ステップS21）。ステップS21の処理は、上述したステップS1と同様の処理である。すなわち、コンパイラ５１へ与えられるコマンドのオプション情報から、実行ファイル名が抽出される。  
次に、CPU３１ａは、該当する実行ファイル名のタスクについてリソース情報を、リソーステーブル５７を参照してから得る（ステップS22）。
【００５６】
そして、CPU３１ａは、そのタスクの実行ファイルについて、標準のスタートアップ関数に相当する関数（以下、コア制御INという）を、生成する（ステップS23）。  
さらに、CPU３１ａは、そのタスクの実行ファイルについて、カーネルにexitシステムコールを発行する関数（以下、コア制御OUTという）を、生成する（ステップS24）。
【００５７】
次に、参照したリソーステーブル５７の情報中のローカルメモリに関する情報から、ローカルメモリの使用量、すなわちローカルメモリサイズ、が０以上か否かが判定される（ステップS25）。  
ローカルメモリの使用量が０の場合は、ステップS25でNOとなり、開始関数であるコア制御INに、ローカルメモリへの電源の供給をオフにする命令が追加される（ステップS26）。
【００５８】
続いて、終了関数であるコア制御OUTに、ローカルメモリへの電源の供給をオンにする命令が追加される（ステップS27）。
【００５９】
図７のタスク１の場合は、ローカルメモリサイズは、１６であるので、ステップS25でYESとなり、処理は、ステップS28に移行する。
【００６０】
次に、参照したリソーステーブル５７の情報中の命令キャッシュに関する情報から、命令キャッシュの使用量、すなわち命令キャッシュサイズ、が０以上か否かが判定される（ステップS28）。
【００６１】
命令キャッシュの使用量が０の場合は、ステップS28でNOとなり、開始関数であるコア制御INに、命令キャッシュへの電源の供給をオフにする命令が追加される（ステップS29）。
【００６２】
続いて、終了関数であるコア制御OUTに、命令キャッシュへの電源の供給をオンにする命令が追加される（ステップS30）。
【００６３】
図７のタスク１の場合は、命令キャッシュサイズは、０であるので、ステップS28でNOとなり、処理は、ステップS29に移行する。
【００６４】
次に、参照したリソーステーブル５７の情報中のデータキャッシュに関する情報から、データキャッシュの使用量、すなわちデータキャッシュサイズ、が０以上か否かが判定される（ステップS31）。
【００６５】
データキャッシュの使用量が０の場合は、ステップS31でNOとなり、開始関数であるコア制御INに、データキャッシュへの電源の供給をオフにする命令が追加される（ステップS32）。
【００６６】
続いて、終了関数であるコア制御OUTに、データキャッシュへの電源の供給をオンにする命令が追加される（ステップS33）。
【００６７】
図７のタスク１の場合は、データキャッシュサイズは、０であるので、ステップS31でNOとなり、処理は、ステップS32に移行する。
【００６８】
次に、図９に移り、参照したリソーステーブル５７の情報中の使用するレジスタに関する情報から、使用しないレジスタが１つでもあるか否かが判定される（ステップS34）。
【００６９】
使用しないレジスタが１つでもある場合は、ステップS34でYESとなり、開始関数であるコア制御INに、不使用レジスタへの電源の供給をオフにする命令が追加される（ステップS35）。
【００７０】
続いて、終了関数であるコア制御OUTに、不使用レジスタへの電源の供給をオンにする命令が追加される（ステップS36）。
【００７１】
図７のタスク１の場合は、不使用レジスタは、＄０，＄１，＄２，＄１４であるので、ステップS34でYESとなり、処理は、ステップS35に移行する。ステップS35では、これらの不使用レジスタへの電源の供給をオフにする命令がコア制御INに追加され、ステップS36では、これらの不使用レジスタへの電源の供給をオンにする命令がコア制御OUTに追加される。
【００７２】
次に、参照したリソーステーブル５７の情報中の動作クロックに関する情報から、動作クロックの設定値が標準値、ここでは２００MHｚ、と異なるか否かが判定される（ステップS37）。
【００７３】
動作クロックの設定値が標準値と異なる場合は、ステップS37でYESとなり、開始関数であるコア制御INに、動作クロックを設定値に変更する命令が追加される（ステップS38）。
【００７４】
続いて、終了関数であるコア制御OUTに、動作クロックを標準値に戻す命令が追加される（ステップS39）。
【００７５】
図７のタスク１の場合は、動作クロックは１００MHzであり、標準値である２００MHzと異なるので、ステップS37でYESとなり、処理は、ステップS38に移行する。ステップS38では、動作クロックを１００MHzにする命令がコア制御INに追加され、ステップS39では、動作クロックを標準値である２００MHzにする命令がコア制御OUTに追加される。
【００７６】
そして、処理は、開始関数をコンパイルして、開始関数のオブジェクトコードのオブジェクトファイルを生成する処理に移行する（ステップS40）。  
ステップS26,S29,S32,S35,S38において、各リソースへの電源をオフにする命令が追加されていれば、その追加された命令も含む開始関数がコンパイルされてオブジェクトファイルが生成される。
【００７７】
さらに、終了関数をコンパイルして、終了関数のオブジェクトコードのオブジェクトファイルを生成する（ステップS41）。  
ステップS27,S30,S33,S36,S39において、各リソースへの電源をオンにする命令が追加されていれば、その追加された命令も含む終了関数がコンパイルされてオブジェクトファイルが生成される。
【００７８】
なお、コア制御ルーチン生成部５３は、リソーステーブル５７を参照して、指定されたコアについて、図８と図９における開始関数と終了関数をコンパイルしてオブジェクトファイルを生成する。
【００７９】
図８と図９の処理において生成された開始関数と終了関数の各オブジェクトコードは、図４に示すように、リンカ５４において結合され、そのタスクについてのオブジェクトコードが、実行ファイル４４として出力される。
【００８０】
図１０は、リンカ５４の処理内容を説明するための図である。開始関数のオブジェクトコード６１は、オブジェクトファイル５５のオブジェクトコードの先頭に付加される。終了関数のオブジェクトコード６２は、オブジェクトファイル５５のオブジェクトコードの後に付加される。すなわち、実行ファイル４４は、開始関数のオブジェクトコードがタスクのオブジェクトコードの前に追加され、終了関数のオブジェクトコードがタスクのオブジェクトコードの後に追加されたものである。
【００８１】
以上のように、１つのタスクのソースコードが入力されると、コンパイルされてオブジェクトコードすなわちオブジェクトファイル５５と、アセンブラコード５６とが生成される。予め用意されたタスク情報と、アセンブラコード５６とからリソース情報が生成され、リソーステーブル５７に登録される。
【００８２】
そのリソーステーブル５７を参照して、そのタスクのオブジェクトファイル５５について、各リソースへの電源の供給の要否と、動作クロックの設定変更の要否が判定される。本実施の形態では、プロセッサ１は、マルチコアプロセッサであるので、各リソースは、各コアのリソースである。各コアの各リソースへの電源の供給の停止、または動作クロックの設定値の変更がある場合は、開始関数に、その停止と変更に関する命令が追加され、終了関数に、その開始関数で停止されたリソースあるいは変更された動作クロックを標準状態に戻す命令が追加される。開始関数と終了関数がコンパイルされ、それぞれのオブジェクトコードが生成される。
【００８３】
オブジェクトファイル５５のオブジェクトコードに、開始関数と終了関数のオブジェクトコードが、それぞれ前と後に追加され、そのタスクについての実行ファイル４４が生成される。
【００８４】
以上の処理が、各タスクについて行われ、RTOS２１上で実行可能な複数のタスクからなるプログラム２２が生成される。
【００８５】
次にプロセッサ１における各リソースの動作状態の変化について説明する。  
図１１は、２つのタスクがRTOS２１上で実行される場合におけるタスクの起動を説明するための図である。ここでは、タスク１がコア１上で実行され、タスク２がコア２上で実行される。
【００８６】
図１１に示すように、プロセッサ１は、いずれのタスクも実行していない状態SS1から、タスク１が実行され、状態SS2に移行する。その後、タスク１の実行が終了すると、プロセッサ１は、いずれのタスクも実行していない状態SS3に移行する。
【００８７】
次に、プロセッサ１は、いずれのタスクも実行していない状態SS3から、タスク２を実行する状態SS4に移行し、その後、タスク２の実行が終了すると、いずれのタスクも実行していない状態SS5に移行する。
【００８８】
図１２から図１４は、図１１の各状態を説明するための図である。  
図１２は、いずれのタスクも実行していない状態SS1,SS3,SS5を示す図である。図１２の状態は、標準状態であり、各コアは、標準状態で動作している、あるいは動作可能となっている。
【００８９】
図１３は、タスク１を実行中の状態SS2を示す図である。タスク１が起動されると、Prog1.exeが実行される。図７に示すように、タスク１は、コア１を使用する。そして、タスク１は、コア１において、命令キャッシュ１２A、データキャッシュ１３A、ALU４A、DSP５Aは使用しない。タスク１は、コア１のCPUの動作クロックは、１００MHzであり、使用するレジスタは、＄０，＄１，＄２，＄１４である。
【００９０】
よって、タスク１のProg1.exeの開始処理では、タスク１の実行前に、これらの使用しないリソースへの電源の供給は停止する開始関数が実行される。  
開始関数が実行されると、コア１のCPU３Aが、開始関数に記述されたリソースへの電源供給を制御するルーチンに従って、使用しないリソースへの電源供給を停止するように、電源制御部６Aを制御する。また、同様に、コア１のCPU３Aが、開始関数に記述された動作クロックでの動作が行われるように、クロック制御部７Aを制御する。
【００９１】
その結果、図１３に示すように、使用しないリソースには、電源が供給されていない。図１３では、電源の供給されていないリソースには、斜線が付加されている。このとき、コア１のCPUの動作周波数は、１００MHzに設定される。
【００９２】
Prog1.exeの終了処理では、タスク１の実行後に、終了関数が実行されて、各リソースに電源が供給され、プロセッサ１は、図１２の状態に戻る。このとき、CPUの動作周波数は、２００MHzに戻る。  
終了関数が実行されると、コア１のCPU３Aが、終了関数に記述されたリソースへの電源供給を制御するルーチンに従って、使用しないリソースへの電源供給を再開するように、電源制御部６Aを制御する。また、同様に、コア１のCPU３Aが、標準状態の動作クロックでの動作が行われるように、クロック制御部７Aを制御する。
【００９３】
また、タスク２が起動されると、Prog2.exeが実行され、図１４の状態になる。図１４は、タスク２を実行中の状態SS4を示す図である。図７に示すように、タスク２は、コア２を使用する。そして、タスク２は、コア２において、DSP５Bは使用しない。タスク２の実行において、使用するレジスタは、＄０，＄１，＄２，＄３，＄４である。
【００９４】
よって、タスク１の場合と同様に、タスク２のProg2exeの開始処理では、タスク２の実行前に、これらの使用しないリソースへの電源の供給は停止する開始関数が実行される。その結果、図１４に示すように、使用しないリソースには、電源が供給されていない。図１４では、電源の供給されていないリソースには、斜線が付加されている。このとき、コア２のCPUの動作周波数は、２００MHzである。
【００９５】
タスク１の場合と同様に、Prog2exeの終了処理では、タスク２の実行後に、終了関数が実行されて、各リソースに電源が供給され、プロセッサ１は、図１２の状態に戻る。
【００９６】
以上のように、各タスクの実行において使用しないリソースは、タスクの実行前の開始処理において、電源の供給が停止される。そのタスクの実行が終了すると、タスクの実行後の終了処理において、電源の供給停止が解除される。
【００９７】
以上のように、本実施の形態に係るコンパイラは、各タスクの開始処理と終了処理に、各リソースへの電源の供給を制御する命令を自動的に生成して組み入れる。よって、プロセッサ１上で実行される各タスク自体の実行速度が低下することなく、かつそのプログラムの可読性も低下することがない。
【００９８】
すなわち、本実施の形態に係るコンパイラは、プログラムのソースコードから実行ファイルを生成するときに、コアのリソース状態を制御する処理をプログラムの開始位置に自動で追加し、また、コアのリソース状態を元に戻す処理をプログラムの終了位置に自動で追加する。その結果、生成された実行ファイルを実行すると、コアを低消費電力状態でかつ実行速度を落とさずにプログラムを実行できる。
【００９９】
また、上述したコンパイラを用いれば、プログラムの書き手が用意したソースコード、およびソースコードをコンパイルして得られる命令列には一切変更することなく、プログラムが使用しないコアのリソースを自動的に低消費電力状態に移行して、プログラムの終了時にコアのリソース状態を自動的に元に戻すことができる。よって、プログラムのデバッグ時における、可読性は低下しない。
【０１００】
なお、上述した例では、１つのタスクについて、１つの実行ファイルが生成されるが、１つのタスクには、複数のプログラムファイルが含まれていてもよい。
【０１０１】
本明細書における各「部」は、実施の形態の各機能に対応する概念的なもので、必ずしも特定のハードウエアやソフトウエア・ルーチンに１対１には対応しない。従って、本明細書では、以下、実施の形態の各機能を有する仮想的回路ブロック（部）を想定して実施の形態を説明した。また、本実施の形態における各手順の各ステップは、その性質に反しない限り、実行順序を変更し、複数同時に実行し、あるいは実行毎に異なった順序で実行してもよい。
【０１０２】
なお、以上説明した動作を実行するプログラムは、コンピュータプログラム製品として、フレキシブルディスク、ＣＤ−ＲＯＭ等の可搬媒体や、ハードディスク等の記憶媒体に、その全体あるいは一部が記録され、あるいは記憶されている。そのプログラムがコンピュータにより読み取られて、動作の全部あるいは一部が実行される。あるいは、そのプログラムの全体あるいは一部を通信ネットワークを介して流通または提供することができる。利用者は、通信ネットワークを介してそのプログラムをダウンロードしてコンピュータにインストールしたり、あるいは記録媒体からコンピュータにインストールすることで、容易に本発明のコンパイラを実現することができる。
【０１０３】
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【図面の簡単な説明】
【０１０４】
【図１】本発明の実施の形態に係わるプロセッサの構成を示すブロック図である。
【図２】本発明の実施の形態に係わるプロセッサがプログラムを実行する場合のシステム構成を説明するための図である。
【図３】本発明の実施の形態に係わるコンパイラを実行する情報処理装置の構成例を示す図である。
【図４】本実施の形態に係るコンパイラの構成を説明するための構成図である。
【図５】本実施の形態に係るタスク情報テーブルの構成の例を示すテーブルである。
【図６】本実施の形態に係るリソーステーブル作成部の処理の流れの例を示すフローチャートである。
【図７】本実施の形態に係るリソーステーブルの構成の例を示す図である。
【図８】本実施の形態に係るコア制御ルーチン生成部の処理内容の例を示すフローチャートである。
【図９】本実施の形態に係るコア制御ルーチン生成部の処理内容の例を示すフローチャートである。
【図１０】本実施の形態に係るリンカの処理内容を説明するための図である。
【図１１】本発明の実施の形態に係わる、２つのタスクがRTOS上で実行される場合におけるタスクの起動を説明するための図である。
【図１２】図１１における、いずれのタスクも実行していない状態SS1,SS3,SS5を示す図である。
【図１３】図１１における、タスク１を実行中の状態SS2を示す図である。
【図１４】図１１における、タスク２を実行中の状態SS4を示す図である。
【符号の説明】
【０１０５】
１  プロセッサ、２A,２B  コア、３A,３B  CPU、４A,４B  ALU、５A,５B  DSP、６A,６B  電源制御部、７A、７B  クロック制御部、１５，１５A、１５B  バス、２１  RTOS、２２  プログラム、３１  本体、３２  表示装置、３３  記憶装置、４１  コンパイラ、４３  タスク情報テーブル、５７  リソーステーブル
【図１】
2010039785.tif 000003
【図２】
2010039785.tif 000004
【図３】
2010039785.tif 000005
【図４】
2010039785.tif 000006
【図５】
2010039785.tif 000007
【図６】
2010039785.tif 000008
【図７】
2010039785.tif 000009
【図８】
2010039785.tif 000010
【図９】
2010039785.tif 000011
【図１０】
2010039785.tif 000012
【図１１】
2010039785.tif 000013
【図１２】
2010039785.tif 000014
【図１３】
2010039785.tif 000015
【図１４】
2010039785.tif 000016