DOC_piraw.jp
1.99 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
Pi/EPiのRaw関数の内部関数化について
1. 従来の問題点
Pi/Epi の Raw 関数、すなわち osPiRawReadIo, osPiRawWriteIo,
oEPiRawReadIo, oEPiRawWriteIo, osPiRawStartDma, osEPiRawStartDma
は関数実行中に割り込みがかかり、処理が他のスレッドに移り、そのス
レッドで Pi をアクセスした場合に、Pi が Busy の状態でアクセスを
行って誤ったデータを読んでしまう可能性があります。
2. 今回の修正について
この問題は Raw でない関数、すなわち osPiReadIo, osPiWriteIo,
oEPiReadIo, oEPiWriteIo, osPiStartDma, osEPiStartDma では発生し
ません。
そこで今回のパッチで、Pi/Epi の Raw 関数を全て内部関数とし、ゲー
ム中では原則としてこれらの関数を使用しないことで問題の発生を防ぐ
こととしました。
これにより、従来の Raw 関数は以下のように名称が変更になりました。
osPiRawReadIo ->__osPiRawReadIo
osPiRawWriteIo ->__osPiRawWriteIo
oEPiRawReadIo ->__oEPiRawReadIo
oEPiRawWriteIo ->__oEPiRawWriteIo
osPiRawStartDma ->__osPiRawStartDma
osEPiRawStartDma ->__osEPiRawStartDma
いままでこれらの Raw 関数を使用されていた場合、原則として Raw で
ない関数を使用してください。
3. Raw 関数の使用について
もし、何らかの理由で Raw 関数を使用する必要がある場合には、以下
の extern 宣言を行うことで Raw 関数を使用可能です。
しかし上記の問題がありますので、使用時にはゲーム中で特定のスレッ
ドからのみ Pi にアクセスする等の注意が必要です。
extern s32 __osPiRawWriteIo(u32, u32);
extern s32 __osPiRawReadIo(u32, u32 *);
extern s32 __osEPiRawWriteIo(OSPiHandle *, u32 , u32);
extern s32 __osEPiRawReadIo(OSPiHandle *, u32 , u32 *);
extern s32 __osPiRawStartDma(s32, u32, void *, u32);
extern s32 __osEPiRawStartDma(OSPiHandle *, s32 , u32 ,
void *, u32 );