semphr. h
xSemaphoreHandle xSemaphoreCreateRecursiveMutex( void )
既存の待ち行列メカニズムを使うことによって、回帰的な mutex を実装する Macro 。
このマクロを使って作られた Mutexes が xSemaphoreTakeRecursive () と xSemaphoreGiveRecursive
() マクロを使ってアクセスすることができます。 xSemaphoreTake () と xSemaphoreGive () マクロは使われるべきではありません。
回帰的に使われるmutex は所有者によって繰り返して「taken」することができる。 所有者が、各々の成功した「take」リクエストに対してxSemaphoreGiveRecursive
() を呼び出すまで、 mutex は再び利用可能になりません。 例えば、もしタスクが成功裏に同じ mutex に5回を「take」するなら、それが同じく正確に5回
mutex を「given」するまで、 mutex は他のいかなるタスクにも利用可能ではないでしょう。このタイプのセマフォは優先権継承メカニズムを使います。それでセマフォを「taking」しているタスクが常にセマフォを「give」しなくてはなりません(もう必要とされなくなったセマフォを返す)。Mutex
タイプセマフォは割り込みサービスルーチンの中から使うことができません。
割り込みサービスルーチンで純粋な同期のために使うことができる代替実装のvSemaphoreCreateBinary () を見てください(タスクあるいは割り込みが常にセマフォを「gives」する、そして他が常にセマフォを「take」する)。
リターン:
xSemaphore
作成したmutex セマフォのSemaphoreHandle型ハンドル。
使用例法:
xSemaphoreHandle xMutex; void vATask( void * pvParameters ) { // Semaphore cannot be used before a call to xSemaphoreCreateMutex(). // This is a macro so pass the variable in directly. xMutex = xSemaphoreCreateRecursiveMutex(); if( xMutex != NULL ) { // The mutex type semaphore was created successfully. // The mutex can now be used. } }