請有人可以幫我解決這個問題。 是否有可能爲2個不同的任務創建2個不同的信號用於在VxWorks中獲得相同的關鍵資源?是否有可能創建2個不同的信號來保護VxWorks中的相同資源?
回答
這應該包含在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);
...
}
有兩個任務,兩個任務都需要訪問相同的關鍵資源。那麼第二個任務將如何知道第一個任務是否已經創建了一個信號量來守護資源? – Tonin 2013-05-24 13:08:24
我想你失去了一些東西,
在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返回錯誤(你可以檢查返回代碼和系統錯誤)
有兩個任務,兩個任務都想訪問相同的關鍵資源。那麼第二個任務將如何知道第一個任務是否已經創建了一個信號量來守護資源? – Tonin 2013-05-24 13:07:46
在下面看到我的新答案 – 2013-06-18 15:21:15
- 1. 檢測是否iframe的來源有「相同的原產」保護
- 2. 是否可以創建2個可能不具有相同值的字段?
- 3. 是否有可能有2個不同的NSNumber對象具有相同的值?
- 4. 創建三個使用不同資源的相同網站?
- 5. 是否有可能有多個EDMX共享相同的型號?
- 6. 是否有可能在SparseArray中有2個不同的類?
- 7. 相同的UIViewController從2個不同的來源,但有不同的結果
- 8. 是否有可能爲telerik調度程序中的每個資源組創建不同的時間線?
- 9. 是否有可能在vim中有相同的視圖中的2個Nerd Trees
- 10. 相同來源,具有不同資源的多個目標(Visual Studio .Net 2008)
- 11. 在2個不同的JtabbedPanes中創建相同的jtable
- 12. 有關VxWorks的良好信息來源?
- 13. 是否有可能在同一個佈局中擁有2個具有相同功能的按鈕?
- 14. 是否有可能兩個不同字符串的MD5是相同的?
- 15. 是否有可能創建一個相同的Maven項目的WAR和JAR
- 16. 是否有可能有兩個具有相同名稱的不同變量?
- 17. 是否有可能使用不同的SelectItem類型創建SelectOneMenu
- 18. http和https資源是否相同?
- 19. 是否有可能有2個變量指向內存中的相同地址
- 20. 如何檢查兩個不同的URL是否指向相同的資源?
- 21. 是否可以爲不同的數據保護單個REST API?
- 22. RAML不同queryParameters,相同的資源
- 23. C#:是否有可能從program.cs中的資源圖像創建一個位圖?
- 24. 2資源通知相同的服務
- 25. Apache;是否有可能爲2個不同的目錄有1個相同的別名?
- 26. 2個不同值的結果能否與sha1中的不同值相同?
- 27. 是否有可能有不同的IsolatedStorageSettings.ApplicationSettings?
- 28. 是否可以爲同一個類創建不同的mouseClicked()?
- 29. 是否有可能有2個方法(GET和POST)具有相同的路線?
- 30. 每個接入點是否需要有不同的或相同的信道才能互相通信?
這聽起來像一個非常糟糕的主意。 – Kcvin 2013-05-10 12:05:20