プロセス / タスク間の同期や通信を行うための機構として、 下記の同期通信機能を提供する。
これらの同期・通信オブジェクトは動的に生成され、 生成時に割り当てられたID ( > 0 ) により識別される。
メッセージによる通信と一番大きく異なる点は、 メッセージがプロセス間の通信であるのに対し、 タスク間の通信であることである。 したがって、主な用途はプロセス内のタスク間の同期・通信である。 生成したオブジェクトはすべてのプロセスから使用可能となるので、 プロセス間の同期・通信にも使用できる。
typedef W TMOUT; /* タイムアウト指定 (ミリ秒) */
#define T_NOWAIT ( 0) /* 待たない */ #define T_FOREVER (-1) /* 永久待ち */
#define SEM_SYNC 0x0000 /* 同期用セマフォ */ #define SEM_EXCL 0x4000 /* 排他制御用セマフォ */
#define WF_AND 0x0000 /* イベントフラグ AND 待ち */ #define WF_OR 0x0002 /* イベントフラグ OR 待ち */
|
WERR cre_sem(W cnt, UW opt)
W cnt セマフォ初期値 同期用セマフォの場合には cnt ≧ 0 でなければならない。 排他制御用セマフォの場合には cnt = 1 でなければならない。 UW opt セマフォ属性 ( SEM_SYNC ‖ SEM_EXCL ) | [ DELEXIT ] SEM_SYNC 同期用セマフォ SEM_EXCL 排他制御用セマフォ DELEXIT 生成プロセス終了時に自動削除
>0 正常(生成したセマフォID) <0 エラー(エラーコード)
セマフォを生成する。 生成したセマフォは、すべてのプロセスから使用可能である。
SEM_EXCL
-- 排他制御用セマフォ
wai_sem
) 〜
開放 ( sig_sem
) の順で使用しなくてはならない。
SEM_SYNC
-- 同期用セマフォ
wai_sem
)、開放 ( sig_sem
)
の順序に対する制限はない。
ER_NOSPC : システムのメモリ領域が不足した。 ER_LIMIT : セマフォの数がシステムの制限を超えた。 ER_PAR : パラメータが不正である。
|
ERR del_sem(ID id)
ID id セマフォID
=0 正常 <0 エラー(エラーコード)
セマフォを削除する。
削除したセマフォで待ち状態にあったタスクは待ちが解除され、
そのタスクへ ER_DLT
が返される。
ER_ID : セマフォIDが不正である。 ER_NOEXS : セマフォは存在していない。
|
ERR sig_sem(ID id)
ID id セマフォID
=0 正常 <0 エラー(エラーコード)
セマフォへ資源を 1 つ返却する。
セマフォの資源待ちのタスクがあれば、 待ち行列の先頭のタスクの待ちを解除する。 資源待ちのタスクがなければ、セマフォの資源を 1 増やす。
排他制御用セマフォの場合には、
対象セマフォの資源を獲得していない状態で返却しようとした場合は
ER_OBJ
になる。
ER_ID : セマフォIDが不正である。 ER_LIMIT : セマフォのカウント値が制限を越えた。 ER_NOEXS : セマフォは存在していない。 ER_OBJ : 排他制御用セマフォに対しての不正操作である。
|
ERR wai_sem(ID id, TMOUT tmo)
ID id セマフォID TMOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT 資源を獲得できなくても待たない T_FOREVER 資源を獲得できるまで待つ >0 資源を獲得できるまで最長 tmo ミリ秒待つ
=0 正常 <0 エラー(エラーコード)
セマフォから資源を 1 つ獲得する。
セマフォに 1 つ以上の資源がある場合には、
その資源を 1 つ獲得する ( 減らす )。
資源が 0 の場合には、sig_sem()
により資源が返却されるのを待つ。
指定された待ち時間が経過しても資源が獲得できない場合には、
ER_NONE
が返される。
排他制御用セマフォの場合 :
対象セマフォの資源をすでに獲得している状態で、
再度獲得しようとした場合には ER_OBJ
になる。
資源を獲得しているタスクが終了した場合には、 自動的に資源は返却される。
ER_DLT : セマフォは獲得待ちの間に削除された。 ER_ID : セマフォIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : セマフォは存在していない。 ER_NONE : セマフォを獲得できずにタイムアウトした。 ER_PAR : パラメータが不正である。 ER_OBJ : 排他制御用セマフォに対しての不正操作である。
|
WERR cre_flg(W ptn, UW opt)
W ptn イベントフラグ初期パターン (≧0) UW opt イベントフラグ属性 [ DELEXIT ] DELEXIT 生成プロセス終了時に自動削除
>0 正常(イベントフラグID) <0 エラー(エラーコード)
イベントフラグを生成する。 生成したイベントフラグは、 すべてのプロセスから使用可能である。
ER_NOSPC : システムのメモリ領域が不足した。 ER_LIMIT : イベントフラグの数がシステムの制限を超えた。 ER_PAR : パラメータが不正である。
|
ERR del_flg(ID id)
ID id イベントフラグID
=0 正常 <0 エラー(エラーコード)
イベントフラグを削除する。
削除したイベントフラグで待ち状態にあったタスクは待ちが解除され、
そのタスクへ ER_DLT
が返される。
ER_ID : イベントフラグIDが不正である。 ER_NOEXS : イベントフラグは存在していない。
|
ERR set_flg(ID id, W ptn)
ID id イベントフラグID W ptn イベントフラグ設定パターン (≧0)
=0 正常 <0 エラー(エラーコード)
イベントフラグの現在の値に ptn
が OR (論理和)される。
その結果、待ち状態にあるタスクの待ち解除条件が満たされれば、
そのタスクの待ちが解除される。
ER_ID : イベントフラグIDが不正である。 ER_NOEXS : イベントフラグは存在していない。 ER_PAR : パラメータが不正である。
|
ERR clr_flg(ID id, W ptn)
ID id イベントフラグID W ptn イベントフラグ消去パターン
=0 正常 <0 エラー(エラーコード)
イベントフラグの現在の値に ptn
が AND (論理積)される。
イベントフラグのクリアで、タスクの待ちが解除されることはない。
ER_ID : イベントフラグIDが不正である。 ER_NOEXS : イベントフラグは存在していない。
|
WERR wai_flg(ID id, W ptn, UW mode, TMOUT tmo)
ID id イベントフラグID W ptn 待ちパターン (>0) UW mode 待ち解除条件 ( WF_AND ‖ WF_OR ) | [ NOCLR ] WF_AND 0x0000 ptn で1のビットがすべてセットされるまで待つ WF_OR 0x0002 ptn で1のビットのいずれかがセットされるまで待つ NOCLR 0x0008 待ち解除条件が満たされた時、イベントフラグの値を クリアしない TMOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT 待ち解除条件が満たされなくても待たない T_FOREVER 待ち解除条件が満たされるまで待つ >0 待ち解除条件が満たされるまで最長 tmo ミリ秒待つ
>0 正常(待ち状態が解除されたときのイベントフラグの値) <0 エラー(エラーコード)
mode
で指定された条件にしたがって、
イベントフラグがセットされるのを待つ。
次の条件が満たされたとき待ち解除となる。
WF_AND の時 ( flg & ptn ) == ptn WF_OR の時 ( flg & ptn ) != 0 ∵ flg はイベントフラグの値
NOCLR
が指定された時には、
待ち解除条件が満たされたときイベントフラグの値は変化しない。
NOCLR
の指定がない場合には、
待ち解除条件が満たされたときイベントフラグの値 ( 全ビット ) が 0 クリアされる。
指定された待ち時間が経過しても待ち解除条件が満たされない場合には、
ER_NONE
が返される。
ER_DLT : イベントフラグが待ちの間に削除された。 ER_ID : イベントフラグIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : イベントフラグは存在していない。 ER_NONE : イベントフラグの条件が満たされずにタイムアウトした。 ER_PAR : パラメータが不正である。
|
WERR cre_mbf(W bufsz, W max, UW opt)
W bufsz メッセージバッファの全体のサイズ (バイト数) W max メッセージ1つ当たりの最大サイズ (バイト数) UW opt メッセージバッファ属性 [ DELEXIT ] DELEXIT 生成プロセス終了時に自動削除
>0 正常(メッセージバッファID) <0 エラー(エラーコード)
メッセージバッファを生成する。 生成したメッセージバッファは、すべてのプロセスから使用可能である。
bufsz
/ max
個のメッセージがメッセージバッファに入れられる ( 保存できる ) ことは保証されない。
bufsz
に 0 を指定することができる。
この場合、メッセージはメッセージバッファに入らず ( 保存されず )、
送信側のタスクと受信側のタスクが同時に送信 / 受信を行うことになる(同期通信)。
ER_NOSPC : システムのメモリ領域が不足した。 ER_LIMIT : メッセージバッファの数がシステムの制限を超えた。 ER_PAR : パラメータが不正である。
|
ERR del_mbf(ID id)
ID id メッセージバッファID
=0 正常 <0 エラー(エラーコード)
メッセージバッファを削除する。
削除したメッセージバッファで待ち状態にあったタスクは待ちが解除され、
そのタスクへ ER_DLT
が返される。
ER_ID : メッセージバッファIDが不正である。 ER_NOEXS : メッセージバッファは存在していない。
|
ERR snd_mbf(ID id, VP msg, W sz, TMOUT tmo)
ID id メッセージバッファID VP msg 送信メッセージ W sz 送信メッセージサイズ (バイト数) TMOOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT 送信できなくても待たない T_FOREVER 送信できるまで待つ >0 送信できるまで最長 tmo ミリ秒待つ
=0 正常 <0 エラー(エラーコード)
メッセージバッファへメッセージを送信する。
メッセージバッファに空きが足りない場合には、
空きができるまで待って送信する。
指定された待ち時間が経過しても送信できない場合には、
ER_NONE
が返される。
メッセージバッファの生成時に指定したメッセージの最大サイズ
( max
) より大きなメッセージを送信することはできない。
ER_DLT : メッセージバッファが待ちの間に削除された。 ER_ID : メッセージバッファIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : メッセージバッファは存在していない。 ER_NONE : メッセージを送信できずにタイムアウトした。 ER_PAR : パラメータが不正である。
|
WERR rcv_mbf(ID id, VP msg, TMOUT tmo)
ID id メッセージバッファID VP msg 受信メッセージ TMOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT 受信できなくても待たない T_FOREVER 受信できるまで待つ >0 受信できるまで最長 tmo ミリ秒待つ
>0 正常(受信メッセージのバイト数) <0 エラー(エラーコード)
メッセージバッファからメッセージを受信し、
msg
の領域に書き込む。
メッセージバッファにある先頭のメッセージが受信される。
メッセージバッファにメッセージがない場合には、
メッセージが送信されるまで待って受信する。
指定された待ち時間が経過しても受信できない場合には、
ER_NONE
が返される。
msg
には、
メッセージバッファの生成時に指定したメッセージ 1 つ当たりの最大サイズ
( max
) 以上の領域がなくてはいけない。
ER_DLT : メッセージバッファが待ちの間に削除された。 ER_ID : メッセージバッファIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : メッセージバッファは存在していない。 ER_NONE : メッセージを受信できずにタイムアウトした。 ER_PAR : パラメータが不正である。
|
WERR cre_por(W maxcmsz, W maxrmsz, UW opt)
W maxcmsz 呼出メッセージ最大サイズ (バイト数) W maxrmsz 返答メッセージ最大サイズ (バイト数) UW opt ランデブポート属性 [ DELEXIT ] DELEXIT 生成プロセス終了時に自動削除
>0 正常(ランデブポートID) <0 エラー(エラーコード)
ランデブポートを生成する。 生成したランデブポートは、すべてのプロセスから使用可能である。
ER_NOSPC : システムのメモリ領域が不足した。 ER_LIMIT : ランデブポートの数がシステムの制限を超えた。 ER_PAR : パラメータが不正である。
|
ERR del_por(ID id)
ID id ランデブポートID
=0 正常 <0 エラー(エラーコード)
ランデブポートを削除する。
削除したランデブポートで受け付け待ちまたは呼び出し待ちの状態にあったタスクは待ちが解除され、
そのタスクへ ER_DLT
が返される。
ランデブ成立後にランデブポートが削除されても、
ランデブは成立したままであり、正常にランデブの返答ができる。
ER_ID : ランデブポートIDが不正である。 ER_NOEXS : ランデブポートは存在していない。
|
WERR cal_por(ID id, UW calptn, VP msg, W cmsz, TMOUT tmo)
ID id ランデブポートID UW calptn 呼出側選択条件 (>0) VP msg 呼出 / 返答メッセージ W cmsz 呼出メッセージサイズ (バイト数) TMOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT ランデブが成立しなくても待たない T_FOREVER ランデブが成立するまで待つ >0 ランデブが成立するまで最長 tmo ミリ秒待つ
>0 正常(返答メッセージのバイト数) <0 エラー(エラーコード)
ランデブ呼出を行う。
ランデブ受け付けタスクが存在し、
選択条件が満たされるとランデブ成立となる。
指定された待ち時間が経過してもランデブが成立しない場合には、
ER_NONE
が返される。
ランデブ成立後は、ランデブの返答があるまで待つ。
ランデブは、次の選択条件が満たされると成立する。
( calptn & acpptn ) != 0 ∵ acpptn は、ランデブ受付側の選択条件
ランデブが成立すると、msg
の内容がランデブ受付タスクへ送られる。
ランデブの返答が msg
に格納され、
そのサイズが戻値に返される。
ランデブポートの生成時に指定した、
呼出メッセージの最大サイズ ( maxcmsz
)
より大きなメッセージを送信することはできない。
また、サイズ 0 のメッセージを送信することもできない。
msg
には、
ランデブポートの生成時に指定した返答メッセージの最大サイズ
( maxrmsz
)
以上の領域がなくてはならない。
ER_DLT : ランデブポートがランデブ成立待ちの間に削除された。 ER_ID : ランデブポートIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : ランデブポートは存在していない。 ER_NONE : ランデブが成立せずにタイムアウトした。 ER_PAR : パラメータが不正である。
|
WERR acp_por(ID id, UW acpptn, W *rdv, VP msg, TMOUT tmo)
ID id ランデブポートID UW acpptn 受付側選択条件 (>0) W* rdv ランデブ番号 VP msg 呼出メッセージ TMOUT tmo タイムアウト指定 (ミリ秒) T_NOWAIT ランデブが成立しなくても待たない T_FOREVER ランデブが成立するまで待つ >0 ランデブが成立するまで最長 tmo ミリ秒待つ
>0 正常(呼出メッセージのバイト数) <0 エラー(エラーコード)
ランデブを受け付ける。
ランデブ呼び出しタスクが存在し、
選択条件が満たされるとランデブ成立となる。
指定された待ち時間が経過してもランデブが成立しない場合には、
ER_NONE
が返される。
ランデブは、次の選択条件が満たされると成立する。
( calptn & acpptn ) != 0 ∵ calptn は、ランデブ呼出側の選択条件
ランデブが成立すると、
そのランデブの識別番号が rdv
に返される。
そして、呼び出しメッセージが msg
に格納され、
そのサイズが戻値に返される。
msg には、
ランデブポートの生成時に指定した呼出メッセージの最大サイズ
( maxcmsz
)以上の領域がなくてはならない。
ER_DLT : ランデブポートがランデブ成立待ちの間に削除された。 ER_ID : ランデブポートIDが不正である。 ER_MINTR : メッセージハンドラが起動されたため待ち処理が中断された。 ER_NOEXS : ランデブポートは存在していない。 ER_NONE : ランデブが成立せずにタイムアウトした。 ER_PAR : パラメータが不正である。
|
ERR fwd_por(ID id, UW calptn, W rdv, VP msg, W cmsz)
ID id ランデブポートID UW calptn 呼出側選択条件 (>0) W rdv ランデブ番号 VP msg 呼出メッセージ W cmsz 呼出メッセージサイズ (バイト数)
=0 正常 <0 エラー(エラーコード)
一旦受け付けたランデブを回送する。
現在のランデブ相手 ( 呼出タスク ) と自タスクの間で成立しているランデブを解除し、
呼出タスクが新たに回送先のポートに対してランデブ呼出を行う。
回送先のポートに対するランデブ呼出が成立しない場合には、
呼出タスクがランデブ成立待ちの状態になる。
呼出タスクの待ちは、cal_por()
で指定したタイムアウト指定に関係なく無限待ち
( T_FOREVER
) となる。自タスクは待ちに入らない。
呼出タスクのランデブは、
fwd_por()
で指定された条件で行われる。
つまり、fwd_por()
で指定された calptn
により選択条件が満たされるとランデブが成立する。
回送先のランデブポートの生成時に指定した、
呼出メッセージの最大サイズ ( maxcmsz
)
より大きなメッセージを送信することはできない。
また、サイズ 0 のメッセージを送信することもできない。
回送先のランデブポートの返答メッセージの最大サイズ
( maxrmsz ) は、
回送前の成立していたランデブポートの返答メッセージの最大サイズより大きくてはいけない
( ER_OBJ
)。
また、回送の呼出メッセージサイズ
( cmsz
)
も回送前のランデブポートの返答メッセージの最大サイズより大きくてはいけない
( ER_PAR
)。
ER_ID : ランデブポートIDが不正である。 ER_NOEXS : ランデブポートは存在していない。 ER_OBJ : 回送先のランデブポートの返答メッセージの最大サイズより、 回送前のランデブポートの返答メッセージの最大サイズの方が小さい。 : ランデブ番号が不正である。 ER_PAR : パラメータが不正である。
|
ERR rpl_rdv(W rdv, VP msg, W rmsz)
W rdv ランデブ番号 VP msg 返答メッセージ W rmsz 返答メッセージサイズ (バイト数)
=0 正常 <0 エラー(エラーコード)
ランデブ相手のタスクに返答し、ランデブを終了する。
ランデブを受け付けたランデブポートを生成したときに指定した、
応答メッセージの最大サイズ ( maxrmsz
)
より大きなメッセージを返答することはできない。
また、サイズ 0 のメッセージを返答することもできない。
ER_OBJ : ランデブ番号が不正である。 ER_PAR : パラメータが不正である。