xSemaphoreCreateMutex

[Semaphores]

FreeRTOS.org V4.5.0 以降のみ使用可能。

semphr. h

xSemaphoreHandle xSemaphoreCreateMutex( void )

既存の待ち行列機構を使うことによって、 mutex セマフォを作るマクロ。このマクロを使って作られた Mutexes はxSemaphoreTake () と xSemaphoreGive () マクロを使ってアクセスすることができますが、xSemaphoreTakeRecursive () と xSemaphoreGiveRecursive () マクロは使えない。

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

バイナリのセマフォは一旦得られるならば返す必要はない、それで、他のものが連続的にセマフォを『takes』する間、タスク同期はセマフォを連続的に『giving』するタスク/割り込みによって実行することができる。 これは xSemaphoreGiveFromISR () ドキュメンテーションページにあるサンプルコードによって実証されます。
 mutex とバイナリセマフォはxSemaphoreHandle型の変数を割り当てられ、この型のパラメータをとるどんな API 機能でも使うことができます。

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

使用例:

 xSemaphoreHandle xSemaphore;

void vATask( void * pvParameters ) 
{ 
    // Mutex semaphores cannot be used before a call to 
    // xSemaphoreCreateMutex(). The created mutex is returned. 
    xSemaphore = xSemaphoreCreateMutex();

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