2013-05-10 17 views

回答

1

這應該包含在vxWorks文檔中。

一般來說,您應該使用信號量來分離信號量的創建。

/**Initialization Code**/ 
SEM_ID semM; 
semM = semMCreate (...); 
... 
taskSpawn(task1...); 
taskSpawn(task2...); 
... 

/* Task 1 code */ 
void task1() { 
    ... 
    semTake (semM, WAIT_FOREVER); 
    ...<Task 1 critical section> 
    semGive (semM); 
    ... 
} 

/* Task 2 code */ 
void task2() { 
    ... 
    semTake (semM, WAIT_FOREVER); 
    ...< Task 2 critical section> 
    semGive (semM); 
    ... 
} 

在這種情況下,semM是一個全局變量可用於這兩個任務。 如果您冒犯了您,使用VxWorks 6.x,您還可以使用提供信號量名稱的semOpen()API。 在每個任務中執行一個sem以創建/檢索信號量並且它是ID。

創建互斥鎖時,它可用於執行semTake(即任務1或任務2)的第一個任務。

如果您需要在特定順序中發生的事情,那麼您需要互斥(用於互斥)和同步(例如通過二進制信號量)的組合。

以上面的示例修改一下,以確保task2只在task1做了一些事情後才運行。

/**Initialization Code**/ 
SEM_ID semM; 
SEM_ID semSync; 
semM = semMCreate (...); 
semSync = semBCreate (...); 
... 

void task1() { 
    ... 
    /* Access Shared Structure */ 
    semTake (semM, WAIT_FOREVER); 
    ...<Task 1 critical section> 
    semGive (semM); 
    /* Notify Task 2 that something is available */ 
    semGive (semSync); 
    ... 
} 
void task2() { 
    ... 
    /* Wait for Task 1 to let me know there is something to do */ 
    semTake (semSync, WAIT_FOREVER); 

    /* Access Shared Structure */ 
    semTake (semM, WAIT_FOREVER); 
    ...< Task 2 critical section> 
    semGive (semM); 
    ... 
} 
+0

有兩個任務,兩個任務都需要訪問相同的關鍵資源。那麼第二個任務將如何知道第一個任務是否已經創建了一個信號量來守護資源? – Tonin 2013-05-24 13:08:24

1

我想你失去了一些東西,

在VxWorks中,所有的任務共享相同的內存空間,因此,你必須用互斥任務之間的保護全局數據。

這個想法是隻使用一個Mutex(它的sem_id對於所有想要使用它的任務都是衆所周知的)。

您可以使用一個Mutex保護數據(對使用相同Mutex的任務數量沒有限制)。


如果你想在VxWorks中2個任務之間訪問相同的內存空間,做到這一點的最好辦法是: 創建訪問功能

int access_func(void) 

{ 

    static SEM_ID sem_id=0; 

    if(sem_id == 0) 

    { 

     /* create mutex semaphore \u2013 semMCreate(\u2026) */ 

    } 

    return_code=semTake(sem_id, time_out); 

    if(return_code != 0) return errno; 

    /* read or write to or from global memory */ 

    semGive(sem_id); 

} 

注:

有semMCreate中的幾個選項和semTake中的幾個選項

您可以在系統init(建議)處創建互斥鎖。

如果互斥鎖沒有被讀取,而且sem_id仍然是零,semTake返回錯誤(你可以檢查返回代碼和系統錯誤)

+0

有兩個任務,兩個任務都想訪問相同的關鍵資源。那麼第二個任務將如何知道第一個任務是否已經創建了一個信號量來守護資源? – Tonin 2013-05-24 13:07:46

+0

在下面看到我的新答案 – 2013-06-18 15:21:15

相關問題