(58)【調査した分野】(Int.Cl.,DB名)
コンピュータが読み込み実行することで、前記コンピュータを、請求項1乃至4のいずれか1項に記載の情報処理装置における各手段として機能させるためのプログラム。
【発明を実施するための形態】
【0012】
以下、添付図面に従って本発明に係る実施の形態を詳細に説明する。
【0013】
[第1の実施形態]
図6は本実施形態における情報処理装置の概略構成を示す。実施形態では、開発対象の電子機器にて実行されるプログラムのクロックサイクル数を算出する装置を、パーソナルコンピュータ等の汎用情報処理装置で実現する例を示す。図示において、CPU710は装置全体の制御を司るものであり、ROM730、RAM720に格納されたプログラムを実行する。なお、ターゲットデバイスに実装させるプロセッサ(DSPやCPU等)と、
図6に示すCPU710は異なるものとする。なお、開発対象の電子機器、それに実装されるプロセッサ、そのプロセッサで実行されるプログラムを、以下では、ターゲットデバイス、ターゲットCPU、ターゲットプログラムと言う。
【0014】
ROM730には、BIOS(Basic Input/Output System)やブートプログラムが格納されている。HDD740にはOS(オペレーティングシステム),クロックサイクル数算出のプログラムをはじめとする各種プログラム、更には、各種データファイルが格納されているものとする。IO760は入出力部であり、データを保持している外部機器に接続されることで実行サイクル数を求めるプログラム等データの入出力が可能なインターフェースである。例えば、このIO760を介して、ターゲットデバイスに実装しようとするターゲットプログラムを入力し、HDD740に格納される。バス750は、ROM730、RAM720、CPU710、HDD740およびIO760間でデータやコマンドを伝達可能に接続する。
【0015】
上記構成において、本装置の電源がONになると、CPU710はROM730のブートプログラムを実行し、HDD740からOSをRAM720にロードすることで、本装置が汎用の情報処理装置として機能する。そして、ユーザの指示に応じてクロックサイクル数算出アプリケーションがHDD740からRAM720にロードされ、CPU710により実行されることで、本装置が、ターゲットプログラムの実行クロックサイクル数算出装置として機能することになる。なお、ターゲットデバイスにて実行されるプログラム(ターゲットCPUが実行するプログラム)を格納したファイルが、既にHDD740に格納されているものとして説明する。また、ターゲットCPUが実行可能な命令の詳細を表すテーブル(ターゲットCPU命令テーブル)のファイルもHDD740に格納されているものとする。
【0016】
以下、本装置が、実行サイクル数算出装置(特定のマイクロコンピュータ・CPU・DSP等で所望の処理を実施させた場合の処理クロックサイクル数を見積もる処理装置)として機能した場合の構成と動作の詳細を説明する。
【0017】
本装置を構成する要素は以下の通りである。なお、以下の要素をいくつか組み合わせて1の要素にしても構わない。
・ターゲットCPUで実行可能な命令語系列によって構成された第1のプログラム(ターゲットプログラム)の構造・意味を分析するための構造・意味解析部(101)。
・第1のプログラムと、構造・意味解析部(101)で生成された構造・意味情報とから、変数を抽出するための変数抽出部(102)。
・第1のプログラムと構造・意味解析部(101)で生成された構造・意味情報から特定命令を抽出する特定命令抽出部(103)。
・第1のプログラムと、ターゲットCPU命令テーブル、特定命令抽出部(103)で生成された特定命令情報から第1のプログラムを複数の部分プログラムに分割し、各部分プログラムの実行クロックサイクル数を算出するためのプログラム分割部(104)。
・第1のプログラムの構造・意味情報と、プログラム分割部によって生成された部分プログラムサイクル数データから部分プログラムどうしの接続、移行フローを表す部分プログラム接続・移行フローデータ生成部(105)。
・第1のプログラムの構造・意味情報と、変数抽出部(102)で生成された変数情報から、プロセッサ非依存の第2のプログラムを生成するための逆コンパイル部(106)。
・逆コンパイル部から生成された第2のプログラムと特定命令情報から、フラグ生成するためのプロセッサ非依存の第3のプログラム(フラグ生成プログラム)を生成するフラグ生成処理付加部(107)。
・フラグ生成処理付加部で生成された第3のプログラムを実行形式に変換するコンパイル部(108)。
・コンパイル部(108)で生成された実行形式の第3のプログラムを実行しフラグ系列を生成するための第3のプログラム実行部(109)。
・部分プログラム接続・移行フローデータと第3のプログラム実行形式実行部で生成されたフラグ系列データから、第1のプログラムを特定のマイクロコンピュータ・CPU・DSP等で実行させた場合に要するクロックサイクル数を算出するサイクル数積算部(110)。
【0018】
以下、上記構成における処理クロックサイクル数を見積もる処理装置の動作について説明する。
【0019】
先ず、構造・意味解析部(101)が、HDD740に格納されたターゲットプログラムのファイルをRAM720にロードする。そして、構造・意味解析部(101)が、同じくHDD740に格納されたターゲットCPU命令テーブルを参照し、RAM720にロードしたターゲットプログラムの意味・構造を解析する。
【0020】
図7は、ターゲットCPU命令テーブルの例を示している。このテーブルは、マシン語の先頭のコード+可変部分と、サイズを表すバイト数、ニーモニック、意味、クロックサイクルA,B、及び、抽出フラグで構成される。なお、マシン語は、人間にとって直接的にはその意味を理解するのは難しい。それ故、図示のテーブルには、マシン語に対応するニーモニック(オペコード、オペランド)を示したが、かかるニーモニックがクロックサイクル数の算出に必要なわけではない。あくまで実施形態における技術的意味を助けるために用意したものと理解されたい。また、クロックサイクル数としてA,Bの2種類を示したが、クロックサイクル数Aは、レジスタに即値を格納する等の非条件分岐命令、及び、「条件成立時」の条件分岐命令のクロックサイクル数を示す。一方、クロックサイクル数Bは、条件不成立時の分岐命令のクロックサイクル数を示す。よって、非条件分岐命令には、クロックサイクル数Bに相当するクロックサイクル数が無い。また、一般に、CPUは、プログラムカウンタ(以下、PCと略す)で示される アドレス位置から命令の読み出し、実行すると共に、その際に命令サイズをPCに加算することで、次に読み出す命令をアドレスを更新することを繰り返す。条件分岐命令は、条件が成立した場合に強制的にPCの値を変更し、条件不成立の場合には通常の更新処理を行うものである。それ故、条件成立時には、条件不成立時と比較し、PCの更新に係るクロックサイクルを必要とする。すなわち、条件成立時、不成立時で必要とするクロックサイクル数が異なる。また、抽出フラグは、後述する特定命令抽出部(103)が、ターゲットプログラムから抽出すべき命令であるか否かを示すものであり、“1”が抽出対象であることを示し、“0”は非抽出対象であることを示している。なお、
図7では、1つのテーブルでいくつもの情報を表すようにしているが、複数のテーブル(ファイル)に
図7と同じ内容を表すようにしても良い。例えば、抽出対象命令は、別途ファイルやテーブルで特定されても構わない。
【0021】
ここで、ターゲットCPUが実行するマシン語に対するニーモニックについて若干説明する。「MOV R1, IMM」(Rdのdは1,2,…)は、レジスタRdに即値IMMを代入することを示す。「STW R1, R2, DSP」 は、レジスタR2が示すアドレスに値DSPを加算して得られる(メモリ上の)アドレス位置に、レジスタR1の値を格納することを示す。つまり、DSPはオフセットアドレスを表していると言えば分かりやすい。「LDW R1, R2, DSP」は、レジスタR2が示すアドレスに値DSPを加算で示される(メモリ上の)アドレス位置に格納された値を、レジスタR1に代入することを示す。「BGE R1, R2, DSP」は、条件「R1≧R2」が成立するとき、現在のPCにDSPを加算した値を新PCとする(相対的アドレスDSPへ分岐する)ことを示している。条件が不成立の場合には、PCは条件分岐命令のサイズ分だけ単純増加させるだけである。また、「BLT R1, R2, DSP」は、条件「R1<R2」が成立するとき、相対的アドレスDSPへ分岐することを示している。条件不成立の場合は、PCは条件分岐命令のサイズ分だけ単純増加させるだけである。
【0022】
図8は、HDD740からRAM720に読出された第1のプログラム(ターゲットプログラム)のニーモニック形式で示した図である。実際はマシン語の表現であるが、分かりやすくするためにニーモニック表記にした。また、条件分岐命令については、条件成立時にPCに加算すべき値を示すべきであるが、理解しやすくするため分岐先をラベルを付けて示している。なお、マシン語から、ラベル(図示の表記「Lbl_x」)を付したニーモニック表現にすること自身は周知のものである。図示において、表記Rx は、ターゲットCPUが有するレジスタを表している。Lbl_x はプログラムの分岐先を示すラベルを表している。実際は、条件が成立した場合、 PCに、オペランドで示される値を加算することで、PCを更新することになる。
【0023】
構造・意味解析部101は、
図8に示す第1のプログラム(ターゲットプログラム)の構造、意味を解釈する。そして、命令単位に、その命令の意味の解析結果を生成していく。
図9は、解析結果を模式的に示すものであり、各行の#印より右側がその解釈結果を示している。
【0024】
例えば3行目のニーモニック「STW R5,R1,0」の解釈結果としての『M「R1+0」←R5』は、レジスタR1の値に0を加算した(メモリの)アドレス位置に、レジスタR5の値を代入(格納)することを示している。
【0025】
次に、変数抽出部(102)が、
図9の解釈結果を参照して「変数」を抽出する。変数は、メモリ上に置かれた値であると考えて構わない。それ故、メモリを参照している箇所が変数を利用していると考えて良い。従って、
図9の解釈結果の3行目の「M[R1+0]が変数の代表的なものと考えて良い。変数は、その格納アドレスが異なれば、それらは別の変数であるものとしてみなせる。そこで、変数抽出部(102)は、メモリを参照するアドレス位置が異なる変数を見つけるたびに、i0,i1,i2…と変数を定義していく。
【0026】
図10が変数抽出部(102)による変数抽出結果を示している。#印の右側にi0,i1,i2…で示すのが変数である。
【0027】
特定命令抽出部(103)は、第1のプログラムを解析し、予め指定された特定命令の抽出処理を行う。特定命令は、例えば、戻り先指定分岐、条件付き分岐、戻り先指定条件分岐処理など、実行結果によって実行サイクル数や次実行命令が異なる命令である。本実施形態では、単純に分岐命令を抽出対象とする。
【0028】
図8のプログラムの場合、特定命令抽出部(103)が抽出するのは、次の6個の命令となる。
BGE R2,R3,Lbl1_1 # R2 ≧ R3 then PC ← Lbl_1
BLT R6,R7,Lbl1_2 # R6 < R7 then PC ← Lbl_2
BGE R10,R11,Lbl1_3 # R10 ≧ R3 then PC ← Lbl_3
BNE R15,R2,Lbl1_4 # R15!= R2 then PC ← Lbl_4
JMP LBl_5 # PC←Lbl_5
BLT R5,R6,Lbl_6 # R5 < R6 then PC ← Lbl_6
【0029】
プログラム分割部(104)は、
図8のプログラムを、特定命令情報(103)が抽出した各特定命令を区切りとする複数の部分プログラムに分割する。なお、最後の特定命令から、プログラムの終端までは、例外的に部分プログラムとする。従って、プログラム分割部(104)は、
図8のプログラムから7つの部分プログラムを生成することになる。
【0030】
また、プログラム分割部(104)は、各部分プログラムのサイクル数を算出する。各命令のクロックサイクル数は、ターゲットCPUの命令テーブル(
図7参照)を参照することで得られるので、その累積加算結果がその部分プログラムのクロックサイクル数となる。
【0031】
図11(a)乃至(c)、
図12(a)乃至(d)は、プログラム分割部(104)で生成された部分プログラム(部分プログラム1乃至7)である。各部分プログラムの下段には、その部分プログラムの実行時のクロックサイクル数を示している。
図7(a)の部分プログラム1のクロックサイクル数「15,16」とあるのは、その部分プログラムの最後の命令「BGE R2,R3,Lbl1_1」における条件「R2≧R3」が不成立の場合のクロックサイクル数が15、成立の場合のクロックサイクル数が16であることを示している。他の部分プログラムも同様である。ただし、部分プログラム5(
図12(b))、部分プログラム7には、条件分岐命令が含まれていないいので、要求されるクロックサイクルは1種類のみとなる。
【0032】
部分プログラム接続・移行フローの生成部(105)は、構造・意味情報、部分プログラムサイクル数データから、部分プログラム接続・移行フローを生成する。
図2は、部分プログラム接続・移行フローデータ記載事項を説明するチャートである。図示のごとく、部分プログラム1乃至7それぞれに」ついて、所要クロックサイクル数、部分プログラム間の遷移についての情報が記述される。なお、
図2における分岐判断が、各部分プログラムの終端の条件分岐命令に相当する。条件分岐の条件が成立する場合がyes、不成立の場合がNoである。換言すれば、条件が成立する場合には、クロックサイクル数が多い方が選択され、条件が不成立の場合にはクロックサイクル数が少ない方が選択されるものとみることもできる。
【0033】
逆コンパイル部(106)は、構造・意味解析部(101)で得られた解析結果(
図8)、変数抽出部(102)で得られた変数抽出結果(
図10)から、ターゲットプログラムと実質的に等価の第2のプログラムを生成する。実施形態における逆コンパイル部(106)は、特定のマイクロコンピュータ・CPU・DSP等に依存しない言語で第2のプログラムのソースを記述する。実施形態では、この言語としてC言語を用いるものとする。
【0034】
図13は、逆コンパイル部(106)が生成した第2のプログラムの例を示している。
図13におけるプログラムにおいて、変数i0,i1,i2,i3,i4は抽出した変数でもある。そして、意味解析結果に基づきforループで既出しているのが、同図である。
【0035】
フラグ生成処理付加部(107)は、上記の逆コンパイル部(106)が生成した第2のプログラムと、先に説明した特定命令情報から、特定命令実行に関するフラグを生成するための第3のプログラムを生成する。この第3のプログラムは、要するに、
図2のプログラムを実行した際に、各分岐の真理値であるフラグを生成するプログラムと言えば分かりやすい。
【0036】
図14は、フラグ生成処理付加部(107)が生成した第3プログラムのソースを示している。分かりやすいように、「//」の右側にコメントを付した。また、printf関数内に記述されている文字列「BP_x 0」または「BP_x 1」における後端の0、1はそれぞれ条件が不成立、成立のいずれかを示すフラグを示している。なお、文字列「BP_x」は、どのステップのprintf関数で出力されたかを示すためであって、実際には不要である。
【0037】
コンパイル部(108)は、この第3のプログラムをコンパイルする。このコンパイルで生成される実行形式プログラムは、CPU710が実行できるものである。そこで、第3のプログラム実行部(109)がコンパイルしたプログラムを実行する。この実行の結果、以下のような結果が得られる。
BP_1 0
BP_1 0
:
各行の最後の0、1が、目的とするフラグであるので、それらフラグを出現順に接続することで、以下のフラグ系列を得ることができる。
“00101100110010”
ここで、1は条件成立、0が不成立を示していることになるのは、これまでの説明から明らかである。
【0038】
サイクル数積算部(110)は、得られたフラグ系列を、部分プログラム接続・移行フローに適用し、その際の各部分プログラムの追跡し、その際のクロックサイクル数を累積加算していくことで、第1のプログラムの実行クロックサイクル数を算出する。
【0039】
例えば、フラグ系列の最初のフラグは0である。故に、
図2のフローチャートに従えば、最初の部分プログラム1の条件分岐命令の条件が不成立となることを示すので、部分プログラム1の実行クロックサイクル数は「15」と確定する。しかも、次に部分プログラム2に移行することも確定する。フラグ系列の2番目のフラグも0である。従って、部分プログラム2の条件分岐命令の条件が不成立となることを示すので、部分プログラム2の実行クロックサイクル数は「16」と確定する。しかも、次に部分プログラム3に移行することも確定する。以下同様に、フラグ系列に従って、各部分プログラムのクロックサイクル数を確定していく。
【0040】
本実施形態の場合、部分プログラム1乃至7を、P1,P2…と表現したとき、先に示したフラグ系列に従うと、部分プログラムの実行シーケンスは次のようになる。
P1→P2→P3→P3→P4→p6→p2→p3→p4→p6→p2→p3→p4→p6→p7
このシーケンスにおけるプログラム開始から終了までのクロックサイクルとその合計は次のようになる。
15+16+25+24+7+14+16+24+7+14+16+24+7+13+4 = 226
よって、サイクル数積算部(110)が、「226」を、ターゲットプログラムの実行クロックサイクル数として出力する。出力先はファイルとして出力しても良いし、表示画面に表示しても良く、出力先は問わない。
【0041】
以上説明したように本実施形態によれば、ターゲットデバイスのターゲットCPUが実行するターゲットプログラムを格納したファイル、ターゲットCPUが解釈実行する命令と、各命令のクロックサイクル、並びに、命令の意味を有する命令セットテーブルを格納したファイル(
図7参照)があれば、ターゲットデバイスとは異なるハードウェアや異なる環境(異なるCPU)であっても、精度よく実行クロックサイクル数を算出できる。
【0042】
なお、実施形態では、特定命令抽出部が抽出する命令として分岐命令としたが、プログラムカウンタを操作する命令が望ましい。例えば、プログラムカウンタをプッシュし、書き換えるサブルーチンコール命令(条件の有無を問わない)、ソフトウェア割り込み命令、プログラムカウンタをポップするリターン命令等を含めても良い。
【0043】
また、本発明の技術内容の理解を容易にするために、簡単な例で示した。実際の電子機器を開発する場合のターゲットプログラムのサイズは、実施形態で示したものよりも遥かに大きなものとなる。また、実際のターゲットプログラムは、そのターゲットプログラム内で閉じた環境で実行するのではなく、外部環境パラメータや外部データに依存して実行することも多い。例えば、画像データを符号化するターゲットプログラムの場合には、符号化対象の画像データを参照して符号化データを生成することになるだろうし、その際の符号化シーケンスは、その符号化対象の画像データに依存したものとなる。そのような場合には、クロックサイクル数算出を行う情報処理装置に、符号化対象の画像データを予め用意した上で、上記の第2のプログラム、第3のプログラムを作成することになろう。
【0044】
また、実施形態における逆コンパイル部で生成するプログラムの言語をC言語、第3のプログラムもC言語を例にして説明したが、利用するコンピュータ言語はこれに限らない。また、第3のプログラムをコンパイルする例を示したが、CPU720の処理能力が十分である、もしくはターゲットプログラムのサイズが許容できるサイズである場合には、第3のプログラムを他の高級言語で表現し、インタープリタにより実行しても構わない。
【0045】
以上、抽出する特定命令を条件付き分岐命令、取得する属性情報を分岐条件の成立・不成立を表すフラグとして実施例を説明したが、本提案は命令の実行サイクル数が実行状況に応じて定まる命令を有するプログラムの実行サイクル数算出について有効である。
【0046】
例えば、前記特定のマイクロコンピュータ、CPU等がキャッシュメモリを含むメモリシステムを構成要素としている場合も有効である。キャッシュメモリへのヒット・ミス、あるいはキャッシュメモリ操作命令によりプログラムの実行クロックサイクル数が変化する。この場合、抽出する特定命令をロード・ストア命令、生成する属性情報を前記キャッシュメモリに対するヒット・ミスに関するフラグ情報、あるいはメモリアドレスとすれば同様に、実際の実行サイクル数を算出できる。
(その他の実施例)
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。