Ich entwickle ein UART-Protokoll, um die Kommunikation zwischen zwei Boards (Master-Board und Slave-Board) sicherzustellen. Das Slave-Board enthält viele Sensoren und Aktoren und das Master-Board soll dieses Board durch eine Reihe von Befehlen wie GET_SENSOR_VALUE
und SET_MOTOR_SPEED
usw. steuern ... Viele Funktionen sollen in meinem Projekt ausgeführt werden und eine permanente Kontrolle der Sensorwerte soll erfolgen (Beispiel: Master-Board soll erhalten Temperaturwert alle 5 Sekunden, es soll den Batteriestand alle 5 Sekunden abrufen, es soll die Belüftung aktivieren, wenn die Temperatur hoch ist ...). Alle Geräte sind mit der Slave-Platine (Sensoren und Aktoren) verbunden und die Hauptaufgabe der Master-Platine ist die Überwachung.
Ich habe einige Artikel über Spezifikationen und das Design eingebetteter Systeme gelesen und festgestellt, dass das erste, was Sie tun müssen, bevor Sie beginnen, den Kernel auszuwählen: RTOS oder GPOS (Bare Metal).
Meine Frage ist: Sollte ich in meinem Fall, wenn ich RTOS (im Masterboard) wähle, meine Anforderungen als separate Aufgaben/Funktionen implementieren?
Wenn ja, unterstützt UART die Hochgeschwindigkeits-Kontextumschaltzeit? Beispiel:
00:00 temperature_task : GET_TEMPERATURE
if temp>threshhold send START_VENTILATION
00:01 battery_task: GET_LEVEL
if level <threshhold send 00 TURN_OFF_SYSTEM
:02feuchtigkeitsaufgabe: GET_HUMIDITY
if level <threshhold send DO_SOMETHING
00:03 temperature_task : GET_TEMPERATURE
if temp>threshhold send START_VENTILATION
00:04 battery_task: GET_LEVEL
if level <threshhold send TURN_OFF_SYSTEM
00:05 feuchtigkeitsaufgabe: GET_HUMIDITY
wenn level <threshhold sendDO_SOMETHING
Ja, es ist im Allgemeinen eine GROSSE Idee, die Funktionalität auf diese Weise zu trennen, wenn ein RTOS im System ist. Es muss große Sorgfalt darauf verwendet werden, den gegenseitigen Ausschluss zwischen Aufgaben und gemeinsam genutzten Ressourcen wie gemeinsamem Speicher oder Peripheriegeräten sicherzustellen, um Wettlaufbedingungen und unvorhersehbares Verhalten zu vermeiden. Ein üblicher Ansatz für dieses Problem besteht darin, jedes Peripheriegerät hinter einer "Gatekeeper"-Aufgabe zu blockieren, die den ein- und ausgehenden Datenfluss verwaltet und typischerweise eine Rückruffunktion an den Anrufer ausgibt, wenn die erwarteten Daten empfangen wurden. Lesen Sie diesen Artikel (Kapitel 7 geht speziell darauf ein) aus der FreeRTOS-Dokumentation. Abgesehen davon kann der Bare-Metal-Ansatz vollkommen ausreichend sein, während eine engere Kopplung zwischen funktionalen Softwaremodulen besteht.
Normalerweise ist UART bidirektional (RX + TX-Draht), sodass Sie senden/empfangen können, ohne umschalten zu müssen.
Ich habe keine (Arduino-)Erfahrung mit RTOS, aber das Aufteilen von Funktionalität in Funktionen ist immer eine gute Sache. In diesem vernünftig einfachen Fall benötigen Sie keine Tasks oder ein RTOS. Dies erschwert vor allem den UART-Zugriff und die notwendige gemeinsame Nutzung von Daten zwischen Tasks.
Zu Ihren "Timing" -Anforderungen: Eine Sekunde ist eine enorme Zeit, selbst für einen einfachen Mikrocontroller wie einen Arduino. Sie können wahrscheinlich beide Bare-Metal-Arduinos verwenden (es sei denn, Sie planen, komplizierte Berechnungen/Schemata zu verwenden), vorausgesetzt, Sie können alle Sensoren an einem Arduino (oder Mega?) Anbringen.
Wenn Sie dies fest machen (z. B. immer 20 Byte für die Aufnahme aller Sensorwerte), benötigen Sie kein Newline/Ende-of-Message-Byte.
Zum Protokoll: warum nicht alle x ms alle Daten von allen Sensoren als ein Paket an die Steuerung senden (Slave to Master). Und der Master kann bei Bedarf (on the fly für niedrige Latenz) kurze Nachrichten wie „System ausschalten“ oder bestimmte Befehle (einschließlich Parameter) senden.
Beispiel für Befehle vom Slave zum Master:
Byte Meaning
0 Temp sensor
1 Humidity level
2 Battery level (?)
3 ... other sensors
Beispiel für Befehle vom Master:
Byte 0 Byte 1
Command Parameter Meaning
0 n.a. Turn off system
1 n.a. Turn on system
2 0-255 Move servo to loc x (as example)
usw.
Morcillo
Chris Stratton
Benutzer72833