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