DOC_piraw.jp 1.99 KB

        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 );