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. } }