2016-11-07 9 views
1

In Free RTOS muss meine Aufgabe auf 3 verschiedene Ereignisse warten. Also, was ich getan habe ist, in der ISR, werde ich die Daten durch die Warteschlange von 3 verschiedenen Ereignissen senden. Und wenn eine der Warteschlangen geschrieben wird, wird der Tsak entsperrt. Auch jede dieser Warteschlangen kann überschrieben werden, d. fast ein Ereignis wird in die Warteschlange eingetragen. Also, jetzt ist die Frage, wie kann ich eine einzelne Aufgabe basierend auf Daten aus 3 Warteschlangen entsperren? Ich habe QueueSet() gesehen. Ist es gut, das zu benutzen?Verwendung der Warteschlange in Free RTOS

Antwort

0

QueueSet ist die einzige Lösung, die auf 3 Warteschlangen wartet. Aber ich denke, Sie können eine Lösung haben, auf nur eine Warteschlange zu warten, die einfacher ist. Sie müssen nur eine Struktur erstellen, die einen Code für den Ereignistyp und eine Union zum Speichern der Daten enthält:

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

Vielen Dank für Ihre Antwort :). Das Problem, das ich habe, ist, dass alle 3 Ereignisse unabhängig sind und mehrfach auftreten können, bevor ich das Ereignis im Vordergrund verarbeiten könnte. Ich wäre auch mit dem letzten Stand der Veranstaltung zufrieden. Also würde ich [Queue Overwrite] (http://www.freertos.org/xQueueOverwrite.html) verwenden. Mit Ihrer Lösung, d. H. Mit einer einzigen Warteschlange und dem Inline-Senden des Ereignisses, kann eines meiner Ereignisse überschrieben werden. Bin auch neu Stacküberlauf. Entschuldigung für meine schlechte Formatierung. – user2717596

+0

@ user2717596 Also müssen Sie 3 Warteschlangen mit 'QueueSet' verwenden;) – Garf365

+0

" die einzige Lösung "- nicht wirklich; Die Funktion kann (und ist wahrscheinlich) aus untergeordneten OS-Grundelementen aufgebaut sein. Beispielsweise können Sie eine Ereignisflaggruppe blockieren, wobei jedes Flag angibt, welche Warteschlange eine Nachricht enthält. Der Absender platziert die Nachricht in der entsprechenden Warteschlange und legt das entsprechende Ereignisflag fest. Dies ist die Vorgehensweise in einem RTOS, das keine Entsprechung zu QueueSet aufweist. Von der OS unterstützt nicht sogar Flags, könnten Sie ein Semaphor und No-Wait-Poll die Warteschlangen verwenden. Es gibt immer eine andere Lösung. Auf FreeRTOS sind diese Methoden jedoch wahrscheinlich eher ineffizient. – Clifford