osProfile.htm 5.35 KB
<HTML>

<HEAD>

<TITLE>HTML 文書</TITLE>

<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>

<BODY>

<P>
<B><FONT FACE="Arial">osProfile(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osProfileInit, osProfileStart, osProfileStop, osProfileFlush
<P>
→ 互いに共通元を持たないテキストスペースのための実行時間プロフィール。
<BR>

<P>
<B>構文<BR>
</B>
<P>
#include &lt;ultra64.h&gt;
<P>
void osProfileInit(OSProf *profp, u32 profcnt);
<P>
void osProfileStart(u32 microseconds);
<P>
void osProfileStop(void);
<P>
void osProfileFlush(void);<BR>

<P>
<B>説明<BR>
</B>
<P>
プロファイルをとることは互いに共通元を持たないテキストスペース内のプログラムによって費やされたCPU時間の総計のプロファイルによって、CPU使用統計を供給します。
<BR>

<P>
プロファイルは現在のプロセスの実行ヒストグラムを生成することによって統計を作成します。ヒストグラムはprofpアレイ(profp[0],
profp[1], ... , profp[profcnt-1])のメンバーによって指定されたプロファイルされるべきプログラムコード領域のリストによって定義します。ホスト側のアプリケーションgperf(1P)はホストにヒストグラムデータをコピーし、それぞれのファンクションを実行するのに費やされた相対時間の詳細のレポートをプリントします。
<BR>

<P>
OSProfデータストラクチャは以下の要素によって構成されています。
<BR>

<P>
<B>u16 *histo_base</B>
<P>
u16カウンタアレイへのポインタ
<P>
<B>u32 histo_size</B>
<P>
histo_baseバッファ中のカウンタ数。適切なプロファイリングはセグメント中の
それぞれ32wordからなる1つのカウンタを必要とします。
<P>
<B>u32 *text_start</B>
<P>
プロファイルするためのセグメント中のファーストインストラクションへのポ
インタ
<P>
<B>u32 *text_end</B>
<P>
プロファイルするためのセグメント中のラストインストラクションへのポイン
<BR>

<P>
それぞれのprofエントリはプロファイルしたいテキストスペースの領域を指定します。もしインストラクションがprofpアレイによって指定された範囲に入らなければ、内部32bitオーバーフローカウンタはインクリメントされます。
<BR>

<P>
osProfileInitはプロファイルされたセグメントカウントバッファをイニシャライズし、gperf(1P)によってリクエストされたときにホストにプロファイルデータを伝達するI/Oスレッドをスタートします。ユーザーはOSProfストラクチャ、profp、プロファイルしたいセグメントの記述のそれぞれの要素の集合体にポインタをパスします。profcntパラメータはプロファイルされたセグメントの数を示します。osProfileInitはそれぞれのプロファイルされたセグメントのためのカウンタをクリアします。スレッドはgperf(1P)からのプロファイルデータのためのリクエストを供給するためにスタートします。プロフィールデータはosProfileInitがコールされた後いつでもホストにダンプすることができます。osProfileInitは他のプロファイラファンクションのどれよりも先にコールしてください。
<BR>

<P>
osProfileStartファンクションはプロファイラ間のカウンタをスタートするためにコールされます。microsecondsパラメータはこのタイマの周期をセットするために使用されます。標準的な数値は10000マイクロ秒(10ミリ秒)です。タイマ周期の最小値はPROF_MIN_INTERVALによって定義されています。常に割り込みはカウンタによって発生し、プロファイラはPCが所属するプロファイルされたセグメントを決定し、このセグメントのためのカウンタバッファ中の適切なカウンタをインクリメントします。もしPCがプロファイルされたセグメントのいずれの中にもなければ、内部オーバーフローレジスタはインクリメントされます。カウンタオーバーフローのためのプロテクションはありません。
<BR>

<P>
osProfileStopファンクションはプロファイリングを止めるためにコールされます。プロファイリングデータはメモリ内に残りますが、それ以上にインクリメントされることはありません。ホストへプロファイルデータを送信するためにosProfileInitによって開始されたスレッドは実行し続けます。プロファイルを再びコールすることも可能です。
<BR>

<P>
osProfileFlushはサーバーモードで実行することを想定しているgperf(1P)プログラムへプログラマティックにプロファイルデータの転送を実行するために使用します。gperf(1P)はまたプログラム実行中(サーバーモードではない。)のいつでも、プロファイラのI/Oスレッドにリクエストを送ることができます。
<BR>

<P>
以下に示すエラーはデバッグライブラリを使用しているときにレポートされます。
<BR>

<P>
<B>ERR_OSPROFILEINIT_STR</B>
<P>
プロファイルカウンタが実行中です。初期化する前にosProfileStopをコールし
てください。
<P>
<B>ERR_OSPROFILEINIT_CNT</B>
<P>
profcnt値が異常です。
<P>
<B>ERR_OSPROFILEINIT_ALN</B>
<P>
histo_baseポインタは32bit配列でなければなりません。
<P>
<B>ERR_OSPROFILEINIT_ORD</B>
<P>
text_startがtext_end以上の値です。
<P>
<B>ERR_OSPROFILEINIT_SIZ</B>
<P>
histo_sizeが異常なサイズです。
<P>
<B>ERR_OSPROFILESTART_TIME</B>
<P>
microseconds値がPROF_MIN_INTERVALよりも小さいです。
<P>
<B>ERR_OSPROFILESTART_FLAG</B>
<P>
プロファイリングはすでに開始されています。
<P>
<B>ERR_OSPROFILESTOP_FLAG</B>
<P>
プロファイリングはすでに終了しています。
<P>
<B>ERR_OSPROFILESTOP_TIMER</B>
<P>
終了すべきプロファイルタイマがありません。<BR>

<P>
<B>バグ<BR>
<B></B></B>gperfが予期せぬ結果を招き、遅くて実行出来ない場合は、<B>osProfileFlush</B>をコールしてください。
<P>
・gperf(およびプロファイリング)は、いずれかの最適化のための実行可能オブジェクトを再配置している関数プログラムと一緒には動作しません。
<BR>
・現在、プロファイリングは16bitカウンタのみサポートしています。32-bitカウンタも使用する方が便利でしょう。
<P>
・プロファイリングは、liburtra_romライブラリでは、利用できません。
<P>
・OSProf配列中のtextセグメントの重複をチェックできません。<BR>

<P>
<B>参照<BR>
</B>
<P>
<A HREF="../tool/gperf.htm">gperf</A>(1P), <A HREF="../tool/makerom.htm">makerom</A>(1P)
<BR>

</BODY>

</HTML>