osSpTaskLoad.htm 7.18 KB
<HTML>

<HEAD>

<TITLE>HTML 文書</TITLE>

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

<BODY>

<P>
<B><FONT FACE="Arial">osSpTaskLoad(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osSpTaskLoad, osSpTaskStartGo, osSpTaskStart, osSpTaskYield,
osSpTaskYielded
<P>
→ SPタスクのスタートとyield <BR>

<P>
<B>構文<BR>
</B>
<P>
#include &lt;ultra64.h&gt;
<P>
void osSpTaskLoad(OSTask *task);
<P>
s32 osSpTaskStartGo(OSTask *task);
<P>
s32 osSpTaskStart(OSTask *task);s32 osSpTaskYield(void);
<P>
OSYieldResult osSpTaskYieled(OSTask *task);<BR>

<P>
<B>説明<BR>
</B>
<P>
これらの関数はCPUホストから呼び出すSPタスクを管理します。タスクはOSTaskストラクチャによって具体的に表現され、タスクフィールドは後述の指定方法に従って記述します。タスクが完了すると、SPがCPUに割り込み、OS_EVENT_SPイベントを発生させます。アプリケーションは<A HREF="osSetEventMesg.htm" >osSetEventMesg</A>(3P)
コールでこのイベントとメッセージ待ち行列を結びつけておきます。さらに、グラフィクスタスクディスプレイリストはDPがCPUに割り込む原因となる<A HREF="../gdp/gDPFullSync.htm" >gDPFullSync</A>(3P)
で完了するべきです。osSetEventMesgでメッセージに結びつけられるイベントはOS_EVENT_DPです。
<BR>
</FONT>
<P>
<B>osTaskLoad</B>関数は指定されたタスクをSP内にロードします。そのためには一般的にSPが実行されていない状態にしておかなければなりません。もしこれが新しいタスクならば、OSTaskストラクチャメンバーはアプリケーションによってイニシャライズされる必要があります。
<BR>
</FONT>
<P>
<B>osSpTaskStartGo</B>関数はSPにタスクの実行を開始させます。
<BR>
</FONT>
<P>
<B>osSpTaskStart</B>マクロは<B>osSpTaskStartGo</B>に続いて<B>osSpTaskLoad</B>を実行します。
<BR>
</FONT>
<P>
<B>osSpTaskYield</B>はSP&quot;yield&quot;をリクエストします。yieldはグラフィクスタスクを再開できるポイントでストップさせることです。yieldしている間、SPは<B>osSpTaskStart</B>にコールして再びスタートさせるための状態にセーブしておきます。現在はグラフィクスタスクのみがyieldできます。yieldは主に,オーディオタスクを実行する必要が生じたときにグラフィクスタスクをポーズさせるために使用します。
<BR>
</FONT>
<P>
<B>osSpTaskYielded</B>関数はタスクストラクチャの適切な状態を保つためにyieldをリクエストした後にコールされなければなりません。加えて、タスクのyieldが成功すれば、OS_TASK_YIELDEDが返ります。そうでない場合は0を返します。それはyieldする前にタスクが通常に終了し、それ故後で再開しなくてすんだことを意味しています。
<BR>
</FONT>
<P>
OSTaskストラクチャメンバーは以下のように定義されています。
<BR>

<P>
<B>t.type</B>
<P>
タスクタイプ:オーディオタスクの場合はM_AUDTASKに、グラフィクスタ
スクの場合はM_GFXTASKにイニシャライズされます。
<P>
<B>t.flags</B>
<P>
タスクステートビットの種類。OS_TASK_DP_WAITはブートマイクロコードが
現在のコマンド列をRDPが吐き出すのを待つようにセットするようなときに
もっともよく使用されます。
<P>
これはXBUSを使用したり、RDP入力列を切り替えたりするときに必要ですが、
オーディオタスクや&quot;_fifo&quot;バージョンのグラフィクスタスクを使用するときに
は必要ありません。
<P>
<B>t.ucode_boot</B>
<P>
ブートマイクロコードへのポインタで,rspbootTextStartにイニシャライズされます。
<P>
<B>t.ucode_boot_size</B>
<P>
ブートマイクロコードサイズへのポインタで,
<P>
((u32)rspbootTextEnd - (u32)rspbootTextStart)にイニシャライズされます。
<P>
<B>t.ucode</B>
<P>
タスクマイクロコードへのポインタです。グラフィクスタスクの場合は
<P>
gspFast3DTextStart, gspFast3D_dramTextStart, gspFast3D_fifoTextStart,

<P>
gspLine3DTextStart, gspLine3D_dramTextStart, gspLine3D_fifoTextStartの内のいずれかをセットしてください。オーディオタスクの場合はaspMainTextStartを
セットしてください。
<P>
<B>t.ucode_size</B>
<P>
マイクロコードサイズです。SP_UCODE_SIZEにイニシャライズされます。
<P>
<B>t.ucode_data</B>
<P>
マイクロコードデータへのポインタです。グラフィクスタスクの場合は
<P>
gspFast3DDataStart, gspFast3D_dramDataStart, gspFast3D_fifoDataStart,

<P>
gspLine3DDataStart, gspLine3D_dramDataStart, gspLine3D_fifoDataStartの内のいずれかをセットしてください。オーディオタスクの場合はaspMainDataStartをセットしてください。
<P>
<B>t.ucode_data_size</B>
<P>
マイクロコードデータのサイズです。SP_UCODE_DATA_SIZEにイニシャライズされます。
<P>
<B>t.dram_stack</B>
<P>
DRAMマトリクススタックへのポインタです。オーディオタスクの場合は0にイニシャライズされ、グラフィクスタスクの場合はSP_DRAM_STACK_SIZE8バ
イトのメモリ領域にイニシャライズされます。
<P>
<B>t.dram_stack_size</B>
<P>
DRAMマトリクススタックサイズbyte。オーディオタスクの場合は0に、グラ
フィクスタスクの場合はSP_DRAM_STACK_SIZE8にイニシャライズされます。
<P>
<B>t.output_buff</B>
<P>
アウトプットバッファへのポインタです。グラフィクスマイクロコードの
&quot;_dram&quot;,&quot;_fifo&quot;バージョンはDPよりむしろDRAMにSPからアウトプットされ
ます。このマイクロコードを使用したときに、このポインタはSPがDPコマ
ンドリストを書き込むメモリ領域を指します。
<P>
&quot;_dram&quot;バージョンのマイクロコードではこのバッファはRSPによって生成されるDPデータ列と同じくらいか、それ以上の大きさが必要です。&quot;_fifo&quot;バー
ジョンのマイクロコードでは,最低0x100Byteのバッファを必要とします。そ
れ以上のバッファでも、よりよいパフォーマンスが得られます。
<P>
<B>t.output_buff_size</B>
<P>
&quot;_dram&quot;バージョンのマイクロコードでは,これはu64タイプのアウトプットバッファ長へのポインタです。SPはこの位置にDPコマンドリストのサイズを
バイトでライトします。マイクロコードの&quot;_fifo&quot;バージョンではこれはアウト
プットバッファ中の最後のバイトに続くバイトへのポインタです。その他のマ
イクロコードではt.output_buff_sizeフィールドは無視されます。
<P>
<B>t.data_ptr</B>
<P>
SPコマンドリストポインタ。グラフィクスタスクではこれはディスプレイリストが作成されているアプリケーションです。オーディオタスクではこのコマ
ンドリストはalAudioFrame(3P)によって生成されます。
<P>
<B>t.data_size</B>
<P>
SPコマンドリストの長さをバイトで表します。 <BR>

<P>
<B>t.yield_data_ptr</B>
<P>
yieldするタスクのステートをストアするためのバッファへのポインタです。
アプリケーションがグラフィクスタスクのプリエンプションをサポートする時
には、グラフィクスタスクはこの構造体のメンバーのセットを持ちます。これ
はOS_YIELD_DATA_SIZEbyteのサイズのメモリ領域を指します。タスクプリエ
ンプションをアプリケーションでサポートしていなければ、このフィールドは
0にイニシャライズされます。オーディオタスクは常にこのフィールドを0に
セットします。
<P>
<B>t.yield_data_size</B>
<P>
yieldバッファサイズをbyteで示します。タスクのyieldがアプリケーションで
サポートされているとき、グラフィクスタスクではこのフィールドは
OS_YIELD_DATA_SIZEにイニシャライズされます。オーディオタスクではこの
フィールドは0にセットしてください。
<P>
dram_stack, output_stack, output_buff_size, yield_data_ptrポインタはデータキャッシュラインの総数になっているメモリ範囲を指します。それらは16byteバウンダリに合わせておかなければなりません。メモリ領域がキャッシュアラインでなければ、CPUプログラム変数もまたシェアする可能性があります。CPUキャッシュの通常のオペレーション中では、データキャッシュラインはライトバックされるかSPによって前に書かれたデータに上書きするかします。<A HREF="OS_DCACHE_ROUNDP_ADDR.htm" >OS_DCACHE_RUNDUP_ADDR</A>(3P)に記述されているマクロは使用されますが、もっともシンプルなアライン方法はそれらのメモリ領域がそれら自身を再配置可能な&quot;.o.&quot;にそれらのそれぞれのスペースを確保することです。
<BR>
<BR>

</BODY>

</HTML>