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