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が返ります。



Windowsは米国Microsoft Corporationの登録商標です。