`割込み管理`

`[C]` `def_int``（割込みハンドラ定義）`

`・既に存在する割込みハンドラの再定義も可能`

`・管理ブロックの確保`

`・静的な定義も可能`

`Ｃ言語関数`

`ER ercd = def_int( UINT dintno, T_DINT *pk_dint );`

`引数`

`UINT　　　 dintno　　 割込み定義番号`

`T_DINT*　　pk_dint　　割込みハンドラ定義情報（NADR = -1(前回の割込みハンドラの終了)）`

`pk_dintの中身`

`ATR　　　　intatr　　 割込みハンドラ属性（TA_ASM(アセンブラ) or TA_HLNG(高級言語)）`

`FP　　　　 inthdr　　 割込みハンドラアドレス`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_NOMEM　　 管理ブロック用が確保できない`

`E_RSATR　　 intatrが不正`

`E_RAR　　　 dintno、pk_dint、inthdrが不正`

`[R]` `ref_int``（割込みハンドラから復帰）`

`・割込みハンドラの途中にディスパッチ遅延によって遅延された処理をまとめて行う`

`・CPUで直接起動するのでレジスタの管理が必要（アセンブラに限る）`

`・エラーの確認を行うときはエラーログを残す必要がある`

`Ｃ言語関数`

`void ret_int( );`

`引数`

`戻り値`

`戻らない。`

`エラーの内容`

`E_CTX　　　 割込みハンドラ以外から発行（インプリメント依存）`

`[E]` `ret_wup``（割込みハンドラ復帰とタスク）`

`・指定タスクが起床待ちのとき待機解除して、自タスクを終了する`

`・指定タスクが起床待ちではないときTCBの起床要求キューイング数(wupcnt)を増やす`

`Ｃ言語関数`

`void ret_wup( ID tskid );`

`引数`

`ID　　　　 tskid　　　起床タスクＩＤ`

`戻り値`

`戻らない。`

`エラーの内容`

`E_ID　　　　tskidが不正あ`

`E_NOEXS　　 tskidのタスクが存在しない`

`E_OBJ　　　 指定タスクがDORMANT状態`

`E_CTX　　　 割込みハンドラ以外からコールされた（インプリメント依存）`

`E_QOVR　　　キューイング数wupcntのオーバーフロー`

`EN_CTXID　　タスク独立部のタスクから他ノードのタスクを指定`

`[R]` `loc_cpu``（割込みとディスパッチの禁止）`

`・割込みが許可されるまで割込みハンドラが遅延される`

`・ディスパッチが許可されるまでプリエンプト(CPUによる実行権の横取り)は行われない`

`Ｃ言語関数`

`ER ercd = loc_cpu( );`

`引数`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_CTX　　　 コンテキストエラー（タスク独立部から発行）`

`[R]` `unl_cpu``（割込みとディスパッチの許可）`

`・割込みとディスパッチが許可された状態でもE_OK`

`Ｃ言語関数`

`ER ercd = unl_cpu( );`

`引数`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_CTX　　　 タスク独立部から発行`

`[C]` `dis_int``（割込み禁止）`

`Ｃ言語関数`

`ER ercd = dis_int( UINT eintno );`

`引数`

`UINT　　　 eintno　　 割込み許可番号`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 パラメータエラー（eintnoが不正あるいは利用できない）`

`[C]` `ena_int``（割込み許可）`

`・特別なeintnoを指定すると、すべての割込みに許可を与えることができる（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = ena_int( UINT eintno );`

`引数`

`UINT　　　 eintno　　 割込み許可番号`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 eintnoが不正`

`[C]` `chg_iXX``（割込みマスク（レベル、優先度）変更）`

`・XXには使用CPUの名前を入れる`

`Ｃ言語関数`

`ER ercd = chg_iXX( UINT iXXXX );`

`引数`

`UINT　　　 iXXXX　　　割込みマスク（レベル、優先度）`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 iXXXXが不正`

`[C]` `ref_iXX``（割込みマスク（レベル、優先度）参照）`

`・XXには使用CPUの名前を入れる`

`Ｃ言語関数`

`ER ercd = ref_iXX( UINT *p_iXXXX );`

`引数`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`UINT　　　 iXXXX　　　割込みマスク（レベル、優先度）`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 パラメータエラー（eintnoが不正あるいは利用できない）`

`メモリプール管理`

`[E]` `cre_mpl``（可変長メモリプール生成）`

`・管理ブロックとメモリプール領域を確保する`

`Ｃ言語関数`

`ER ercd = cre_mpl( ID mplid, T_CMPL *pk_cmpl );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`T_CMPL*　　pk_cmpl　　可変長メモリプール生成情報`

`pk_cmplの中身`

`VP　　　 　exinf　　　拡張情報`

`ATR　　　　mplatr　　 メモリプール属性(``メモリ獲得待ちのキューイングはTA_TFIFO(FIFO) || TA_TPRI(優先度順、レベルＸ)）`

