2012-04-11 58 views
0

我已經創建了一個任務A和兩個消息隊列Q1,Q2。任務A是否有可能等待兩個消息隊列?RTOS:對於單個任務是否可以有兩個消息隊列?

因爲我知道這是不可能的,因爲在阻塞消息Q調用的情況下,當它沒有任何消息要處理時,任務將阻止自己(阻塞狀態)。

例如,如果Q1有消息並且Q2沒有消息,那麼在Q1的情況下,任務將處於就緒狀態並且處於Q2,任務必須處於阻塞狀態。

任務一次不能處於2個狀態。

我的理解是否正確?

+1

取決於實時操作系統。例如,Micrium的μC/ OS-III允許這樣做。你在使用哪一個?用戶手冊說了什麼? – Dan 2012-04-11 12:05:18

+0

即使實時操作系統不直接允許這樣做,您也可以在兩個隊列中編寫自己的包裝,這樣可以讓您執行此操作。當然,那麼你有責任確保沒有引入競爭/死鎖/等等的錯誤,並且任何將消息放入其中一個隊列的東西都需要直接使用包裝器而不是RTOS API。 – 2012-04-11 22:06:25

回答

0

我認爲這取決於實施的RTOS。你當然可以寫一個能夠打電話給兩個隊列的RTOS。這只是一個帶有兩個參數的RTOS調用。然後RTOS管理這兩個隊列,並知道這兩個隊列上的任務都處於等待狀態。但是,我從來沒有見過實現這一點的RTOS。

1

確切的方法將取決於您的RTOS,但實質上您需要等待事件或信號量,然後輪詢隊列(非阻塞/零超時讀取)。發送任務必須將消息放置在適當的隊列中,然後設置事件或sempahore - 這應該在單個任務接口函數中完成 - 發送任務不應該知道接收任務通信的機制。

如果您使用事件標誌,則可以爲每個隊列使用一個單獨的標誌,因此您知道從哪個隊列中讀取(一個或另一個或兩個),但由於事件標誌不包括對象,因此您需要在隊列中存在多於消息的情況下迭代輪詢隊列直到它被用盡。

計數信號量有一定的用處,但只告訴你消息的總數,而不是它們在哪個隊列上,所以每次採取sempahore時都必須檢查它們。這可能會導致讀取一條信號量(每個隊列一條)的兩條消息,然後是沒有相應消息的sem-take。您可以使用共享數據增加信號量,或者您的RTOS可能能夠報告隊列中的消息數量。

一個二進制信號量就像事件標誌一樣工作,除了它不會告訴哪個隊列有消息,所以你將不得不輪詢兩者。

0

大多數RTOS不提供此功能,但您可以實施。

作爲一個例子RTOS; GHS-INTEGRITY內置此功能,您可以等待一個或多個;消息隊列接收事件,定時器過期事件,設備rx緩衝區獲取事件,設備tx緩衝區在同一行(時間)發送事件。

相關問題