2016-11-07 77 views
1

在免費的RTOS中,我的任務必須等待3個不同的事件。所以,我所做的是,在ISR中,我將通過來自3個不同事件的隊列發送數據。如果任何隊列被寫入,tsak將被解除阻塞。此外,每個隊列都可以被覆蓋,最多一個事件將被填入隊列中。所以,現在的問題是,如何根據3個隊列中的數據解鎖一個任務? 我見過QueueSet()。使用它很好嗎?Free RTOS的隊列設置使用

回答

0

QueueSet是等待3個隊列的唯一解決方案。但我認爲你可以有一個解決方案只等待一個隊列,這很簡單。你只需要創建一個包含事件類型代碼和聯合來存儲每個數據的結構:

enum EventType 
{ 
    Event1, 
    Event2, 
    Event3 
}; 

struct EventMessage 
{ 
    enum EventType event; 
    union 
    { 
     int paramEvent1; 
     char paramEvent2; 
     unsigned char paramEvent3[4]; 
    } parameters; 
}; 

void sendEvent1(...) 
{ 
    struct EventMessage msg; 
    msg.event = Event1; 
    msg.parameters.paramEvent1 = ...; 

    xQueueSend(queue, &msg, portMAX_DELAY); //or xQueueSendFromISR if is in ISR 
} 

// Same for event2 and 3, replacing "msg.event = " with correct code 
// And set correct parameters 

void task(void * cookie) 
{ 
    struct EventMessage msg; 

    for(;;) 
    { 
     xQueueReceive(queue, &msg, portMAX_DELAY); 
     switch(msg.event) 
     { 
      case Event1: 
       //manage event1 
       break; 
      case Event2: 
       //manage event2 
       break; 
      case Event3: 
       //manage event3 
       break; 
     } 
    } 
} 
+0

感謝您的回覆:)。我遇到的問題是,所有3個事件都是獨立的,並且可以在我能夠在前臺處理事件之前多次發生。另外我會滿足於最新的事件狀態。所以,我會使用[Queue Overwrite](http://www.freertos.org/xQueueOverwrite.html)。因此,在您的解決方案中,即使用單個隊列並以串聯方式發送事件,我的一個事件可能會被覆蓋。也是新的堆棧溢出。對不起,我的格式不好。 – user2717596

+0

@ user2717596所以你必須使用3個隊列和'QueueSet';) – Garf365

+0

「唯一的解決方案」 - 不是真的;該函數可以(也可能是)從較低級別的OS基元構建而成。例如,您可以阻止事件標誌組,其中每個標誌指示哪個隊列包含消息。發送者將消息放入適當的隊列中,並設置相應的事件標誌。這就是您在RTOS中所做的與QueueSet不相同的操作。操作系統不支持甚至標誌,你可以使用信號量和不等待輪詢隊列。總有另一個解決方案。然而,在FreeRTOS上這些方法可能效率很低。 – Clifford