Windows版 iTRONサービスコールの作成 (イベントフラグ)
(その2)
イベントフラグを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_flg | イベントフラグID番号を指定してイベントフラグを生成します。 |
acre_flg | イベントフラグID番号を自動割付けでイベントフラグを生成します。 |
※ acre_flg()はVer4.0のみサポートされます。
イベントフラグID番号を指定してイベントフラグを生成するには以下のサービスコールを使用します。
※ Ver3.0とVer4.0では構造体のメンバが若干異なりますので注意してください。
ER cre_flg( ID flgid, const T_CFLG *pk_cflg )
引数 | 説明 |
---|---|
flgid | イベントフラグID番号。 |
pk_cflg | イベントフラグ生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のイベントフラグID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したイベントフラグID番号は登録済み。 |
Ver3.0のイベントフラグ生成情報構造体(T_CFLG)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
flgatr |
イベントフラグの属性。 タスクの待ち行列に格納する方式を指定します。
タスクの待ち行列に格納する方式を指定します。
|
iflgptn | イベントフラグの初期値。 |
Ver4.0のイベントフラグ生成情報構造体(T_CFLG)は以下のとおりです。
メンバ名 | 説明 |
---|---|
flgatr |
イベントフラグの属性。 タスクの待ち行列に格納する方式を指定します。
タスクの待ち行列に格納する方式を指定します。
TA_CLRを指定すると、待ち条件が成立したときにイベントフラグのフラグ値を0にクリアします。 |
iflgptn | イベントフラグの初期値。 |
Ver3.0とVer4.0で構造体のメンバが異なるので、それぞれのサービスコールのエントリ関数内で構造体のメンバを取り出してから、イベントフラグ生成処理を呼び出しています。
・Ver3.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグの生成.
*
* @param [in] flgid イベントフラグID番号.
* @param [in] pk_cflg イベントフラグ生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_flg( ID flgid, const T_CFLG *pk_cflg )
{
ER ercd;
WIFLGOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cflg ){
return E_PAR;
}
//! イベントフラグ生成情報をコピーする.
memset( &obj, 0, sizeof(WIFLGOBJ) );
obj.Attribute = pk_cflg->flgatr & ~TA_CLR;
obj.FlgVal = pk_cflg->iflgptn;
obj.ExtInfo = pk_cflg->exinf;
wi_CommonLock();
//! イベントフラグを生成する.
ercd = wi_CreateEvFlag( flgid, &obj );
wi_CommonUnlock();
return ercd;
}
※ Ver3.0でイベントフラグの属性に TA_CLR は指定できないので、指定されていた場合は TA_CLR をクリアします。
・Ver4.0のサービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグの生成.
*
* @param [in] flgid イベントフラグID番号.
* @param [in] pk_cflg イベントフラグ生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_flg( ID flgid, const T_CFLG *pk_cflg )
{
ER ercd;
WIFLGOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cflg ){
return E_PAR;
}
//! イベントフラグ生成情報をコピーする.
memset( &obj, 0, sizeof(WIFLGOBJ) );
obj.Attribute = pk_cflg->flgatr;
obj.FlgVal = (UINT)pk_cflg->iflgptn;
wi_CommonLock();
//! イベントフラグを生成する.
ercd = wi_CreateEvFlag( flgid, &obj );
wi_CommonUnlock();
return ercd;
}
イベントフラグID番号を自動割付けでイベントフラグを生成する (Ver4.0のみ)
イベントフラグID番号を自動割付けでイベントフラグを生成するには以下のサービスコールを使用します。
ER_ID acre_flg( const T_CFLG *pk_cflg )
引数 | 説明 |
---|---|
pk_cflg | イベントフラグ生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したイベントフラグのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief イベントフラグの生成 (ID番号自動割り付け).
*
* @param [in] pk_cflg イベントフラグ生成情報構造体のポインタ.
*
* @retval イベントフラグID番号またはエラーコード.
*/
ER_ID acre_flg( const T_CFLG *pk_cflg )
{
ID flgid;
ER_ID ercd;
WIFLGOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cflg ){
return E_PAR;
}
//! イベントフラグ生成情報をコピーする.
memset( &obj, 0, sizeof(WIFLGOBJ) );
obj.Attribute = pk_cflg->flgatr;
obj.FlgVal = (UINT)pk_cflg->iflgptn;
wi_CommonLock();
for( flgid = 1; flgid < TMAX_MAXFLG; flgid++ ){
//! イベントフラグを生成する.
ercd = wi_CreateEvFlag( flgid, &obj );
if( ercd == E_OK ){
ercd = (ER_ID)flgid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
イベントフラグID番号を自動割付けでイベントフラグを生成する関数は以下のような処理を行います。
- cre_flg()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、イベントフラグ生成関数を呼び出します。
- 生成するイベントフラグのID番号を1~TMAX_MAXFLGに+1づつカウントアップして、空いているID番号を探してイベントフラグを生成します。
- イベントフラグが生成できた場合、戻り値を生成したイベントフラグのID番号にして処理を終了します。
- 1~TMAX_MAXFLGの全てのID番号が使用中の場合、エラーコードが「E_OBJ(イベントフラグ登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
イベントフラグ生成関数
イベントフラグを生成する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief イベントフラグの生成.
*
* @param [in] id イベントフラグID番号.
* @param [in] obj イベントフラグ・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateEvFlag( INT id, WIFLGOBJ *obj )
{
ER ercd;
WIFLGOBJ *p;
//! イベントフラグ・オブジェクトを作成する.
p = (WIFLGOBJ *)wi_CreateObject( id, TMAX_MAXFLG, sizeof(WIFLGOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
//! リストにイベントフラグを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
イベントフラグ生成関数は以下のような処理を行います。
- 新しいイベントフラグを生成します。
- イベントフラグ・リストに生成したイベントフラグ・オブジェクトをリンクして処理を終了します。