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