Windows版 iTRONサービスコールの作成 (ミューテックス)
(その6)
ミューテックスの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_mtx | ミューテックスの状態を取得します。 |
ミューテックスの状態を取得するには以下のサービスコールを使用します。
ER ref_mtx( ID mtxid, T_RMTX *pk_rmtx )
引数 | 説明 |
---|---|
mtxid | ミューテックスID番号。 |
pk_rmtx | ミューテックス状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のミューテックスID番号。 |
E_NOEXS | 指定したミューテックスID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
ミューテックス状態を格納する構造体(T_RMTX)は以下のとおりです。
メンバ名 | 説明 |
---|---|
htskid | ミューテックスをロックしているタスクのID番号。 |
wtskid | ミューテックス待ち行列の先頭のタスクID番号。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ミューテックスの状態参照.
*
* @param [in] mtxid ミューテックスID番号.
* @param [out] pk_rmbx ミューテックス状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER ref_mtx( ID mtxid, T_RMTX *pk_rmtx )
{
ER ercd;
WIMTXSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rmtx ){
return E_PAR;
}
wi_CommonLock();
//! ミューテックスの状態を取得する.
ercd = wi_RefarenceMutex( mtxid, &sts );
if( ercd == E_OK ){
pk_rmtx->htskid = sts.LockId;
pk_rmtx->wtskid = sts.WaitId;
}
wi_CommonUnlock();
return E_OK;
}
ミューテックス状態を格納する構造体のポインタがNULLの場合エラーにします。
ミューテックス状態を取得する関数を呼び出して現在のミューテックスの状態を取得し引数の構造体に格納します。
ミューテックス状態取得関数
ミューテックス状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ミューテックスの状態参照.
*
* @param [in] id ミューテックスID番号.
* @param [in] sts ミューテックス状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceMutex( INT id, WIMTXSTAT *sts )
{
ER ercd;
WIMTXOBJ *p;
//! ミューテックスIDのオブジェクトを取得する.
p = (WIMTXOBJ *)wi_FindObject( id, TMAX_MAXMTX, ObjList, &ercd );
if( !p ){
return ercd;
}
//! ミューテックスの状態を構造体にセットする.
sts->LockId = p->LockId;
sts->WaitId = wi_GetWaitTaskListFirstId( p->WaitQue );
return E_OK;
}
ミューテックス状態を取得する関数は以下のような処理を行います。
- 引数で指定されたミューテックスID番号に該当するミューテックス・オブジェクトを取り出します。
- ミューテックスをロックしているタスクのID番号を引数の構造体にセットします。
- ロック解除待ちをしているタスクの待ち行列から先頭のタスクのID番号を取り出して、引数の構造体にセットします。