`INT　　　　mplsz　　　メモリプールの大きさ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_NOMEM　　 管理ブロックやメモリプール領域が確保できない`

`E_RSATR　　 mplatrが不正`

`E_RAR　　　 pk_cmplが不正、mplszが負または不正`

`E_ID　　　　mplidが不正`

`E_OBJ　　　 mplidの可変長メモリプールが既に存在`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `del_mpl``（可変長メモリプール削除）`

`・管理ブロックとメモリプール領域を解放する`

`・メモリプールでメモリ獲得待ちのタスクにはE_DLT`

`・メモリプールに複数のメモリ獲得待ちある場合、削除後の同優先度の順序はインプリメント依存`

`Ｃ言語関数`

`ER ercd = del_mpl( ID mplid );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `get_blk``（可変長メモリブロック獲得）`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったとき、メモリ獲得待ちになり行列に並ぶ`

`・メモリを獲得出来なかった場合、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = get_blk( VP *p_blk, ID mplid, INT blksz );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`INT　　　　blksz　　　メモリブロックの大きさ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blk　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 blkszが負または不正`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行`

`E_DLT　　　 待機中にメモリプールが削除された`

`E_RLWAI` `待機中に待機強制解除(rel_wai)を受け付け`

`[E]` `pget_blk``（可変長メモリブロック獲得（ポーリング））`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったときE_TMOUT`

`・メモリを獲得出来なかった場合、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`・タスク独立部やディスパッチ禁止状態のタスクからも実行可能（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = pget_blk( VP *p_blk, ID mplid, INT blksz );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`INT　　　　blksz　　　メモリブロックの大きさ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blk　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 blkszが負または不正`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行（インプリメント依存）`

`E_TMOUT　　 ポーリング失敗`

`[E]` `tget_blk``（可変長メモリブロック獲得（タイムアウト有））`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったとき、メモリ獲得待ちになり行列に並ぶ、tmout経過後E_TMOUT`

`・メモリを獲得出来なかった場合、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`・tmoutがTMO_POLならばpget_blk、TMO_FEVRならばget_blk`

`・tmout=TMO_POLではタスク独立部やディスパッチ禁止状態のタスクからも実行可能（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = tget_blk( VP *p_blk, ID mplid, INT blksz, TMO tmout );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`INT　　　　blksz　　　メモリブロックの大きさ`

`TMO　　　　tmout　　　タイムアウト時間（TMO_POL = 0(0)、TMO_FEVR = -1(∞)）`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blk　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 tmout≦(-2)、blkszが負または不正`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行（tmout=TMO_POLに限るインプリメント依存）`

`E_DLT　　　 待機中にメモリプールが削除された`

`E_TMOUT　　 タイムアウト`

`E_RLWAI` `待機中に待機強制解除(rel_wai)を受け付け`

`[E]` `rel_blk``（可変長メモリブロック返却）`

`・返却先は獲得先と同じでなければならない`

`・返却メモリが大きいと複数のタスクが待機解除になる、そのときの同優先度の順序はインプリメント依存`

`Ｃ言語関数`

`ER ercd = rel_blk( ID mplid, VP blk );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ`

`VP　　　　 blk　　　　メモリブロックのアドレス`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 blkが不正、獲得先と異なるmplid`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `ref_mpl``（可変長メモリプール状態参照）`

`Ｃ言語関数`

`ER ercd = ref_mpl( T_RMPL *pk_rmpl, ID mplid );`

`引数`

`ID　　　　 mplid　　　可変長メモリプールＩＤ（TMPL_OS = -4(OSの空きメモリ)レベルＸ、-3〜-2(スタック専用のメモリプール)インプリメント依存）`

`T_RMPL　　 pk_rmpl　　メモリプール状態のアドレス`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`pk_rmplの中身`

`VP　　　 　exinf　　　拡張情報`

`BOOL_ID　　wtsk　　　 待機タスクの有無（FALSE = 0(無し)、0以外待機中の先頭タスクのID(レベルＸ)）`

`INT　　　　frsz　　　 空き領域の大きさ`

`INT　　　　maxsz　　　最大空き領域の大きさ`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 T_RMPLが不正`

`E_ID　　　　mplidが不正`

`E_NOEXS　　 mplidの可変長メモリプールが存在していない`

`E_OACV　　　mplid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `cre_mpf``（固定長メモリプール生成）`

`・管理ブロックとメモリプール領域を確保する`

`Ｃ言語関数`

