Windows版 iTRONサービスコールの作成 (ミューテックス)
(その2)
ミューテックスを生成するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
cre_mtx | ミューテックスID番号を指定してミューテックスを生成します。 |
acre_mtx | ミューテックスID番号を自動割付けでミューテックスを生成します。 |
ミューテックスID番号を指定してミューテックスを生成するには以下のサービスコールを使用します。
ER cre_mtx( ID mtxid, const T_CMTX *pk_cmtx )
引数 | 説明 |
---|---|
semid | ミューテックスID番号。 |
pk_cmtx | ミューテックス生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のミューテックスID番号。 |
E_PAR | パラメータエラー。 |
E_OBJ | 指定したミューテックスID番号は登録済み。 |
ミューテックス生成情報構造体(T_CMTX)は以下のとおりです。
メンバ名 | 説明 |
---|---|
mtxatr | ミューテックスの属性。 |
ceilpri | ミューテックスの上限優先度値。 |
サービスコールのエントリ関数内で構造体のメンバを取り出してから、ミューテックス生成処理を呼び出しています。
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ミューテックスの生成.
*
* @param [in] mtxid ミューテックスID番号.
* @param [in] pk_cmtx ミューテックス生成情報構造体のポインタ.
*
* @retval エラーコード.
*/
ER cre_mtx( ID mtxid, const T_CMTX *pk_cmtx )
{
ER ercd;
WIMTXOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmtx ){
return E_PAR;
}
//! ミューテックス生成情報をコピーする.
memset( &obj, 0, sizeof(WIMTXOBJ) );
obj.Attribute = pk_cmtx->mtxatr;
obj.CeilPri = pk_cmtx->ceilpri;
wi_CommonLock();
//! ミューテックスを生成する.
ercd = wi_CreateMutex( mtxid, &obj );
wi_CommonUnlock();
return ercd;
}
ミューテックスID番号を自動割付けでミューテックスを生成する
ミューテックスID番号を自動割付けでミューテックスを生成するには以下のサービスコールを使用します。
ER acre_mtx( const T_CMTX *pk_cmtx )
引数 | 説明 |
---|---|
pk_cmtx | ミューテックス生成情報構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_PAR | パラメータエラー。 |
E_NOID | ID番号不足。 |
上記以外の正数 | 生成したミューテックスのID番号。(正常終了) |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ミューテックスの生成 (ID番号自動割り付け).
*
* @param [in] pk_cmtx ミューテックス生成情報構造体のポインタ.
*
* @retval 生成したミューテックスのID番号またはエラーコード.
*/
ER_ID acre_mtx( const T_CMTX *pk_cmtx )
{
ID mtxid;
ER ercd;
WIMTXOBJ obj;
//! 引数が不正な場合はエラーにする.
if( !pk_cmtx ){
return E_PAR;
}
//! ミューテックス生成情報をコピーする.
memset( &obj, 0, sizeof(WIMTXOBJ) );
obj.Attribute = pk_cmtx->mtxatr;
obj.CeilPri = pk_cmtx->ceilpri;
wi_CommonLock();
for( mtxid = 1; mtxid < TMAX_MAXMTX; mtxid++ ){
//! ミューテックスを生成する.
ercd = wi_CreateMutex( mtxid, &obj );
if( ercd == E_OK ){
ercd = mtxid;
break;
}
}
if( ercd == E_OBJ ){
ercd = E_NOID;
}
wi_CommonUnlock();
return ercd;
}
cre_mtx()と同様に、サービスコールのエントリ関数内で引数の構造体のメンバをコピーし、ミューテックス生成関数を呼び出します。
生成するミューテックスのID番号を1~TMAX_MAXMTXに+1づつカウントアップして、空いているID番号を探してミューテックスを生成します。
ミューテックスが生成できた場合、戻り値を生成したミューテックスのID番号にして処理を終了します。
1~TMAX_MAXMTXの全てのID番号が使用中の場合、エラーコードが「E_OBJ(ミューテックス登録済み)」となるので、これを「E_NOID(ID番号不足)」に置き換えてエラー終了します。
ミューテックス生成関数
ミューテックス生成関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ミューテックスの生成.
*
* @param [in] id ミューテックスID番号.
* @param [in] obj ミューテックス・オブジェクト構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_CreateMutex( INT id, const WIMTXOBJ *obj )
{
ER ercd;
WIMTXOBJ *p;
//! ミューテックス・オブジェクトを作成する.
p = (WIMTXOBJ *)wi_CreateObject( id, TMAX_MAXMTX, sizeof(WIMTXOBJ), obj, ObjList, &ercd );
if( !p ){
return ercd;
}
//! リストにミューテックスを追加する.
wi_AddObject( (WIHDR *)p, &ObjList );
return E_OK;
}
ミューテックス生成関数は以下のような処理を行います。
- 新しいミューテックスを生成します。
- ミューテックス・リストに生成したミューテックス・オブジェクトをリンクして処理を終了します。