1
在免費的RTOS中,我的任務必須等待3個不同的事件。所以,我所做的是,在ISR中,我將通過來自3個不同事件的隊列發送數據。如果任何隊列被寫入,tsak將被解除阻塞。此外,每個隊列都可以被覆蓋,最多一個事件將被填入隊列中。所以,現在的問題是,如何根據3個隊列中的數據解鎖一個任務? 我見過QueueSet()。使用它很好嗎?Free RTOS的隊列設置使用
在免費的RTOS中,我的任務必須等待3個不同的事件。所以,我所做的是,在ISR中,我將通過來自3個不同事件的隊列發送數據。如果任何隊列被寫入,tsak將被解除阻塞。此外,每個隊列都可以被覆蓋,最多一個事件將被填入隊列中。所以,現在的問題是,如何根據3個隊列中的數據解鎖一個任務? 我見過QueueSet()。使用它很好嗎?Free RTOS的隊列設置使用
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;
}
}
}
感謝您的回覆:)。我遇到的問題是,所有3個事件都是獨立的,並且可以在我能夠在前臺處理事件之前多次發生。另外我會滿足於最新的事件狀態。所以,我會使用[Queue Overwrite](http://www.freertos.org/xQueueOverwrite.html)。因此,在您的解決方案中,即使用單個隊列並以串聯方式發送事件,我的一個事件可能會被覆蓋。也是新的堆棧溢出。對不起,我的格式不好。 – user2717596
@ user2717596所以你必須使用3個隊列和'QueueSet';) – Garf365
「唯一的解決方案」 - 不是真的;該函數可以(也可能是)從較低級別的OS基元構建而成。例如,您可以阻止事件標誌組,其中每個標誌指示哪個隊列包含消息。發送者將消息放入適當的隊列中,並設置相應的事件標誌。這就是您在RTOS中所做的與QueueSet不相同的操作。操作系統不支持甚至標誌,你可以使用信號量和不等待輪詢隊列。總有另一個解決方案。然而,在FreeRTOS上這些方法可能效率很低。 – Clifford