2011-01-06 16 views
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

答えて

3

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

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

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

+0

私はその最初の行について心から感謝しています。タスク1または2で作成されたセマフォについて、私があなたが記述した問題を参照します。これは、この例で言葉遣いが間違っていることを意味するのですか、それとも間違って見ていますか? –

+0

この例は、コードに比べて表現が貧弱です。私の経験では、セマフォは、あるタスクが別のタスクの中から生成されるような特殊な状況がない限り、それらを使用するタスクの外でほとんど常に初期化されます。 –

1

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

関連する問題