0

Im Anschluss an die Diskussion unter State machine program design in FreeRTOS - vTaskStartScheduler in a switch statement habe ich eine Zustandsmaschine mit 4 Zuständen, von denen jeder verschiedene Aufgaben hat, die Sensordaten lesen.Entwurf eines Zustandsautomaten in FreeRTOS - Aufgabe zur Verwaltung der Zustandsänderungen

Wenn ein Sensordaten eine Schwelle erreicht, muss seine Aufgabe eine Zustandsänderung verursachen.

Die Idee besteht darin, eine übergeordnete Aufgabe zu haben, die die Zustände steuert (und entsprechende Aufgaben aussetzt/wieder aufnimmt) mit einer switch-Anweisung. Meine Frage ist: Wie sollen die Sensoraufgaben den ZUSTAND mit der übergeordneten Aufgabe kommunizieren?

Eine vorgeschlagene Lösung besteht darin, eine set_state-Funktion zu haben, die von der ereignisgenerierenden Task aufgerufen wird, aber ich habe gelesen, dass es in FreeRTOS keine globalen Variablen gibt. Ich dachte, es über Warteschlangen zu implementieren:

1- Task1 erkennt Sensorschwellenwert und sendet STATE an eine Warteschlange.

2- Übergeordneter Task ist blockiert, der auf Daten aus der Warteschlange wartet. Wenn sie STATE empfängt, verarbeitet die switch-Anweisung die Statusänderung.

Wenn dieser Ansatz richtig ist, bezieht sich meine Zweifel darüber, wie und wo soll (in dem Stapel jeder Aufgabe, oder die überlegene Aufgabe ... bestehenden globalen oder gerade)

Antwort

1

STATE sollte nur existieren STATE definiert werden wo es sein muss, "in" der überlegenen Aufgabe. Ich nehme an, Sie verwenden C, also deklarieren Sie STATE als static Variable in "superior_task.c" (oder was auch immer es heißt). Dies bedeutet, dass es nur innerhalb dieser Datei betroffen sein kann - das C entspricht einer privaten Membervariablen in C++.

Wenn Ihre minderwertigen Aufgaben eine Statusänderung beeinflussen müssen, buchen sie ein Statusänderungsereignis in eine Warteschlange, die von der übergeordneten Aufgabe verwaltet wird. Wenn die Warteschlange verarbeitet wird, nimmt der übergeordnete Status die Änderung an der privaten STATE-Variablen vor.

Wenn andere Aufgaben wissen müssen, was der Status für ihre eigene Verarbeitung ist, können sie einen Accessor für die private Variable verwenden, z. B. State get_state() { return STATE; }. Wie Martin jedoch sagt, sollten die anderen Aufgaben den Status nicht kennen müssen, da andernfalls Abhängigkeiten zwischen Aufgaben bestehen, die nicht existieren sollten.

+1

Ja, mit nur einem Thread die State-Machine zu verwalten, mit allen anderen Eingängen in Warteschlange und warten auf Action-Anfragen zurück, ist ein gutes Design, das relativ einfach zu debuggen ist, aber 'wenn andere Aufgaben wissen müssen was der Staat für ihre eigene Verarbeitung ist - sie sollten nicht! –

+0

Fairer Punkt, ich fügte hinzu, dass mehr zu zeigen, wie der Staat angesehen werden kann, wenn es privat ist. –

+0

Ja, minderwertige Aufgaben müssen den Status nicht kennen, da sie von der übergeordneten Aufgabe ausgesetzt oder wieder aufgenommen werden. Dann, wenn ich nur eine task_definitions.c habe, die alle Definitionen und die Erstellung aller FreeRTOS-Aufgaben zusammen hat, denke ich, dass STATE einfach eine lokale Variable innerhalb der übergeordneten Aufgabenfunktion sein könnte, oder? –

Verwandte Themen