SYFBR syFbrInitEx( pfbuf, num, pintStack, pParam )
Void* pfbuf
Sint32 num
Void* pIntStack
Void* pParam
pfbuf ファイバライブラリが使用する領域のアドレス num 使用するファイバの数 pIntStack 割り込みスタック底のアドレス pParam メインファイバのファイバデータ
非SYD_FBR_NULL 正常終了:メインファイバのハンドル SYD_FBR_NULL 異常終了
ファイバライブラリの初期化を行います。具体的には以下の項目を実行します。
ファイバライブラリが使用する領域には、SYD_FBR_FBRSIZE(*1) × ファイバ数(num) バイトの領域をユーザ側で確保して指定してください。
- ファイバライブラリの内部データを初期化します。
- 割り込みハンドラの使用するスタックのアドレスを指定します。
- 現在実行中の関数(メイン関数)をファイバ(メインファイバ)化しそのハンドルを返します。
(*1) sizeof(SYS_FBR_INFO)また、numにはメインファイバ(syFbrConvertThreadToFiber()関数もしくはsyFbrInitEx()関数により実行中の関数をファイバ化したファイバ)の数を含みます。 引数pIntStackには、syHwInit()関数の引数に指定した割り込みハンドラが使用するスタックの底のアドレスを設定してください。 この指定が正しくないと、syFbrDelayedSwitchToFiber()関数が正常に動作しません。
この関数が異常終了する原因は、パラメータ不正(pfbufがNULL、numが0、pintStackがNULL)の場合です。
#define FIBERS (2) #define INTSTACK_SIZE (20*1024) Uint32 gIntStackBuf[INTSTACK_SIZE/sizeof(Uint32)] ; SYS_FBR_INFO gFiberInfo [FIBERS] ; SYFBR gFiberMain = NULL ; ... { ... /* ハードウェアの初期化 */ syHwInit(&gIntStackBuf[INTSTACK_SIZE/sizeof(Uint32)); /* ファイバーの初期化 */ gFiberMain = syFbrInitEx(gFiberInfo,FIBERS, &gIntStackBuf[INTSTACK_SIZE/sizeof(Uint32)], NULL) ; ... }
この関数は、通常sbInitSystem()関数で実行されます。この関数の戻り値であるメインファイバのハンドルは、syFbrGetMainFiber()関数でも取得できます。
syFbrInit() ファイバライブラリの初期化 syFbrConvertThreadToFiber() 現在実行中の関数をファイバ(メインファイバ)に変換 syFbrGetMainFiber() メインファイバのハンドルを取得 syFbrGetFiberData() 実行中のファイバのファイバデータを取得 syFbrDelayedSwitchToFiber() 割り込みを契機としたファイバの切り替え