0

通常のバイナリセマフォの場合、外部イベントに同期しようとするタスクは空のセマフォを作成します。同期イベントを制御する2番目のタスクは、不要になったときにセマフォを提供します。

#include "vxWorks.h"
#include "semLib.h"

#define T_PRIORITY 50


SEM_ID syncExampleSem;    // named semaphore object

void initialize (void)
{

    // set up FIFO queue with emtpy binary semaphore

syncSem = semBCreate (SEM_Q_FIFO, SEM_EMPTY);

    // create task1
    taskSpawn ("task1", T_PRIORITY, 0, 10000, task1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

    // create task2
    taskSpawn ("task2", T_PRIORITY, 0, 10000, task2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

}

void task1 (void)
{
    // stay here until semaphore becomes available
    semTake (syncExampleSem, WAIT_FOREVER);


    // do something

}



void task2 (void)
{
    // do something



    // now let task1 execute
    semGive (synExampleSem);

} 

私の質問は、説明されているように、空のセマフォを作成する最初のタスクが表示されないのはなぜですか?(メイン関数で「一般的に」実行されているように見えますか?) 「外部イベントに同期しようとするタスクは、空のセマフォを作成します」。

また、2番目のタスクがどのように同期を「制御」しているのかよくわかりません。

ありがとうございました。

参照:バイナリセマフォによる同期の例
http://www.cross-comp.com/instr/pages/embedded/VxWorksTutorial.aspx#VxWorks%20Programming

4

2 に答える 2

3

例にはバグがあります。の最初の行initializeはに割り当てる必要がありますsyncExampleSem

タスク1はタスク2がセマフォを「与える」まで続行できないため、2番目のタスクは同期を「制御」します。セマフォがどこで作成されるかは、いずれかのタスクがセマフォを提供または取得しようとする前に作成されることが保証されている限り、実際には重要ではありません。

これらの特定のタスクは並行して実行されるinitializeため、タスク2によって作成された場合は、タスク1がセマフォが存在する前に待機するリスクがあり、タスク1によって作成された場合は、リスクが発生するために作成されます。それが存在する前にセマフォを与えるタスク2の。

于 2011-01-06T23:02:28.737 に答える
1

SemTakeとSemGiveはエラーを返しています(セマフォが存在しないため)。システムコールの戻りコードを確認することは価値があります。

于 2011-04-01T15:49:02.540 に答える