Windows版 iTRONサービスコールの作成 (イベントフラグ)
(その5)
イベントフラグのセット待ちをするサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
wai_flg | タイムアウトなしでイベントフラグがセットされるのを待ちます。 |
pol_flg | ポーリング方式でイベントフラグがセットされるのを待ちます。 |
twai_flg | タイムアウト付きでイベントフラグがセットされるのを待ちます。 |
タイムアウトなしでイベントフラグのセット待ちをするには以下のサービスコールを使用します。
※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。
・Ver3.0の場合
ER wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
・Ver4.0の場合
ER wai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
引数 | 説明 |
---|---|
p_flgptn | イベント待ち解除時のビットパターンを格納する領域のポインタ。 |
flgid | イベントフラグID番号。 |
waiptn | イベント待ちをするビットパターン。 |
wfmode |
イベントフラグの待ち条件。
Ver3.0の場合、TWF_ANDWまたはTWF_ORWと併せてTWF_CLRが指定可能。 TWF_CLRを指定すると、待ち条件が成立したときにイベントフラグのフラグ値を0にクリアします。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のイベントフラグID番号。 |
E_NOEXS | 指定したイベントフラグID番号は登録されていない。 |
E_CTX | 非コンテキスト・タスクからの呼び出し。 |
E_ILUSE | 複数タスクの待ちを許可しない設定で、既に待ち行列にタスクがある。 |
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (タイムアウトなし).
*
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
*
* @retval エラーコード.
*/
ER wai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
//! タイムアウトなしでイベント待ちをする.
return twai_flg( p_flgptn, flgid, waiptn, wfmode, TMO_FEVR );
}
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (タイムアウトなし).
*
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER wai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
{
//! タイムアウトなしでイベント待ちをする.
return twai_flg( flgid, waiptn, wfmode, p_flgptn, TMO_FEVR );
}
twai_flg()のタイムアウト設定に TMO_FEVR を指定して呼び出します。
指定したイベントフラグID番号のイベントフラグに対して、イベントフラグのビットパターンが待ち条件に一致するまでタスクをスリープさせます。
ポーリングでイベントフラグのセット待ちをするには以下のサービスコールを使用します。
※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。
・Ver3.0の場合
ER pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
・Ver4.0の場合
ER pol_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
引数 | 説明 |
---|---|
p_flgptn | イベント待ち解除時のビットパターンを格納する領域のポインタ。 |
flgid | イベントフラグID番号。 |
waiptn | イベント待ちをするビットパターン。 |
wfmode | イベントフラグの待ち条件。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のイベントフラグID番号。 |
E_NOEXS | 指定したイベントフラグID番号は登録されていない。 |
E_TMOUT | 指定した待ち条件が成立していない。 |
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (ポーリング).
*
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
*
* @retval エラーコード.
*/
ER pol_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode )
{
//! イベントが発生しているかどうかを調べる.
return twai_flg( p_flgptn, flgid, waiptn, wfmode, TMO_POL );
}
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (ポーリング).
*
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
*
* @retval エラーコード.
*/
ER pol_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn )
{
//! イベントが発生しているかどうかを調べる.
return twai_flg( flgid, waiptn, wfmode, p_flgptn, TMO_POL );
}
twai_flg()のタイムアウト設定に TMO_POL を指定して呼び出します。
指定した待ち条件が成立していない場合は、タスクをスリープさせずに戻り値をE_TMOUTとしてすぐにサービスコールから戻ります。
タイムアウト付きでイベントフラグのセット待ちをするには以下のサービスコールを使用します。
※ Ver3.0とVer4.0では引数の並びが違いますので注意してください。
・Ver3.0の場合
ER twai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout )
・Ver4.0の場合
ER twai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout )
引数 | 説明 |
---|---|
p_flgptn | イベント待ち解除時のビットパターンを格納する領域のポインタ。 |
flgid | イベントフラグID番号。 |
waiptn | イベント待ちをするビットパターン。 |
wfmode | イベントフラグの待ち条件。 |
tmout |
タイムアウトの設定値。
|
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のイベントフラグID番号。 |
E_NOEXS | 指定したイベントフラグID番号は登録されていない。 |
E_TMOUT | 指定した待ち条件が成立せずにタイムアウト。 |
E_CTX | 非コンテキスト・タスクからの呼び出し。 |
E_ILUSE | 複数タスクの待ちを許可しない設定で、既に待ち行列にタスクがある。 |
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (タイムアウトあり).
*
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
* @param [in] tmout タイムアウト設定.
*
* @retval エラーコード.
*/
ER twai_flg( UINT *p_flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout )
{
ER ercd;
wi_CommonLock();
//! イベント待ちをする.
ercd = wi_WaitEvFlag( flgid, p_flgptn, waiptn, wfmode, tmout );
wi_CommonUnlock();
return ercd;
}
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち (タイムアウトあり).
*
* @param [in] flgid イベントフラグID番号.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
* @param [out] p_flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
* @param [in] tmout タイムアウト設定.
*
* @retval エラーコード.
*/
ER twai_flg( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout )
{
ER ercd;
wi_CommonLock();
//! イベント待ちをする.
ercd = wi_WaitEvFlag( flgid, p_flgptn, waiptn, wfmode, tmout );
wi_CommonUnlock();
return ercd;
}
指定したイベントフラグID番号のイベントフラグに対して、他のタスクがset_flg()を呼び出して指定した条件でフラグの値がセットされるか、タイムアウトで設定した時間が経過するまでタスクをスリープさせます。
イベントフラグのセット待ちをする関数
イベントフラグのセット待ちをする関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief イベントフラグ待ち.
*
* @param [in] id イベントフラグID番号.
* @param [out] flgptn 待ち解除時のビットパターンを格納する領域のポインタ.
* @param [in] waiptn 待ちビットパターン.
* @param [in] wfmode 待ちモード.
* @param [in] tmout タイムアウト設定.
*
* @retval エラーコード.
*/
ER wi_WaitEvFlag( INT id, UINT *flgptn, UINT waiptn, UINT wfmode, TMO tmout )
{
WITSKOBJ *tsk;
WIFLGOBJ *p;
ER ercd;
BOOL event_on;
//! 引数が不正な場合はエラーにする.
if( !flgptn || waiptn == 0 ){
return E_PAR;
}
//! イベントフラグIDのオブジェクトを取得する.
p = (WIFLGOBJ *)wi_FindObject( id, TMAX_MAXFLG, ObjList, &ercd );
if( !p ){
return ercd;
}
*flgptn = 0;
event_on = FALSE;
if( wfmode & TWF_ORW ){
//! OR待ちの場合、いずれかのビットが一致すれば「イベントあり」にする.
if( (waiptn & p->FlgVal) != 0 ){
event_on = TRUE;
}
}else{
//! AND待ちの場合、全てのビットが一致すれば「イベントあり」にする.
if( (waiptn & p->FlgVal) == waiptn ){
event_on = TRUE;
}
}
if( event_on ){
//! イベント発生時のフラグパターンを戻り値にセットする.
*flgptn = p->FlgVal;
//! フラグのクリア設定がされている場合はフラグをクリアする.
if( (wfmode & TWF_CLR) != 0 || (p->Attribute & TA_CLR) != 0 ){
p->FlgVal = 0;
}
return E_OK;
}
//! 複数タスクの待ちを許可しない設定で、待ち行列に他のタスクがある場合はエラーにする.
if( (p->Attribute & TA_WMUL) == 0 && p->WaitQue ){
return E_ILUSE;
}
//! 自タスクのタスク・オブジェクトを取得する.
tsk = wi_GetTaskObject( TSK_SELF );
if( !tsk ){
return E_CTX;
}
//! 待ちフラグパターンをタスク・オブジェクトに保存する.
tsk->Param[0] = (VP)waiptn;
tsk->Param[1] = (VP)wfmode;
tsk->Param[2] = 0;
//! イベントフラグが成立するまでタスクをスリープさせる.
ercd = wi_TaskWait( id, TTW_FLG, tmout, p->Attribute, &(p->WaitQue) );
//! イベント発生時のフラグパターンを戻り値にセットする.
if( ercd == E_OK ){
*flgptn = (UINT)(tsk->Param[2]);
}
return ercd;
}
イベントフラグのセット待ちをする関数は以下のような処理を行います。
- 引数の flgptn が NULL または 待ち条件のビットパターン(waiptn)が 0 の場合はエラーにします。
- 引数で指定されたイベントフラグID番号に該当するイベントフラグ・オブジェクトを取り出します。
- イベントフラグのビットパターンが待ち条件と一致するときは正常終了にします。
- 複数タスクの待ちを許可しない設定で、待ち行列に他のタスクがある場合はエラーで終了します。
- イベントフラグのビットパターンが待ち条件と一致するか、タイムアウトになるまでタスクをスリープさせます。
- タスクのスリープから復帰したときに正常終了で復帰した場合のみ、イベントフラグのフラグパターンを引数の flgptn にセットします。