Windows版 iTRONサービスコールの作成 (セマフォ)
(その4)
セマフォから獲得した資源を返却するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
sig_sem | セマフォ資源を返却します。 |
isig_sem | セマフォ資源を返却します。(非タスクコンテキストからの呼出し) |
※ isig_sem()はVer4.0のみサポートされます。
セマフォ資源を返却してセマフォ・カウンタを +1 します。
セマフォID番号を指定してセマフォ資源を返却するには以下のサービスコールを使用します。
ER sig_sem( ID semid )
引数 | 説明 |
---|---|
semid | セマフォID番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外のセマフォID番号。 |
E_NOEXS | 指定したセマフォID番号は登録されていない。 |
Ver4.0では割り込みハンドラや周期起動ハンドラ等の非タスク処理内からの呼び出しは、sig_sem()ではなく、isig_sem()を使用します。
ER isig_sem( ID semid )
引数および戻り値は sig_sem() と同じです。
・sig_sem() サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief セマフォ資源の返却.
*
* @param [in] semid セマフォID番号.
*
* @retval エラーコード.
*/
ER sig_sem( ID semid )
{
ER ercd;
wi_CommonLock();
//! セマフォの資源を返却する.
ercd = wi_SignalSemaphore( semid );
wi_CommonUnlock();
return ercd;
}
セマフォ資源を返却するセマフォのID番号を引数としてセマフォの資源を返却する関数を呼び出します。
・isig_sem() サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief セマフォ資源の返却 (非タスクコンテキストからの呼出し用).
*
* @param [in] semid セマフォID番号.
*
* @retval エラーコード.
*/
ER isig_sem( ID semid )
{
//! 非タスクコンテキストからセマフォの資源を解放する.
return sig_sem( semid );
}
sig_sem()を改めて呼び出すだけですので、sig_sem()と同じ動作になります。
セマフォ資源の返却関数
セマフォの資源を返却する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief セマフォ資源の返却.
*
* @param [in] id セマフォID番号.
*
* @retval エラーコード.
*/
ER wi_SignalSemaphore( INT id )
{
ER ercd;
WISEMOBJ *p;
//! セマフォIDのオブジェクトを取得する.
p = (WISEMOBJ *)wi_FindObject( id, TMAX_MAXSEM, ObjList, &ercd );
if( !p ){
return ercd;
}
//! セマフォカウントを+1する.
if( p->SemCnt < p->MaxCnt ){
p->SemCnt++;
}
//! セマフォの獲得待ちをしているタスクがある場合はタスクを起床させる.
if( p->WaitQue ){
wi_TaskWakeup( p->WaitQue->Id, TTW_SEM, &(p->WaitQue) );
}
return E_OK;
}
セマフォの資源を返却する関数は以下のような処理を行います。
- 引数で指定されたセマフォID番号に該当するセマフォ・オブジェクトを取り出します。
- セマフォ・カウンタを+1します。このときセマフォ・カウンタがセマフォ・カウンタの最大値を越えないようにします。
- セマフォの資源獲得待ちをしているタスクがある場合は、待ち行列の先頭のタスクを起床し、待ち行列から起床したタスクを外します。
ちなみに...
今回は使用しませんでしたが、Windowsでセマフォの資源を返却するAPIは以下のAPIです。
BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount )
引数 | 説明 |
---|---|
hSemaphore | セマフォのハンドル。 |
lReleaseCount | カウントを増やすべき数。 |
lpPreviousCount | それまでのカウントを格納する領域のポインタ。 |
成功するとTRUEが戻り値として返ります。失敗した場合はFALSEが返ります。