osSpTaskYielded.htm
7.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
<HTML>
<HEAD>
<TITLE>HTML 文書</TITLE>
<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>
<BODY>
<P>
<B><FONT FACE="Arial">osSpTaskYielded(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osSpTaskLoad, osSpTaskStartGo, osSpTaskStart, osSpTaskYield,
osSpTaskYielded
<P>
→ SPタスクのスタートとyield <BR>
<P>
<B>構文<BR>
</B>
<P>
#include <ultra64.h>
<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"yield"をリクエストします。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が吐き出すのを待つようにセットするよ
うなときにもっともよく使用されます。これはXBUSを使用したり、RDP入力
列を切り替えたりするときに必要ですが、オーディオタスクや"_fifo"バージョ
ンのグラフィクスタスクを使用するときには必要ありません。
<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>
アウトプットバッファへのポインタです。グラフィクスマイクロコードの
"_dram","_fifo"バージョンはDPよりむしろDRAMにSPからアウトプットされ
ます。このマイクロコードを使用したときに、このポインタはSPがDPコマ
ンドリストを書き込むメモリ領域を指します。"_dram"バージョンのマイクロ
コードではこのバッファはRSPによって生成されるDPデータ列と同じくらい
か、それ以上の大きさが必要です。"_fifo"バージョンのマイクロコードでは,
最低0x100Byteのバッファを必要とします。それ以上のバッファでも、よりよ
いパフォーマンスが得られます。
<P>
<B>t.output_buff_size</B>
<P>
"_dram"バージョンのマイクロコードでは,これはu64タイプのアウトプット
バッファ長へのポインタです。SPはこの位置にDPコマンドリストのサイズを
バイトでライトします。マイクロコードの"_fifo"バージョンではこれはアウト
プットバッファ中の最後のバイトに続くバイトへのポインタです。その他のマ
イクロコードではt.output_buff_sizeフィールドは無視されます。
<P>
<B>t.data_ptr</B>
<P>
SPコマンドリストポインタ。グラフィクスタスクではこれはディスプレイリ
ストが作成されているアプリケーションです。オーディオタスクではこのコマ
ンドリストはalAudioFrame(3P)によって生成されます。
<P>
<B>t.data_size</B>
<P>
SPコマンドリストの長さをバイトで表します。
<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)に記述されているマクロは使用されますが、もっともシンプルなアライン方法はそれらのメモリ領域がそれら自身を再配置可能な".o."にそれらのそれぞれのスペースを確保することです。
<BR>
</FONT>
</BODY>
</HTML>