Windows版 iTRONサービスコールの作成 (ミューテックス)
(その5)
ミューテックスのロックを解除するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
unl_mtx | ミューテックスのロックを解除します。 |
ミューテックスのロックを解除するには以下のサービスコールを使用します。
ER unl_mtx( ID mtxid )
引数 | 説明 |
---|---|
mtxid | ミューテックスID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のミューテックスID番号。 |
E_NOEXS | 指定したミューテックスID番号は登録されていない。 |
E_ILUSE | ミューテックスをロックしたタスク以外からの呼び出し。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief ミューテックスのロックを解除.
*
* @param [in] mtxid ミューテックスID番号.
*
* @retval エラーコード.
*/
ER unl_mtx( ID mtxid )
{
ER ercd;
wi_CommonLock();
//! ミューテックスのロックを解除する.
ercd = wi_UnlockMutex( mtxid );
wi_CommonUnlock();
return ercd;
}
指定したミューテックスID番号を引数としてミューテックスのロック解除関数を呼び出します。
ミューテックスのロック解除関数
ミューテックスのロック解除関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief ミューテックスのロックを解除する.
*
* @param [in] id ミューテックスID番号.
*
* @retval エラーコード.
*/
ER wi_UnlockMutex( INT id )
{
ER ercd;
WIMTXOBJ *p;
//! ミューテックスIDのオブジェクトを取得する.
p = (WIMTXOBJ *)wi_FindObject( id, TMAX_MAXMTX, ObjList, &ercd );
if( !p ){
return ercd;
}
//! ミューテックスをロックしているタスクと違う場合はエラーにする.
if( p->LockId != wi_GetActiveTaskId() ){
return E_ILUSE;
}
p->LockId = 0;
//! ロック解除待ちをしているタスクがある場合はタスクを起床させる.
if( p->WaitQue ){
wi_TaskWakeup( p->WaitQue->Id, TTW_MTX, &(p->WaitQue) );
}
return E_OK;
}
ミューテックスのロック解除関数は以下のような処理を行います。
- 引数で指定されたミューテックスID番号に該当するミューテックス・オブジェクトを取り出します。
- ミューテックスをロックしたタスク以外のタスクから呼び出された場合はエラー終了にします。
- ミューテックスのロックをかけたタスクのID番号をクリアしてロックを解除します。
- ロック解除待ちのタスクがある場合は、待ち行列の先頭のタスクを起床させます。