`ER ercd = cre_mpf( ID mpfid, T_CMPF *pk_cmpf );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`T_CMPF*　　pk_cmpf　　固定長メモリプール生成情報`

`pk_cmpfの中身`

`VP　　　 　exinf　　　拡張情報`

`ATR　　　　mpfatr　　 メモリプール属性``(``メモリ獲得待ちのキューイングはTA_TFIFO(FIFO) || TA_TPRI(優先度順、レベルＸ)）`

`INT　　　　mpfsz　　　メモリプールの大きさ`

`INT　　　　blfsz　　　固定長メモリブロックの大きさ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_NOMEM　　 管理ブロックやメモリプール用の領域が確保できない`

`E_RSATR　　 mpfatrが不正`

`E_RAR　　　 pk_cmpfが不正、mpfsz、blfszが負または不正`

`E_ID　　　　mpfidが不正`

`E_OBJ　　　 mpfidの固定長メモリプールが既に存在`

`E_OACV　　　mpfid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `del_mpf``（固定長メモリプール削除）`

`・管理ブロックとメモリプール領域の解放`

`・メモリプールでメモリ獲得待ちのタスクにはE_DLT`

`・メモリプールに複数のメモリ獲得待ちある場合、削除後の同優先度の順序はインプリメント依存`

`Ｃ言語関数`

`ER ercd = del_mpf( ID mpfid );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_ID　　　　mpfidが不正あるいは利用できない`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜``-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `get_blf``（固定長メモリブロック獲得）`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったとき、メモリ獲得待ちになり行列に並ぶ`

`・メモリを獲得出来なかったとき、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = get_blf( VP *p_blf, ID mpfid );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blf　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_ID　　　　mpfidが不正`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行`

`E_DLT　　　 待機中にメモリプールが削除された`

`E_RLWAI` `待機中に待機強制解除(rel_wai)を受け付け`

`[E]` `pget_blf``（固定長メモリブロック獲得（ポーリング））`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったとき、メモリ獲得待ちになり行列に並ぶ`

`・メモリを獲得出来なかったとき、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`・タスク独立部やディスパッチ禁止状態のタスクからも実行可能（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = pget_blf( VP *p_blf, ID mpfid );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blf　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_ID　　　　mpfidが不正`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行（インプリメント依存）`

`E_TMOUT　　 ポーリング失敗`

`[E]` `tget_blf``（固定長メモリブロック獲得（タイムアウト有））`

`・獲得したメモリの内容は不定`

`・メモリを獲得出来なかったとき、メモリ獲得待ちになり行列に並ぶ、tmout経過後E_TMOUT`

`・メモリを獲得出来なかったとき、後方のタスクに獲得の機会を譲れる（インプリメント依存）`

`・tmoutがTMO_POLならばpget_blf、TMO_FEVRならばget_blf`

`・tmout=TMO_POLではタスク独立部やディスパッチ禁止状態のタスクからも実行可能（インプリメント依存）`

`Ｃ言語関数`

`ER ercd = tget_blf( VP *p_blf, ID mpfid, TMO tmout );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`TMO　　　　tmout　　　タイムアウト時間（TMO_POL = 0(0)、TMO_FEVR = -1(∞)）`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`VP　　　　 blf　　　　メモリブロックのアドレス`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 tmout≦-2`

`E_ID　　　　mpfidが不正`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜-4のメモリプールは利用不可（インプリメント依存）`

`E_CTX　　　 タスク独立部またはディスパッチ禁止状態で実行（tmout=TMO_POLに限る、インプリメント依存）`

`E_DLT　　　 待機中にメモリプールが削除された`

`E_TMOUT　　 タイムアウト`

`E_RLWAI` `待機中に待機強制解除(rel_wai)を受け付け`

`[E]` `rel_blf``（固定長メモリブロック返却）`

`・返却先は獲得先と同じでなければならない`

`Ｃ言語関数`

`ER ercd = rel_blf( ID mpfid, VP blf );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`VP　　　　 blf　　　　メモリブロックのアドレス`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 blfが不正、獲得先と同じmpfid`

`E_ID　　　　mpfidが不正`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜-4のメモリプールは利用不可（インプリメント依存）`

`[E]` `ref_mpf``（固定長メモリプール状態参照）`

`Ｃ言語関数`

`ER ercd = ref_mpf( T_RMPF *pk_rmpf, ID mpfid );`

`引数`

`ID　　　　 mpfid　　　固定長メモリプールＩＤ`

`T_RMPF*　　pk_rmpf　　メモリプール状態のアドレス`

`戻り値`

`ER　　　　 ercd　　　 エラーコード`

`pk_rmpfの中身`

`VP　　　 　exinf　　　拡張情報`

`BOOL_ID　　wtsk　　　 待機タスクの有無（FALSE = 0(無し)、0以外(有り、先頭タスクのID(レベルＸ))）`

`INT　　　　frbcnt　　 空き領域のブロック数`

`エラーの内容`

`E_OK　　　　正常終了`

`E_PAR　　　 pk_rmpfが不正`

`E_ID　　　　mpfidが不正`

`E_NOEXS　　 mpfidの固定長メモリプールが存在していない`

`E_OACV　　　mpfid＜-4は利用不可（インプリメント依存）`