(57)【特許請求の範囲】
【請求項１】
少なくとも１つの命令コードにプログラムの開始点からのデッドライン（完了期限）が指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御装置であって、
前記動作スピードの制御に先だって、
前記プログラムを実行し、
計算量予測データ生成部が、
あらかじめ指定された複数の各タイミングで、前記プログラムがその時点でどのサブルーチン呼び出しを行っているかを観測する状態観測手段を用い、
状態遷移グラフを生成し、
前記状態観測手段によって観測した、サブルーチン呼び出しの各々に対し、状態遷移グラフの各状態から次のデッドラインに至るまでの計算量予測データを生成し、
前記計算量予測データを前記サブルーチン呼び出しの各々に対応させてデータ保持部に保持させ、
前記マイクロプロセッサの動作スピードの制御を伴って前記プログラムを実行する際に、
前記あらかじめ指定された複数の各タイミングで、
前記状態観測手段によりどのサブルーチン呼び出しを行っているかを観測し、
前記データ保持部に保持された該サブルーチン呼び出しに対応した前記計算量予測データから、残りの予測計算量を取得する予測計算量取得手段を起動し、
次のデッドラインに至るまでの残り時間を、その時点までの経過時間と該デッドラインに指定されている時間との差から計算する残り時間計算手段を起動し、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算する動作スピード計算手段を起動し、
前記最低動作スピード以上で動作するように前記マイクロプロセッサを制御する制御手段を起動する
ことを特徴とするマイクロプロセッサ制御装置。
【請求項２】
前記あらかじめ指定された複数の各タイミングは、システムコールの発生タイミングであることを特徴とする請求項１に記載のマイクロプロセッサ制御装置。
【請求項３】
前記各状態は、スタック上に存在する、サブルーチンの戻り番地の組により表されることを特徴とする請求項１に記載のマイクロプロセッサ制御装置。
【請求項４】
前記制御手段は、あらかじめ与えられた相異なる複数の動作スピードの中から前記最低スピード以上の動作スピードを選択し、選択した動作スピードで動作するように前記マイクロプロセッサを制御することを特徴とする請求項１に記載のマイクロプロセッサ制御装置。
【請求項５】
前記制御手段は、前記最低スピード以上の動作スピードのうち最も低い動作スピードを選択することを特徴とする請求項４に記載のマイクロプロセッサ制御装置。
【請求項６】
前記命令コード群は分岐命令コードを含み、
前記計算量予測データ生成部が、前記各状態の各々に対し、前記デッドラインが指定された命令コードが実行される実行確率を計算し、計算した実行確率をデータ保持部に保持させ、
前記制御手段は、閾値以上の実行確率をもつ、前記デッドラインが指定された命令コードから計算された最低動作スピードのうち最も大きい動作スピード以上で動作するように前記マイクロプロセッサを制御することを特徴とする請求項５に記載のマイクロプロセッサ制御装置。
【請求項７】
前記計算量予測データ作成部は、各前記タイミングに応じてそれぞれ複数回計測した計算量を平均することにより前記計算量予測データを得ることを特徴とする請求項６に記載のマイクロプロセッサ制御装置。
【請求項８】
前記動作スピードの制御に先だって、前記プログラムを実行し、
完了確率計算手段を用いて、前記デッドラインが指定された命令コードの実行が前記デッドライン内に完了した完了確率を計算し、前記完了確率を前記データ保持手段に保持させ、
前記制御手段は、前記完了確率が低いほど、高い動作スピードで動作するように前記マイクロプロセッサを制御することを特徴とする請求項１に記載のマイクロプロセッサ制御装置。
【請求項９】
少なくとも１つの命令コードにプログラムの開始点からのデッドライン（完了期限）が指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御方法であって、
前記動作スピードの制御に先だって、
前記プログラムを実行し、
あらかじめ指定された複数の各タイミングで、前記プログラムがその時点でどのサブルーチン呼び出しを行っているかを観測して状態遷移グラフを生成し、
前記観測した、サブルーチン呼び出しの各々に対し、状態遷移グラフの各状態から次のデッドラインに至るまでの計算量予測データを生成し、
前記計算量予測データを前記サブルーチン呼び出しの各々に対応させてデータ保持部に保持させ、
前記マイクロプロセッサの動作スピードの制御を伴って前記プログラムを実行する際に、
前記あらかじめ指定された複数の各タイミングで、
どのサブルーチン呼び出しを行っているかを観測し、
前記データ保持部に保持された該サブルーチン呼び出しに対応した前記計算量予測データから、残りの予測計算量を取得し、
次のデッドラインに至るまでの残り時間を、その時点までの経過時間と該デッドラインに指定されている時間との差から計算し、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算し、
前記最低動作スピード以上で動作するように前記マイクロプロセッサを制御する
ことを特徴とするマイクロプロセッサ制御方法。
【請求項１０】
少なくとも１つの命令コードにプログラムの開始点からのデッドライン（完了期限）が指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御プログラムであって、
前記動作スピードの制御に先だって、
前記プログラムを実行し、
あらかじめ指定された複数の各タイミングで、前記プログラムがその時点でどのサブルーチン呼び出しを行っているかを観測して状態遷移グラフを生成するステップと、
前記観測した、サブルーチン呼び出しの各々に対し、状態遷移グラフの各状態から次のデッドラインに至るまでの計算量予測データを生成するステップと、
前記計算量予測データを前記サブルーチン呼び出しの各々に対応させてデータ保持部に保持させるステップと、
前記マイクロプロセッサの動作スピードの制御を伴って前記プログラムを実行する際に、
前記あらかじめ指定された複数の各タイミングで、
どのサブルーチン呼び出しを行っているかを観測するステップと、
前記データ保持部に保持された該サブルーチン呼び出しに対応した前記計算量予測データから、残りの予測計算量を取得するステップと、
次のデッドラインに至るまでの残り時間を、その時点までの経過時間と該デッドラインに指定されている時間との差から計算するステップと、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算するステップと、
前記最低動作スピード以上で動作するように前記マイクロプロセッサを制御するステップと
をコンピュータに実行させるためのマイクロプロセッサ制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御装置、マイクロプロセッサ制御方法およびマイクロプロセッサ制御プログラムに関する。
【背景技術】
【０００２】
組み込みシステムの開発時は、サービス品質の保証とエネルギー消費の低減との両立が求められる。エネルギー消費の大きな割合を占めるマイクロプロセッサの消費電力（単位時間あたりのエネルギー消費量）は動作スピードの約3乗で増加する（例：Power=alpha*Capacitance*Voltage*Voltage*Frequency、Voltage∝Frequency。∝は比例を意味し、alphaは定数を表す。）。サービス品質は処理のデッドライン（時間的な締め切り）と解釈できる。タスク（一定の処理単位）の実行時間は処理スピードに反比例し、タスク処理のエネルギー消費を最小化するにはデッドライン内の最低スピードでマイクロプロセッサを運転するのが原理的に最適である。近年、実行時に動作スピードを変えられるプロセッサが実用化しており、この原理に基づくエネルギー消費の低減が可能となりつつある。
【０００３】
しかしながら、一般的なプログラムを処理する際にプロセッサの動作スピードを適切に調整するのは困難である。たとえば、プロセッサの動作スピードの変更には一定サイクル（例：数100サイクル）を要するので、比較的大きな処理単位をタスクとする必要がある。一般に大きな処理単位は繰り返しや分岐を含み計算量の予測が困難である。また、プログラムのデッドラインはタスク毎に与えられる訳でなく、プログラム上の実行文への到達時間（の組）で与えられる。公知のスピード制御技術は、マニュアルタスク分割（長所：細粒度でスピード調整、短所：手動でタスク分割）とフォードバック制御（長所：タスク分割が不要、短所：粗粒度のスピード調整）に大別できる。
【特許文献１】特開２００５−８５１６４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
本発明は、応用プログラムの変更を最小限に抑えつつ、応用プログラムの特性に応じてプロセッサの動作スピードを適切に制御することで低消費電力化を可能としたマイクロプロセッサ制御装置、マイクロプロセッサ制御方法およびマイクロプロセッサ制御プログラムを提供する。
【課題を解決するための手段】
【０００５】
本発明の一態様としてのマイクロプロセッサ制御装置は、
少なくとも１つの命令コードにデッドラインが指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御装置であって、
前記デッドラインが指定された命令コードであるデッドライン命令コードの実行前に、あらかじめ指定された複数の各タイミングで前記プログラムの実行状態を観測する状態観測手段と、
あらかじめ定めた複数の前記実行状態の各々に対し前記デッドライン命令コードの実行完了までの残りの計算量を予測した計算量予測データを保持するデータ保持部と、
前記状態観測手段により観測された観測実行状態に基づき前記計算量予測データから残りの予測計算量を取得する予測計算量取得手段と、
前記デッドライン命令コードに指定された前記デッドラインまでの残り時間を計算する残り時間計算手段と、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算する動作スピード計算手段と、
前記最低動作スピード以上で動作するように前記マイクロプロセッサを制御する制御手段と、
を備える。
【０００６】
本発明の一態様としてのマイクロプロセッサ制御方法は、
少なくとも１つの命令コードにデッドラインが指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御方法であって、
前記デッドラインが指定された命令コードであるデッドライン命令コードの実行前に、あらかじめ指定された複数の各タイミングで前記プログラムの実行状態を観測し、
あらかじめ定めた複数の前記実行状態の各々に対し前記デッドライン命令コードの実行完了までの残りの計算量を予測した計算量予測データを準備し、
観測された実行状態に基づき前記計算量予測データから残りの予測計算量を取得し、
前記デッドライン命令コードのデッドラインまでの残り時間を計算し、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算し、
前記最低動作スピード以上で動作するように前記マイクロプロセッサを制御する、
ことを特徴とする。
【０００７】
本発明の一態様としてのマイクロプロセッサ制御プログラムは、
少なくとも１つの命令コードにデッドラインが指定された命令コード群を含むプログラムを実行するマイクロプロセッサの動作スピードを制御するマイクロプロセッサ制御プログラムであって、
前記デッドラインが指定された命令コードであるデッドライン命令コードの実行前に、あらかじめ指定された複数の各タイミングで前記プログラムの実行状態を観測するステップと、
あらかじめ定めた複数の前記実行状態の各々に対し前記デッドライン命令コードの実行完了までの残りの計算量を予測した計算量予測データにアクセスするステップと、
観測された実行状態に基づき前記計算量予測データから残りの予測計算量を取得するステップと、
前記デッドライン命令コードのデッドラインまでの残り時間を計算するステップと、
前記残りの予測計算量を前記残り時間で処理するために必要な、前記マイクロプロセッサの最低動作スピードを計算するステップと、
を備える。
【発明の効果】
【０００８】
本発明により、応用プログラムの変更を最小限に抑えつつ、応用プログラムの特性に応じてプロセッサの動作スピードを適切に制御することで低消費電力化を実現できる。
【発明を実施するための最良の形態】
【０００９】
図１は、本発明に係る、オペレーティングシステムを搭載するソフトリアルタイムの組み込みシステムを示す。
【００１０】
この組み込みシステムは、マイクロプロセッサ（CPU）１１と、マイクロプロセッサ１１により実行されるオペレーティングシステム（Operating System: OS）１２と、オペレーティングシステム１２上で動作する応用プログラム１３と、応用プログラム１３を実行する際のマイクロプロセッサ１１の動作スピードを調整する適応型スピード制御装置１４とを備える。マイクロプロセッサ１１はたとえばDVFS（Dynamic Voltage Frequency Scaling）対応である。適応型スピード制御装置１４の機能はたとえばオペレーティングシステム１２の一部として組み込まれても良い。
【００１１】
図３は、応用プログラム１３の例を示す。
【００１２】
この応用プログラム１３は、複数の命令コードから構成され、複数のサブルーチンを含んでいる。接頭語"app_"で始まるサブルーチンは応用プログラムに属し、接頭語"sys_"で始まるサブルーチンはＯＳのシステムコールに属する。システムコール"sys_"は、応用プログラム１３がオペレーティングシステムに処理を依頼する際に利用するサブルーチンである。
【００１３】
この応用プログラムは、サブルーチン"app_main"のメインループ先頭でデータ受信待ち"sys_recv"となり、データの受信直後から次の受信待ちまでの区間（"sys_init"から"sys_fini"）が、周期的に実行される部分（周期タスク）となる。"sys_init"および"sys_fini"は周期タスクの区間開始および区間終了を定義するシステムコールである。なお"while(1) "は、"while(1) "以下の"{"と"}"で囲まれた命令群を繰り返すことを指示する命令コードである。
【００１４】
周期タスク内では条件分岐に応じてサブルーチン"app_sub1"またはサブルーチン"app_sub2"が実行された後、サブルーチン"app_sub3"が実行される。サブルーチン"app_sub1"と"app_sub2"は、データ送信"sys_send"を実行し、サブルーチン"app_sub3"はファイル書き込み"sys_write"を実行する。
【００１５】
システムコール"sys_"は、動作スピード制御に関係するシステムコール群と、関係しないシステムコール群とに分類される。後者のシステムコール群は、標準的なファイルの読み書き処理やネットワーク経由の通信処理などを行う命令（"sys_recv", "sys_send", "sys_write"）を含む。前者のシステムコール群は、周期タスクの開始を示す"sys_init"、周期タスクの終了を示す"sys_fini"および周期タスク中のデッドライン（完了期限）指定を行う"sys_time"を含む。
【００１６】
"void app_sub2"内の"sys_time(10ms)"は、周期タスクの開始"sys_init"から"sys_time(10ms)"の直前の命令コードの実行完了までに10msで到達しなければならないことを示す。つまり"sys_time(10ms)"は直前の命令コード（デッドライン命令コード）の実行完了のデッドラインを指定する。また"sys_fini(20ms) "は、周期タスクの開始から20ms以内に周期タスクを終了（" app_sub3"を実行完了）しなければならないことを示す。つまり"sys_fini(20ms) "は周期タスクにおける最後の命令コード"app_sub3"のデッドラインを指定する。ただし、周期タスクの開始"sys_init"を0msとしている。
【００１７】
このように本実施形態における応用プログラム１３は、繰り返し実行される周期タスクを含む。応用プログラム１３の制御フローの骨格、特に周期タスクの制御フローの骨格を図４に示す。
【００１８】
応用プログラム１３には開始（START）から終了（STOP）までの間、繰り返し実行される周期タスクが存在する。図中、破線で囲まれた部分が周期タスクに相当し、"sys_init"と"sys_fini(20ms) "とで囲まれている。周期タスクには、その開始（INIT）と終了（FINI）が存在し、開始（INIT）と終了（FINI）との間で、デッドライン位置の通過（TIME）およびシステムコールの呼出（CALL）が繰り返される。たとえば動画再生などの応用プログラムは、プログラムの開始と終了が存在し、動画の1フレームを計算する周期タスクが存在し、周期タスク内には各種のシステムコールおよびデッドラインが存在する。図中、INITは"sys_init"に対応し、FINIは"sys_fini(20ms) "に対応し、TIMEは"sys_time(10ms) "に対応し、CALLはたとえば"sys_send", "sys_write"に相当する。
【００１９】
図２は、図１の適応型スピード制御装置１４の詳細構成を示す。
【００２０】
プログラム状態観測部２１は、周期タスク実行時における応用プログラムの状態をOSコール（システムコール）のタイミングで観測し、観測した状態を表す状態ラベルを、計算量予測データ生成部２２または動作スピード制御部２３に出力する。プログラム状態観測部２１はたとえば状態観測手段および第２の状態観測手段に相当する。
【００２１】
計算量予測データ生成部２２は、周期タスクの観測から得られる各状態から、デッドライン状態（各状態のうちデッドラインを指定した状態）に至るまでの、すなわち、デッドラインが指定された命令コード（デッドライン命令コード）が実行完了するまでの予測計算量（予測サイクル数）等を表した計算量予測データ２４を生成する。計算量予測データ２４は状態遷移テーブルとも称される。生成された計算量予測データ２４は、たとえばデータ保持手段に保持される。
【００２２】
動作スピード制御部２３は、計算量予測データ２４から、現在のプログラム状態に基づき、デッドラインが指定された命令コード（デッドライン命令コード）の実行完了までに必要な残りの計算量を取得し、取得した計算量と、デッドラインまでの残り時間とに基づき、次のプログラム状態に遷移するまで適用するマイクロプロセッサの動作スピードを決定する。たとえば動作スピード制御手段２３は、取得した計算量を上記残り時間で処理するために必要な最低スピードをマイクロプロセッサの動作スピードとして決定する。あるいは動作スピード制御部２３は、あらかじめ指定された複数の動作スピードのうち、上記最低スピード以上で、かつ最も小さい値の動作スピードを選択する。
【００２３】
また動作スピード制御部２３は、システムの負荷増加などが原因で応用プログラム１３がデッドライン内に完了しない場合を想定し、デッドラインの完了確率（デッドラインが実際に満たされた割合）に応じて動作スピードを調整することも行う。たとえば完了確率が低いほど、動作スピードを、上記のようにして決定または選択された動作スピードよりも高くする。動作スピード制御部２３は、たとえば残り時間計算手段、動作スピード計算手段、制御手段および完了確率計算手段を含む。
【００２４】
以降、適応型制御装置１４の動作についてさらに詳細に説明する。
【００２５】
ただし、以降の説明では、種々の命令コードを利用して、プログラム状態観測部２１、計算量予測データ生成部２２および動作スピード制御部２３の各処理手順が記述されることがある。その際、応用プログラムにおけるプログラム開始（START）時のタイミングで行う処理は接尾語"_start"、プログラム終了（STOP）時のタイミングで行う処理は接尾語"_stop"、周期タスク開始（INIT）時のタイミングで行う処理は接尾語"_init"、周期タスク終了（FINI）時のタイミングで行う処理は接尾語"_fini"、また、システムコール時（CALL）時のタイミングで行う処理は接尾語"_call"を付ける規約とする。システムコールをデッドライン通知と区別する場合は接尾語"..._time"を付ける。
【００２６】
図２の適応型スピード制御装置１４により行われる処理は、大きく学習フェーズと制御フェーズとを含む。学習フェーズでは周期タスクの実行中に応用プログラムの状態を観測して状態遷移テーブル（計算量予測データ）を生成する。制御フェーズでは観測した応用プログラムの状態と状態遷移テーブルとを用いてデッドライン指定位置（sys_time,sys_fini）へ至るまでの計算量、すなわちデッドライン命令コードを実行完了するまでの計算量を予測し、予測した計算量とデッドラインまでの残り時間とに基づきマイクロプロセッサの動作スピードを制御する。
【００２７】
以下、学習フェーズおよび制御フェーズの各概要を説明した後、それぞれの詳細を説明する。
【００２８】
＜学習フェーズの概要＞
まず応用プログラム１３を実行し、周期タスクの実行中にプログラム状態観測部２１において応用プログラム１３の状態を観測する。状態の観測はシステムコール"sys_ "が呼ばれた時点で行い、観測された状態は状態ラベルとして保存される。
【００２９】
計算量予測データ生成部２２は、プログラム状態観測部２１により取得された状態ラベルをもとに、周期タスクにおける状態の遷移を表した状態遷移グラフ（後述する図５および図６参照）を生成する。そして計算量予測データ生成部２２は、状態遷移グラフの各状態からデッドライン状態へ至るまでのマイクロプロセッサの平均計算量（予測計算量）と、各デッドライン状態へ至る確率とを表した状態遷移テーブル（計算量予測データ）を生成する。
【００３０】
＜制御フェーズの概要＞
応用プログラム１３を実行し、周期タスクの実行中にプログラム状態観測部２１において応用プログラムの状態を観測する。動作スピード制御部２３は、観測した状態と、学習フェーズで得られた状態遷移テーブルとを用いて、状態遷移ごとに（システムコールが発生するごとに）、次の状態間の動作スピードを決定し、次の状態遷移まで、この動作スピードでマイクロプロセッサ（CPU）１１を動作させる。このようにして周期タスク実行中のマイクロプロセッサ（CPU）１１の動作スピードをシステムコールの発生タイミング（状態遷移のタイミング）で制御する。制御フェーズと学習フェーズとは逐次的に実行しても、並行に実行（たとえば運用中に計算量予測データを修正）してもよい。
【００３１】
＜学習フェーズの詳細＞
プログラム状態観測部２１は、周期タスクの実行中において、システムコールが呼ばれた時点で、応用プログラムの状態を観測する。システムコールが呼ばれた時点で観測を行うのは、観測箇所が過度に多いと（たとえばシステムコール以外のサブルーチンの呼び出し時点でも観測を行うと）、マイクロプロセッサの負荷が高くなるためである。したがって本発明は、システムコールの呼び出し時点と異なる時点で状態の観測を行うことを排除するものではない。
【００３２】
本実施形態では、観測される状態は、観測時点（システムコールが呼ばれた直後）における、実行中のサブルーチン（システムコールおよびアプリケーションサブルーチンの両方を含む）の組に相当する。１つの組ごとに１つのラベルが付与される。たとえば"app_main", "sys_init"の順でサブルーチンが実行され、"sys_init"が呼ばれた時点で、状態の観測を行うと、"app_main", "sys_init"の組を表す状態ラベルが取得される。
【００３３】
図８は、図３の応用プログラムの状態を観測することで得られた表（状態ラベルの事例）を示す。
【００３４】
この表では、合計６種類の状態ラベルs0,s1,s2,s3,s4,s5が示される。すなわち、システムコールが呼ばれた時点で観測される状態は、６種類の状態s0,s1,s2,s3,s4,s5のいずれかに属する。テーブル内のスタック(stack)のフィールドは、各状態に属するサブルーチンの組であり、図中左側のものほど、時間的に先に呼び出されている。図中一番右側のもの（システムコール）が呼び出された時点で、状態の観測が行われている。
【００３５】
テーブル中のdeadlineフィールドは、表における一番右のシステムコールがデッドラインを指定していれば○を、指定していなければ×を格納する。周期タスクの開始を示す"sys_init"はたとえば処理の簡単のため、デッドラインを指定しているとして扱う。
【００３６】
１つの状態に対応するサブルーチンの組は、具体的には、応用プログラムのコールスタックに積まれたサブルーチンの戻り番地のリストとして取得することができる。プログラムのコールスタックは未完了のサブルーチンのデータを格納する。一個のサブルーチンと対応するデータはフレームと呼ばれ、サブルーチンのローカル変数、リターン番地および前のフレーム先頭番地などから成る。フレーム上の値はフレーム先頭番地から一定のオフセットの番地に格納される。フレーム上のオフセット値およびレジスタ名は実行環境に応じて異なるが、本質的な手順はここに示すものと相違がない。
【００３７】
本実施形態ではフレームポインタ（$fp）と呼ぶレジスタの値が最上位（現在）のフレーム先頭番地（pos）を示し、フレーム先頭番地の内容（mem[pos]）は前のフレーム先頭番地を示すものとした。フレーム先頭番地からオフセット値（off）離れたところにある内容（ret=mem[pos+off]）がサブルーチンの戻り番地となる。フレーム先頭番地（pos）がスタック底（bot）と一致するまでコールスタックを遡りながら戻り番地（ret）の組を記録することで上記リストが得られる。なお、以下の擬似プログラム中の"bot::Unit"の記述は「変数"bot"の型は符号無し整数"Uint"」の意味とする。
【００３８】
以下に、スタック上の戻り番地の組を格納したリストを取得する処理手続の一例を示す。
名称：app_stack
機能：スタック上の戻り番地の組を格納したリストを取得する。
定数：
スタック底  bot::Uint（定数）
オフセット  off::Uint（定数）
入力：
OSコール識別子     sid::Uint
スタック配置メモリ mem::Map of Uint to Uint
出力：
スタック戻り番地列 seq::Seq of Uint
app_stack()
Uint bot = スタック底
Uint off = オフセット
Uint sid = OSコール識別子
Uint pos = フレームポインタ（$fp）
Uint ret = リターンアドレス
pos ← $fp
ret ← sid
seq ← [ret] // 空リスト
while pos != bot do
pos ← mem[pos]
ret ← mem[pos + off]
seq ← seq + [ret] 
od
return seq
【００３９】
計算量予測データ生成部２２は、プログラム状態観測部２１から状態ラベル（リスト）を逐次取得し、逐次取得した状態ラベルを用いて、応用プログラムにおける状態の遷移を表した状態遷移グラフを生成する。状態遷移グラフは応用プログラムの動作に関する特徴を抽象化したものと言える。
【００４０】
図５は、図３の応用プログラムから生成された状態遷移グラフの一例を示す。
【００４１】
状態遷移グラフは有向グラフ（directed graph）の一種である。状態遷移グラフはシステムコールのタイミングで観測した応用プログラムの状態を頂点（node）とし、前後の状態を表す頂点との間を辺（edge）で結合したものである。図５のs0,s1,s2,s3,s4,s5は頂点を表し、これらの頂点はs0,s1,s2,s3,s4,s5は図８の表に示した各状態（応用プログラムのコールスタック）に対応する。
【００４２】
図５における0ms, 10ms, 20ms はデッドラインを示す。つまり状態s0を0msとしたとき、状態s4へは10ms以内に到達しなければならず、状態s5へは20ms以内に到達しなければならない。ラベルs3に再帰的に矢印が入っているのは、ラベルs3が繰り返し連続して取得されたことを意味する。より詳細には、図３の応用プログラムの" void app_sub2"におけるfor文の中の"sys_send"が複数回連続して繰り返し実行されたことを意味する。
【００４３】
ここで状態遷移グラフMの定義を以下に示す。ラベル集合Sは状態ラベルの集合とし、開始ラベル集合I、期限ラベル集合Dおよび終了ラベル集合Fは集合Sの部分集合とする。周期タスクの開始ラベルの集合をI、終了ラベルの集合をFとする。集合Fと集合Iは共通要素を持たない（F∩I=φ）。φは空集合を表す。ラベル集合S-D（SからDを除いた残り）は、通常のシステムコールに対応する。期限ラベルd∈Dは、デッドラインT(d)を有する。
M=(S,I,D,F,R,T)
ラベル集合: S               (本例ではS={s0,s1,s2,s3,s4,s5}）
開始ラベル集合: I ⊆ D       （本例ではI={s0}）
期限ラベル集合: D ⊆ S       （本例ではD={s0,s4,s5}）
終了ラベル集合: F ⊆ D        (本例ではF={s5})
ラベル遷移関係: R ⊆ S × S （本例ではR={(s0,s1), (s1,s2), (s0,s3), (s3,s3), (s3,s4), (s4,s2), (s2,s5)}
デッドライン割当: T: D→Time  (本例ではT={s0→0ms, s4→10ms, s5→20ms})
【００４４】
上記の例では、状態ラベルとして、実行中のサブルーチンの組（コールスタックの戻り番地のリスト）を取得したが、状態ラベルの内容を拡張し、コールスタックの戻り番地のリストと、出現回数（１周期中に呼び出された回数）との組を、状態ラベルとして取得してもよい。
【００４５】
図６は、拡張した状態ラベルを用いて生成した状態遷移グラフの例を示す。
【００４６】
拡張された状態ラベルは、戻り番地のリストsと、その発生頻度f(s)との組<s,f(s)>として表される。たとえば<s3,1>はs3の一度目の出現を表し、<s3,2>はs3の２度目の出現を表す。図５では再帰的な矢印によってs3の複数回の出現を表現していたが、図６では、s3が出現するごとにそれぞれを異なった状態として取得している。<s3,1>から<s3,2>を経由して<s4,1>へ遷移するケースと、<s3,1>から<s4,1>へ直接遷移するケースの両方があることが図から理解される。
【００４７】
ここで拡張された状態ラベルをもつ状態遷移グラフM’の定義を以下に示す。ラベル集合S’は状態ラベルの集合とし、開始ラベル集合I’、期限ラベル集合D’および終了ラベル集合F’は集合S’の部分集合とする。周期タスクの開始ラベルの集合をI’、終了ラベルの集合をF’とする。集合F’と集合I’は共通要素を持たない（F’∩I’=φ）。φは空集合を表す。ラベル集合S’-D’（S’からD’を除いた残り）は、通常のシステムコールに対応する。期限ラベルd’∈D’は、デッドラインT’(d’)を有する。
ラベル集合: S’          (本例ではS’={<s0,1>, <s1,1>, <s2,1>, <s3,1>, <s3,2>, <s4,1>, <s5,1>}）
開始ラベル集合: I’⊆D’=D×{1}    （本例ではI’={<s0,1>}）
期限ラベル集合: D’ ⊆ S’         （本例ではD’={<s0,1>, <s4,1>, <s5,1>}）
終了ラベル集合: F’ ⊆ D’          (本例ではF’={<s5,1>})
ラベル遷移関係: R’ ⊆ S’ × S’ （本例ではR’={(<s0,1>,<s1,1>), (<s1,1>,<s2,1>), (<s0,1>,<s3,1>), (<s3,1>,<s3,2>), (<s3,1>,<s4,1>), (<s3,2>,<s4,1>), (<s4,1>,<s2,1>), (<s2,1>,<s5,1>)}
デッドライン割当: T’: D’→Time   (本例ではT’={<s0,1>→0ms, <s4,1>→10ms, <s5,1>→20ms) }
【００４８】
以下に拡張された状態ラベルの計算手順を示す。以下の計算手順において、集合Sは過去に現れたコールスタックの戻り番地のリストを保持する集合、写像fは同じコールスタックの戻り番地のリストの出現回数を保持する写像とする。集合Sはプログラム開始（START）時に空の状態に初期化され、システムコール（CALL）時に集合Sに戻り番地のリストを追加する。写像fはプログラム開始（START）時に空の状態に初期化され、システムコール（CALL）時に、写像fに保持する出現回数を増加する。状態ラベルは、上記したように、戻り番地のリストsとその発生頻度f(s)の組<s,f(s)>である。
機能：M'計算用のラベル生成（発生カウントあり）
備考：Label = (Seq of Uint, Uint)
void label_start()
S::Set of State ← φ
f::Map of S to N ← φ
return
Label label_init()
for each s ∈ S do
f(s) ← 0
od
return label_call()
Label label_fini()
reurn label_call()
Label label_call()
s ← app_stack()
if not s ∈ S then
f(s) ← 0
S ← S ∪ {s}
fi
f(s) ← f(s) + 1
return <s,f(s)>
【００４９】
計算量予測データ生成部２２は、このようにして生成した状態遷移グラフ（図５または図６）において各状態からデッドライン状態への、到達確率（デッドライン命令コードの実行確率）およびマイクロプロセッサの平均計算量（予測計算量）を表した状態遷移テーブルを生成する。状態遷移テーブルは以下のように定義される。
【００５０】
現在の状態が状態sのとき、デッドライン状態dへ至る確率をProb(s,d)、デッドライン状態dまでの計算量をCycl(s,d)とする。なお、後述の制御フェーズでは、プログラムの現在状態s∈Sからデッドライン付き状態d∈Dへの計算量Cycl(s,d)と到達確率Prob(s,d)を利用する。状態遷移テーブルは、各状態からデッドライン状態へのパスについての計算量Cyclと到達確率Probとを含む。
到達確率： Prob::Map of (S,D) to R
計算量（予測計算量）： Cycl::Map of (S,D) to R
【００５１】
以下に、状態遷移テーブルを生成する手順を具体的に示す。状態遷移テーブルは、状態遷移グラフ（図５または図６）に遷移時における平均計算量、分岐時における各分岐の確率を追加することで生成できるが、応用プログラムの観測により直接、状態遷移テーブルを生成するほうが簡単に生成できる。よって、以下には応用プログラム実行の観測により応用プログラムの状態遷移テーブル（Prob,Cycl）を生成する手順を示す。
【００５２】
なお、以下の手順において、応用プログラムにおける指定区間における計算量（CPUサイクル数）は、たとえばプロセッサのプロファイル用カウンタまたはCPUシミュレータなどを用いて計測できるとする。計算量予測データ生成部２２は、たとえば指定区間における計算量を計測する計算量計測手段を含む。
機能： 応用プログラムの状態遷移テーブル(Prob,Cycl)を生成する。
変数：
訪問頻度      FreqS::Map of S to N
訪問サイクル  CyclS::Map of S to N
遷移頻度      FreqT::Map of (S,D) to N
遷移サイクル  CyclT::Map of (S,D) to N
訪問フラグ   Visit::Map of S to Bool
入力：
ラベル集合S、期限ラベル集合D
出力：
到達確率Prob、サイクル数Cycl
void mktab_start()
label_start()
for each s ∈ S do
FreqS(s) ← 0
for each d ∈ D do
FreqT(s,d) ← 0
CyclT(s,d) ← 0
od
od
void mktab_init()
for each s ∈ S do
Visit(s) ← false
CyclS(s) ← 0
od
s ← label_init()
Visit(s) ← true
CycleS(s) ← 実行サイクル数()
void mktab_call()
s ← label_call()
Visit(s) ← true
CycleS(s) ← 実行サイクル数()
void mktab_time()
mktab_call()
void mktab_fini()
for each s ∈ S do
for each d ∈ D do
if Visit(s) ∧ Visit(d) ∧ CycleS(s) < CycleS(d) then
FreqT(s,d) ← FreqT(s,d) + 1
CyclT(s,d) ← CyclT(s,d) + CycleS(d) - CycleS(s)
fi
od
od
void mktab_stop()
for each s ∈ S do
for each d ∈ D do
if FreqT(s,d) > 0 then
Cycl(s,d) ← CyclT(s,d) / FreqT(s,d)
else
Cycl(s,d) ← 0
fi
if FreqS(s) > 0 then
Prob(s,d) ← FreqT(s,d) / FreqS(s)
else
Prob(s,d) ← 0
fi
od
od
【００５３】
上記手順では、訪問頻度FreqSは状態s∈Sの発生回数を、遷移頻度FreqTは状態s∈Sから状態d∈Dへの遷移発生頻度を記録する。遷移サイクルCyclTは状態s∈Sから状態d∈Dへの遷移に要した計算量を積算する。訪問フラグVisitと訪問サイクルCyclSとは、周期タスクの開始から終了までの間、訪問した状態の記録（訪問の有無）と訪問時のサイクル数とを記録する。
【００５４】
応用プログラムの開始（START）時に変数FreqS、FreqT、CyclTを0へ初期化し、周期タスク開始（INIT）時にVisit及びCyclSをfalse及び0へ初期化する。周期タスク終了（FINI）時にVisit及びCyclSの値から遷移関係を決定しFreqT、CyclTを更新する。プログラム終了（STOP）時にFreqS、FreqT、CyclTの値から状態遷移テーブル（Cycl,Prob）を計算する。
【００５５】
図９は、上記手順に従い状態遷移テーブルを生成する途中の一状態を示す表である。表の各行が一つの周期タスクで実行された実行パスに対応し、周期タスク終了（FINI）時の変数Visit、CyclS、FreqS、CyclT、FreqTの値を含んでいる。
【００５６】
たとえば３回目の周期タスクにおける実行パス＜s0,s3,s3,s4,s2,s5＞に着目して説明する。
【００５７】
Visitの<s0,1>→1、<s2,1>→1、<s3,1>→1、<s3,2>→1、<s4,1>→1、<s5,1>→1は、３回目の周期タスクにおいて、各状態<s0,1>、<s2,1>、<s3,1>、<s3,2>、<s4,1>、<s5,1>への訪問があったことを示し、<s1,1>→0は、<s1,1>への訪問がなかったことを示す。
【００５８】
CyclSの<s2,1>→400K、<s3,1>→100K、<s3,2>→200K、<s4,1>→300K、<s5,1>→500Kは、<s0,1>の訪問時を0Kとした場合、各状態への訪問時のサイクル数（計算量）が400K、100K、200K、300K、500Kサイクルであったことを示す。なお、Kはキロサイクルの略である。
【００５９】
FreqSの<s0,1>→3、<s1,1>→1、<s2,1>→3、<s3,1>→2、<s3,2>→1、<s4,1>→2、<s5,1>→3は、３回目の周期タスクが終わった時点で、各状態への訪問が合計で3回、1回、3回、2回、1回、2回、3回あったことを示す。
【００６０】
CycleTの(<s0,1>,<s4,1>)→500K、(<s0,1>,<s5,1>)→1200K、(<s1,1>,<s5,1>)→200K、・・・は、３回目の周期タスクが終わった時点で、各状態間遷移のサイクル数（計算量）が、合計で500K,1200K,200K、・・・であったことを示す。
【００６１】
FreqTの(<s0,1>,<s4,1>)→2、(<s0,1>,<s5,1>)→3、(<s1,1>,<s5,1>)→1、・・・は、３回目の周期タスクが終わった時点で、各状態間遷移の回数が合計で2回,3回,1回であったことを示す。
【００６２】
図１０は、図９の表における周期タスク３回分の情報から生成した状態遷移テーブルの例を示す。
【００６３】
この状態遷移テーブルにおいて縦項目「from」が、周期タスクの終了を除く各状態を表し、横項目「to」が、デッドラインを指定するデッドライン状態を表す。状態遷移テーブルには、上述したとおり、各状態からデッドライン状態へ至る確率と、各状態からデッドライン状態までの予測計算量（ここでは平均値）とが含まれる。
【００６４】
たとえば「from」が<s0,1>,「to」が<s4,1>のマスに着目すると、<s0,1>から<s4,1>への遷移は、図９の表から合計で２回あり、また周期タスクは合計３回実行されたので、<s0,1>から<s4,1>への遷移が起こる確率は2/3=67%（端数は繰り上げ）となる。そして、<s0,1>から<s4,1>への遷移に要したサイクル数は、図９の表から合計で500K（２回目が200K、３回目が300K）であり、遷移回数の合計は２回であるため、<s0,1>から<s4,1>への遷移に要したサイクル数の平均は500/2=250Kとなる。
【００６５】
＜制御フェーズの詳細＞
応用プログラム１３における周期タスクを実行してプログラム状態観測部２１に応用プログラム１３の状態を観測させ、動作スピード制御部２３が、観測した状態と、学習フェーズで生成された状態遷移テーブル（計算量予測データ）とを用いて、状態遷移ごとに（システムコールが発生するごとに）、次の状態間の動作スピードを決定する。このようにして周期タスクの実行中におけるマイクロプロセッサ（CPU）１１の動作スピードを逐次制御する。
【００６６】
以下、マイクロプロセッサ１１の動作スピード制御について順を追って説明する。
【００６７】
動作スピードの制御手順においては周期タスク開始（INIT）からの経過時間を利用する。経過時間の取得手続きの例を以下に示す。この手続中の"現在時刻()"はシステムの実時間クロックを表す。周期タスク開始（INIT）時の時刻を変数t0に記録し、システムコール時の経過時間は現在時刻と開始時刻の差から計算している。
機能： 経過時間を計算する
変数： 開始時刻 t0:Uint
入力： なし
出力： 経過時間
void etime_start()
return
Uint etime_init()
t0 ← 現在時刻()
return 0
Uint etime_call()
return 現在時刻() - t0
Uint etime_fini()
return 現在時刻() - t0
void etime_stop()
return
【００６８】
また、動作スピードの制御手順においては、後述するようにシステムコールの都度、動作スピードを決定するが、動作スピードの決定として、動作スピードを複数の中から選択する際の具体的な手順を示す。
機能：動作スピードを選択する
変数：
NumD::Map of D to N
FinD::Map of D to N
入力：
現在状態   s
現在時刻   t
定数：
到達確率   Prob::Map of (S,D) to [0,1]
サイクル数 Cycl::Map of (S,D) to R
スピード集合Freq::Map of N to N
出力：
動作スピードf
Const fmax = Freq(1)
Const fmin = Freq(N)
void speed_start()
for each d ∈ D do
NumD(d) ← 100
FinD(d) ← 100
od
void speed_init()
for each d ∈ D do
Time(d) ← T(d) * (FinD(d) / NumD(d))
od
Freq speed_call(Label s, Time t)
f0 ← 0
for each d ∈ D do
if Prob(s,d) > p0 then
f ← Cycl(s,d) / min(1, Time(d) - t)
if f > f0 then
f0 ← f
fi
fi
od
if f >= fmax then
return fmax
fi
for i = 1 to N do
if Freq(i) >= f0 then
return f
fi
od
void speed_time(Label s, Time t)
if s ∈ D then
NumD(s) ← NumD(s) + 1
if t <= T(s) then
FinD(s) ← FinD(s) + 1
fi
fi
void speed_fini()
return
【００６９】
上記動作スピードの選択手順において、マイクロプロセッサ（CPU）１１の動作スピードは最小スピードFreq(1)から最大スピードFreq(N)までのN段階に変速可能とし、写像Freqはi<jならFreq(i)<Freq(j)を満たすと仮定している。
【００７０】
システムコール時の手順（speed_call）に記すように、現在の状態s∈Sと時刻tとが与えられた時に、到達確率Prob(s,d)が閾値p0より大きなデッドライン付き状態d∈Dを選択後、計算量（サイクル数）Cycl(s,d)と残り時間T(d)-tとから必要スピードf0を計算し、デッドライン内に処理が完了する最低スピードfを選択する。
【００７１】
変数NumD、FinDはデッドラインdの到達頻度NumD(d)と時間内の完了頻度FinD(d)とを保持し、値FinD(d)/NumD(d)がデッドラインの完了確率を示す。
【００７２】
デッドラインの完了確率が１より低いときは、動作スピードの選択に用いる有効デッドラインTime(d)を引き下げる、すなわちデッドラインT(d)に完了確率FinD(d) / NumD(d)を乗じた値を有効デッドラインTime(d)とする(上記選択手順におけるTime(d) ← T(d)× (FinD(d) / NumD(d)を参照)ことで、完了確率を高めるように制御する。すなわち完了確率が低いほど、有効残り時間（Time(d) − t)を低く見積もることで、動作スピードを高く計算する（上記選択手順におけるf ← Cycl(s,d) / min(1, Time(d) - t)を参照）。
【００７３】
以上に説明した経過時間の取得手続および動作スピードの選択手続を元に、以下、動作スピードの制御手順の例を示す。
機能：動作スピードを制御する
変数：
入力：
現在状態   s
現在時刻   t
到達確率   Prob
サイクル数 Cycl
出力：
処理スピード      f:DOM(Freq)
void ctrl_start()
Prob ← 到達確率
Cycl ← サイクル数
label_start()
etime_start()
speed_start()
void ctrl_init()
speed_init()
s ← label_init()
t ← etime_init()
f ← speed_init(s, t)
void ctrl_call()
s ← label_call()
t ← etime_call()
f ← speed_call(s, t)
void ctrl_time()
s ← label_call()
t ← etime_call()
speed_time(s, t)
f ← speed_call(s, t)
void ctrl_fini()
s ← label_fini()
t ← etime_fini()
speed_time(s, t)
speed_fini()
f ← fmin
void ctrl_stop()
return
【００７４】
以上に示したマイクロプロセッサ(CPU)の動作スピード制御についてその具体例を以下に説明する。
【００７５】
ただし、応用プログラム１３の状態遷移テーブルは図１１に示すものを用いるとする。
【００７６】
また、マイクロプロセッサ（CPU）の動作スピードは以下の三段階に変速可能とする。
f=10, 20, 40MHz
【００７７】
以上の条件の下、周期タスク中の実行パスがs0,s1,s2,s5の時と、s0,s3,s3,s4,s2,s5の時のスピード制御の例を示す。
【００７８】
［実行パスがs0,s1,s2,s5の時のスピード制御］
最初の状態は<s0,1>であり、現在時刻が0msのとき、閾値20%以上の確率で到達するデッドライン状態は<s5,1>である（<s4,1>は閾値未満の10%である）。そして状態<s5,1>への平均計算量（平均サイクル数）は300K（キロサイクル）である。したがって、300Kをデッドライン20ms以内に終えるのに必要な動作スピードを計算すると下記式に示すように15MHz以上となる。CPUが取り得る動作スピード10, 20, 40MHzの中で、この条件を満たす最低スピードは20MHzである。したがって20MHzを選択し、この20MHzにより、<s0,1>に対応するシステムコール後の応用プログラムを処理する。
s=<s0,1>     //現在状態
t=0ms       //現在時刻
300K/(20-0)ms =15MHz           //必要スピード
f=20MHz  //動作スピード
【００７９】
次の状態は<s1,1>であり、<s1,1>に対応するシステムコール時の経過時刻は5msであるとする。閾値20%以上の確率で到達するデッドライン状態は<s5,1>である。また状態<s5,1>への平均計算量（平均サイクル数）は200K（キロサイクル）である。したがって、200Kをデッドラインまでの残りの時間15(=20-5)ms以内に終えるのに必要な動作スピードを計算すると下記式に示すように13MHz以上となる。CPUが取り得る動作スピード10, 20, 40MHzの中で、この条件を満たす最低スピードは20MHzである。したがって20MHzを選択し、この20MHzにより、<s1,1>に対応するシステムコール後の応用プログラムを処理する。
s=<s1,1>
t=5ms
200K/(20-5)ms =13
f=20MHz
【００８０】
次の状態は<s2,1>であり、<s2,1>に対応するシステムコール時の経過時刻は10msであるとする。閾値20%以上の確率で到達するデッドライン状態は<s5,1>である。また状態<s5,1>への平均計算量（平均サイクル数）は100K（キロサイクル）である。したがって、100Kをデッドラインまでの残りの時間10(=20-10)ms以内に終えるのに必要な動作スピードを計算すると下記式に示すように10MHz以上となる。CPUが取り得る動作スピード10, 20, 40MHzの中で、この条件を満たす最低スピードは10MHzである。したがって10MHzを選択し、この10MHzにより、<s2,1>に対応するシステムコール後の応用プログラムを処理する。
s=<s2,1>
t=10ms
100K/(20-10)ms=10
f=10MHz
【００８１】
次の状態はデッドライン状態<s5,1>であり、<s5,1>に対応するシステムコール時の経過時刻は20msであるとする。したがってデッドライン以内に実行パスが終了されたこととなる。動作スピードは直前に選択した10MHzを、そのまま維持する。
s=<s5,1>
t=20ms
完了
f=10MHz
【００８２】
［実行パスがs0,s3,s3,s4,s2,s5の時のスピード制御］
周期タスク中の実行パスがs0,s3,s3,s4,s2,s5の時のスピード制御手順の動作例を示す。先の場合と同様だが、重複して現れる状態s3を出現回数に応じて区別する点に注意する。下記に、動作スピードの計算過程と、選択された動作スピードとを記す。簡単に補足説明を行うと以下の通りである。
【００８３】
状態<s3,1>,<s3,2>では閾値20%以上の確率で到達するデッドライン状態は<s4,1>と<s5,1>の２つある。そこで、各デッドライン状態についてそれぞれ動作スピードを計算し、大きい方の動作スピードを採択する。そしてCPUが取り得る動作スピード10, 20, 40MHzの中で、採択した動作スピードを満足する最低のスピードを選択する。たとえば<s3,1>の場合、<s4,1>に対して40msが計算され、<s5,1>に対しては27msが計算されるため、これらのうち大きい方の40msを採択する。そしてCPUが取り得る動作スピード10, 20, 40MHzの中で、この条件を満たす最低スピードは40MHzである。したがって40MHzを選択する。
s=<s0,1>
t=0ms
300K/(20-0)ms =15
f=20MHz
s=<s3,1>
t=5ms
200K/(10-5)ms = 40
400K/(20-5)ms = 27
f=40MHz
s=<s3,2>
t=7.5ms
100K/(10-7.5)ms = 40
300K/(20-7.5)ms = 24
f=40MHz
s=<s4,1>
t=10ms
200K/(20-10)ms = 20
f=20MHz
s=<s2,1>
t=15ms
100K/(20-15)ms = 20
f=20MHz
s=<s5,1>
t=20ms
完了
f=20MHz
【００８４】
ここで、スピード制御の効果を、簡易なエネルギーの見積もり式を用いて例示する。マイクロプロセッサ（CPU）の消費エネルギーは、消費電力と計算時間との積となり、以下の例では消費電力は動作スピードの約二乗で増えると仮定する。計算時間は計算サイクル数を動作スピードで除算した値となるため、消費エネルギーは、上記仮定のもと、動作スピードと計算サイクル数との積となる。このことを式により表すと以下の通りである。Energyは消費エネルギー、Powerは消費電力、Timeは計算時間、Freqは動作スピード、Cycleは計算サイクル数、Aは定数である。以降の説明ではA=1とする。
Energy = Σ Power*Time
= Σ A*Freq2*Time
= Σ A*Freq2*(Cycle/Freq)
= Σ A*Freq*Cycle
【００８５】
上述した２つの実行パス(s0,s1,s2,s5),(s0,s3,s3,s4,s2,s5)を例に、消費エネルギーを固定スピード（20MHzと40MHz）と、可変スピード（本発明）との場合について計算し、また各ケースにおいてデッドライン状態s4、s5への到達時刻を求めると、以下のようになる。ただし、ここでは図７の状態遷移グラフに示すように、各状態間の遷移の予測サイクル数は全て100Kであるとした。
【００８６】
［実行パス：s0,s1,s2,s5］
固定スピード20MHz
Energy = 20*100+20*100+20*100 = 6000
s5到達 = 300/20 = 15ms 
固定スピード40MHz
Energy = 40*100+40*100+40*100 = 12000
s5到達 = 300/40 = 7.5ms
可変スピード（本発明）
Energy = 20*100+20*100+10*100 = 5000
s5到達 = 20ms
【００８７】
［実行パス：s0,s3,s3,s4,s2,s5］
固定スピード20MHz
Energy = 20*100+20*100+20*100+20*100+20*100 = 10000
s4到達 = 300/20 = 15ms 
s5到達 = 500/20 = 25ms 
固定スピード40MHz
Energy = 40*100+40*100+40*100+40*100+40*100 = 20000
s4到達 = 300/40 = 7.5ms
s5到達 = 500/40 = 12.5ms
可変スピード（本発明）
Energy = 20*100+40*100+40*100+20*100+20*100 =14000
s4到達 = 10ms
s5到達 = 20ms
【００８８】
以上の結果に基づき、2つの実行パスの両方においてデッドラインを守ることができる40MHzの固定スピードと、本発明の可変スピードとで消費エネルギー期待値を比較する。図７のように、１番目の実行パス（s0,s1,s2,s5）が90%、２番目の実行パス（s0,s3,s3,s4,s2,s5）が10%の割合で発生する場合（<s0,1>のとき90%の確率で状態<s1,1>へ遷移し、10%の確率で<s3,1>へ遷移する場合）、本発明の可変スピード方式の消費エネルギーの期待値は、下記の式に示す通り、固定スピード方式の約60%となる。
(5000*0.9+14000*0.1)/(12000*0.9+20000*0.1)=60%
【００８９】
以上のように、本実施形態により、応用プログラムの変更を最小限に抑えつつ、応用プログラムの特性に応じてマイクロプロセッサの動作スピードを適切に制御することで、マイクロプロセッサならびにマイクロプロセッサを含む組み込みシステムの低消費エネルギー化が可能となる。
【図面の簡単な説明】
【００９０】
【図１】本発明に係る、オペレーティングシステムを搭載する組み込みシステムを示す。
【図２】適応型スピード制御装置の詳細構成を示す。
【図３】以降の解説において説明を具体化するために用いる応用プログラムの例を示す。
【図４】応用プログラムの制御フローの骨格を示す。
【図５】状態遷移グラフの一例を示す。
【図６】状態遷移グラフの他の例を示す。
【図７】状態遷移グラフのさらに他の例を示す。
【図８】状態ラベルの事例の表を示す。
【図９】状態遷移テーブルを生成する途中で得られる情報の表を示す。
【図１０】図９の表から生成した状態遷移テーブルの例を示す。
【図１１】状態遷移テーブルの他の例を示す。
【符号の説明】
【００９１】
１１：マイクロプロセッサ（ＣＰＵ）
１２：オペレーティングシステム（ＯＳ）
１３：応用プログラム
１４：適応型スピード制御装置
２１：プログラム状態観測部
２２：計算量予測データ生成部
２３：動作スピード制御部
２４：計算量予測データ
【図１】
0004836903.tif 000002
【図２】
0004836903.tif 000003
【図３】
0004836903.tif 000004
【図４】
0004836903.tif 000005
【図５】
0004836903.tif 000006
【図６】
0004836903.tif 000007
【図７】
0004836903.tif 000008
【図８】
0004836903.tif 000009
【図９】
0004836903.tif 000010
【図１０】
0004836903.tif 000011
【図１１】
0004836903.tif 000012