1

xSemaphoreTake() 関数に関するFreeRTOS API リファレンスhttp://www.freertos.org/a00122.htmlの抜粋を次に示します。

// See if we can obtain the semaphore. If the semaphore is not available
// wait 10 ticks to see if it becomes free.
if( xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) == pdTRUE )
{
// We were able to obtain the semaphore and can now access the
// shared resource.

私の質問は次のとおりです。ここにセマフォが既にありますか、それとも 次のxSemaphoreTake( xSemaphore, (portTickType) 10 )ように明示的に呼び出す必要がありますか?

// We have finished accessing the shared resource. Release the
// semaphore.
xSemaphoreGive( xSemaphore );
}
4

3 に答える 3

4

リンク先の例のように、if (...) 本体内でセマフォが取得されます。その例からコピーして貼り付ける場合、プログラムに xSemaphoreTake と xSemaphoreGive の両方があることを確認するのはあなた次第です。

于 2013-01-04T21:30:57.960 に答える
0

私の質問は、ここにセマフォが既にあるのか、それとも xSemaphoreTake( xSemaphore, (portTickType) 10 ) を次のように明示的に呼び出す必要があるのか​​ということです。

はい、if ステートメントの本文に入ると、セマフォがあります。何らかの理由でセマフォがブロック時間 (この場合は 10 ティック) 後に使用できなかった (または期間内に指定されなかった) 場合、 xSemaphoreTake( xSemaphore, ( portTickType ) 10 ) は pdFALSE を返します。

于 2015-02-17T05:42:28.857 に答える
0

xSemaphoreTake() を呼び出すときに、xSemaphore セマフォを所有しているかどうかはわかりません。空いていた場合、コードは実行を継続し、10 ティック以内に空きになった場合、指定されたタイムアウト後に xSemaphore が利用できなかった場合、OS スケジューラが停止することなく (つまり、呼び出しで指定されたタイムアウト)、コードは実行を続けます。 、タスクはブロック状態になり、優先度の高い次の準備完了タスクが実行されます。

同じセマフォを参照して xSemaphoreGive を明示的に呼び出すと、ここでは重大なエラーになります。所有していない場合は、解放しても意味がありません。

于 2013-03-13T14:50:29.517 に答える