2011-01-06 71 views
0

對於一個普通的二進制信號量,一 任務嘗試同步到一個 外部事件創建一個空 旗語....一個第二任務, 控制同步事件 給出了信號量時,它是沒有 不再需要。在這個例子中應該創建什麼任務?

#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); 

} 

我的問題是,爲什麼不讓我看到的第一個任務創建空的信號,如所描述? (它看起來像是在主函數中「一般」完成的?)「試圖同步到外部事件的任務創建一個空信號量」。

此外,我真的不知道第二項任務是如何「控制」同步?

謝謝。

參見:同步的實施例通過二進制信號量
http://www.cross-comp.com/instr/pages/embedded/VxWorksTutorial.aspx#VxWorks%20Programming

回答

3

有一個在該示例的一個錯誤。 initialize中的第一行應指定爲syncExampleSem

第二個任務「控制」同步,因爲任務1不能繼續,直到任務2「給出」信號量。創建信號量的位置並不重要,只要它保證在任何任務嘗試給出或接受之前創建。

由於這些特定的任務並行運行,它在initialize創建,因爲如果它是由任務2中創建運行任務1的風險信號量等待存在之前,反之亦然,如果它是由任務創建1你在運行任務2之前給信號量提供風險。

+0

我想知道第一行,謝謝。關於任務1或2中創建的信號量,我看到您描述的問題。這是否意味着這個例子中的措詞是錯誤的,還是我錯誤地看着它? – 2011-01-06 23:06:39

1

SemTake和SemGive正在返回錯誤(因爲信號量不存在)。 檢查系統調用的返回碼很有用。