xSemaphoreCreateCounting

[Semaphores]

semphr. h

xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )

既存の待ち行列メカニズムを使うことによって、計数セマフォを作るマクロ。

カウンティング・セマフォの典型的な使い方は次に2つです:
1.カウンティング・イベント。
 この使用法のシナリオでは、イベントが起こるたびに、イベントハンドラがセマフォを「give」する(セマフォカウント値を増加する)、そして、イベントを処理するたびにハンドラ・タスクがセマフォを「take」する(セマフォカウント値を減少させている)。 カウント値は起こったイベントの回数と、それを処理した回数との差です。 この場合カウントの初期値はゼロであることが望ましい。

2.資源管理。
 この使用法のシナリオでカウント値は利用可能なリソースの数を示します。 リソースのコントロールを得るために、タスクが最初にセマフォを得なくてはなりません − セマフォカウント値は減少する。 カウント値がゼロに達するときフリーなリソースがありません。 タスクがリソース使用を終了するとき、セマフォを「gives」します − セマフォカウント値は増加する。 この場合、カウントの初期値は最大のカウント値とすること、これは全てのリソースが使用可能であることを示す。

パラメータ:
uxMaxCount
 使用可能な最大のカウント値。 セマフォがこの値に達するとき、それはもう「Give」することができない。

uxInitialCount
 セマフォ作成時、セマフォに割り当てられたカウント値。

リターン:
Handle 作成されたセマフォ・ハンドル。(xSemaphoreHandle型)
NULL   もしセマフォの作成に失敗した場合。

使用例:

 void vATask( void * pvParameters )
 {
 xSemaphoreHandle xSemaphore;

    // Semaphore cannot be used before a call to xSemaphoreCreateCounting().
    // The max value to which the semaphore can count shall be 10, and the
    // initial value assigned to the count shall be 0.
    xSemaphore = xSemaphoreCreateCounting( 10, 0 );

    if( xSemaphore != NULL )
    {
        // The semaphore was created successfully.
        // The semaphore can now be used.  
    }
 }