Grundlegendes RTOS-Konzept. Aufgaben Kommunikation

Ich lerne, in diesem Fall ein RTOS, CMSIS RTOS, zu verwenden, daher ist meine Frage grundlegend. Ich möchte wissen, wie ich Informationen zwischen zwei Aufgaben am besten austauschen kann.

Was ich versuche, ist im Grunde ein Controller mit etwas externer Kommunikation. Dieses System hat zwei Aufgaben.

Aufgabe 1. Controller-Aufgabe:

  • Es wird in festen Intervallen alle X ms so schnell wie möglich ausgeführt
  • Es hat einen Sollwert
  • Es liest mehrere Sensoren
  • Es berechnet und setzt mehrere Ausgänge

Aufgabe 2. Kommunikationsaufgabe:

  • Es ist ein Slave in einer Master/Slave-Kommunikation (Modbus). Es kommuniziert also nur, wenn es eine Anfrage vom Master erhält
  • Es muss in der Lage sein, den Sollwert einzustellen
  • Es muss in der Lage sein, den Wert/Status von Sensoren und Ausgängen zu lesen

Wie sollen diese beiden Aufgaben kommunizieren? Wenn ich kein RTOS verwendet habe, werde ich private globale Variablen verwenden, die mit einigen öffentlichen Get/Set-Funktionen umschlossen sind. Aber soweit ich verstehe, ist das nicht der Weg, dies in einem RTOS zu tun.

Sollte ich eine Warteschlange verwenden, in der die Kommunikationsaufgabe eine Anforderungsnachricht schreibt, dass die Controller-Aufgabe jede Iteration überprüft? Das Problem, das ich bei dieser Lösung sehe, ist, dass die Controller-Task so schnell wie möglich ausgeführt werden muss, sodass entweder die Controller-Task nur auf eine Anfrage pro Iteration antwortet, wodurch die Kommunikationstask weniger reaktionsschnell wird, oder sie auf alle Anfragen antwortet, wodurch ihre Ausführungszeit länger wird .

Sie sagen, dass Sie bei einer eingehenden Kommunikationsanfrage einen Sensorwert senden müssen? Wenn ja, was ist die erforderliche Reaktionszeit vom Senden dieser Nachricht vom sendenden Gerät bis zu dem Wert, der von Ihrem Gerät mit dem RTOS zurückgegeben wird?
Mehrzonenofen? Oder warum gibt es nur einen Sollwert? Wie werden die Messwerte fusioniert?
Ich denke, die privaten Variablen mit öffentlichen Get/Set-Funktionen wären in Ihrem RTOS-Design immer noch in Ordnung. Stellen Sie einfach sicher, dass die Get/Set-Funktionen Thread-sicher sind. Warum lässt Sie das RTOS an diesem Design zweifeln?
@kkrambo Ich bin neu mit RTOS. Ich dachte, ich sollte versuchen, globale Variablen zu vermeiden und nur Variablen zu verwenden, die in den Aufgaben definiert sind. Ich weiß nicht, wann die Verwendung von Globals akzeptabel ist.
@jonk Es ist nicht unbedingt ein Kontrollsystem. Es ist eher eine Zustandsmaschine, bei der ich zuerst die Sensoren auslese und die Ausgänge betätige. Unterschiedliche Sollwerte verwenden unterschiedliche Teile des Systems
@DiBosco Die Controller-Task hat die höchste Priorität. Die Kommunikation wird verwendet, um den Status des gesamten Systems zu überwachen. Eine Anfrage könnte nach dem Status aller Sensoren und Ausgänge des Systems fragen. Die Antwortzeit für diese Nachricht liegt irgendwo um die Controller-Task-Periode herum
@JHG Okay. Ihre bisherige Beschreibung lässt mich glauben, dass es in Ordnung wäre, Ihren Controller einfach von einem Präzisionstimer aus zu betreiben und sehr einfache Vorkehrungen für den Rest zu treffen. Aber ohne weitere Informationen ist das nur eine zufällige Meinung.
Globale Variablen sind unerwünscht, unabhängig davon, ob Sie ein RTOS verwenden. Aber wenn Sie die Variable privat für eine Datei/ein Objekt machen und get/set-Funktionen haben, um darauf zuzugreifen, dann ist es nicht wirklich eine globale Variable, oder? Wenn Sie ein RTOS verwenden, stellen Sie sicher, dass Ihre get/set-Funktionen Thread-sicher sind.

Antworten (1)

Dies ist eine gute Möglichkeit, Daten zwischen Aufgaben zu übergeben, ja. Wenn es so etwas wie FreeRTOS ist, können Sie auch die empfangende Aufgabe blockieren, bis sich etwas in der Warteschlange befindet (wenn Sie möchten). Oder Sie können prüfen und durchspringen oder eine bestimmte Zeit warten, bevor Sie zur nächsten Anweisung in der Aufgabe wechseln. Diese Blockierung ist meiner Meinung nach eine der wahren Schönheiten beim Betrieb eines RTOS. In der Lage zu sein, eine Aufgabe darauf warten zu lassen, dass eine andere Aufgabe sie übergibt, kann Ihr Leben viel einfacher machen, und Warteschlangen ermöglichen dies auf Thread-sichere Weise.

Sie haben auch die Möglichkeit zu prüfen, ob eine Warteschlange voll ist, bevor Sie darauf schreiben, und wenn sie voll ist, die Möglichkeit zu warten, bis Platz ist, bevor Sie darauf schreiben.

Ich nehme an, Sie haben die Möglichkeit, viele verschiedene Arten von Daten in die Warteschlangen zu schreiben, einschließlich Strukturen. Warteschlangen sind sehr nützlich und eine sichere Möglichkeit, Daten zu übergeben.