xSemaphoreCreateRecursiveMutex

[Semaphores]

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