vSemaphoreCreateBinary

[Semaphores]

semphr. h

vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore )

既存の待ち行列メカニズムを使うことによって、セマフォを作るマクロ。
バイナリ・セマフォは長さ1の待ち行列です。 実際にデータをストアしないのでデータの大きさはゼロです-ただ待ち行列が空であるか、あるいはフルであるかどうかだけに意味がある。

 バイナリ・セマフォと mutexes が非常に似ていますが、若干の差があります:
 Mutexes は優先権継承メカニズムを持ちますが、バイナリセマフォにはありません。 (タスク間あるいはタスクと割り込み間の)、同期を実行するにはバイナリ・セマフォがもっと良い選択です、一方、単純な相互排除を実行するにはmutexes がより良い選択です。
 バイナリのセマフォは一旦得られたならば返す必要はない、それで、他のものが連続的にセマフォを『takes』する間、タスク同期はセマフォを連続的に『giving』するタスク/割り込みによって実行することができる。 これは xSemaphoreGiveFromISR () ドキュメンテーションページにあるサンプルコードによって実証されます。
 より高いプライオリティーのもう一つのタスクが同じmutexを得ようとするならば、mutexを『takes』するタスクのプライオリティーは上げられる可能性がある。 mutex を所有するタスクは同じ mutex を「take」しようと試みているタスクの優先権を「継承します」。
 これは mutex が常に「返されなくて」(given back)はならないことを意味します − さもなければ、より高い優先権タスクは決して mutex を得ることが可能にはならないし、そして優先順位の低いタスクは優先順位の継承権を奪わない。 相互排除を実行するために使われている mutex の例が xSemaphoreTake () ドキュメンテーションページにあります。
 mutex とバイナリセマフォはxSemaphoreHandle型の変数を割り当てられ、この型のパラメータをとるどんな API 機能でも使うことができます。

パラメータ:
xSemaphore   セマフォの作成時に得られるハンドル。

xSemaphoreHandle xSemaphore;

void vATask( void * pvParameters ) {
    // Semaphore cannot be used before a call to vSemaphoreCreateBinary (). 
    // This is a macro so pass the variable in directly. 
    vSemaphoreCreateBinary( xSemaphore );
    if( xSemaphore != NULL ) { 
        // The semaphore was created successfully. 
        // The semaphore can now be used. 
    }
}