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
1
A
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;
}
}
}
Verwandte Themen
- 1. Anzahl der Aufgaben in RTOS
- 2. Heap Korruption bei der Verwendung von free()
- 3. Der Keil RTX-RTOS-Threadstapelgröße
- 4. Leerlaufzeit in RTOS
- 5. Beispielprojekt für Keil RTOS-Thread-Verwendung auf ARM STM32F4xx
- 6. RTOS STM32F4 Entdeckung
- 7. Integrity RTOS \ Multi Compiler
- 8. Seltsame Änderung im Programm bei der Verwendung von free()
- 9. Verwendung von Threads und Warteschlange in VC++
- 10. free-jqgrid: mutliselect in free-jqgrid 4.14.0
- 11. Beenden eines Threads CMSIS-RTOS
- 12. Verwendung von malloc/free in Objective-C Objekt
- 13. Nachteil der zirkulären Warteschlange?
- 14. Preemptive Aufgabe auf nicht RTOS
- 15. Open-Source-RTOS-Code-Links
- 16. Free JqGrid - Breite der Suchfilter
- 17. Effizienz der Verwendung einer Python-Liste als Warteschlange
- 18. Massenbearbeitung in free-jqgrid
- 19. gleichzeitige Warteschlange - allgemeine Frage (Beschreibung und Verwendung)
- 20. Aktualisieren der Benutzeroberfläche bei Verwendung einer seriellen Warteschlange
- 21. Tricky Warteschlange Verwendung zwischen zwei CPUs
- 22. free() funktioniert nicht in C
- 23. PayPal IPN - In der Warteschlange
- 24. Optimierung der Warteschlange in mysql
- 25. Lock-free Referenz Zählen
- 26. Free-jqGrid navButtonAdd buttonColor
- 27. Was ist der Unterschied zwischen RTOS und Embedded Linux?
- 28. eps-open-rtos: sdk_wifi_station_get_connect_status gibt 255 zurück
- 29. C Heap-Puffer-Beschädigung bei Verwendung von free()
- 30. Drucken der zirkulären Warteschlange
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
@ user2717596 Also müssen Sie 3 Warteschlangen mit 'QueueSet' verwenden;) – Garf365
" 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