Vorteile von RTOS gegenüber Bare Metal für die MCU-Programmierung?

11

Bitte beachten Sie: Diese Frage erwähnt speziell zwei RTOS, ist jedoch allgemeiner und kann wahrscheinlich von jedem beantwortet werden, der zuvor C-Code für eingebettete RTOS geschrieben hat und dessen Software direkt auf MCUs ausgeführt wurde.

Ich bin daran interessiert, mehr über eingebettete RTOSs zu erfahren und Anwendungen für sie zu schreiben. Ich sehe mir derzeit Embox und RIOT an, weil sie Open Source, modern, aktiv und mit hervorragender Dokumentation ausgestattet sind. Mein Ziel besteht aus zwei Phasen: Phase 1 besteht darin, herauszufinden, wie diese Betriebssysteme kompiliert und auf eine MCU (wahrscheinlich AVR oder ARM) geflasht werden. Phase 2 besteht darin, ein einfaches C-Programm (im Grunde ein kopfloser Daemon) zu schreiben, das sich im Laufe der Zeit als "Hobby-App" entwickeln würde. Ich würde dieses Programm dann auf derselben MCU flashen / bereitstellen und dabei erfolgreich einen Appstack bereitstellen, der aus Embox / RIOT und meiner darauf befindlichen App besteht.

Bevor ich alle Straßen nach unten gehen , die letztendlich in Sackgassen führen, ich über stolperte diesen Artikel , die einen ziemlich guten Job zu erklären , warum Echtzeit - Anwendungen, geschrieben in C / Assembler und geflasht MCUs, nicht wirklich brauchte RTOSes sie unter .

Jetzt bin ich wirklich verwirrt und stelle einige meiner grundlegenden Kenntnisse der Computertheorie in Frage. Ich denke, ich versuche zu entscheiden, ob ich Embox / RIOT überhaupt verwenden soll oder nicht:

  • Bleiben Sie auf Kurs und nutzen Sie einen "App-Stack" auf der MCU beider OS + -Apps. oder
  • Beachten Sie die Warnung des Artikels und gehen Sie einfach mit einer MCU, auf der meine App "Bare Metal" ausgeführt wird.

Ersteres ist natürlich mehr Arbeit, und daher sollte es einen guten Grund / eine gute Auszahlung für diesen Weg geben. Ich frage also: Was sind die wirklichen Vorteile, die diese (und ähnliche) eingebetteten RTOS für MCU / C-App-Entwickler bieten? Welche spezifischen Funktionen könnte meine C-App durch die Verwendung eines RTOS nutzen (möglicherweise, indem das Rad nicht neu erfunden wird?)? Was geht verloren, wenn man das RTOS fallen lässt und auf Bare Metal geht?

Ich bitte hier um konkrete Beispiele, nicht um den Medienrummel, den man bekommt, wenn man zum Wikipedia-Eintrag für RTOSes geht ;-)

smeeb
quelle
3
Wenn Ihnen nicht einmal klar ist, was ein RTOS bietet, warum möchten Sie dann Bewerbungen für sie schreiben? Ob ein RTOS für Sie von Vorteil ist oder nicht, hängt ganz davon ab, was Sie erreichen möchten. Vor diesem Hintergrund müssen Sie laufen lernen, bevor Sie rennen können. Programm für das Bare Metal, und wenn Sie auf Probleme stoßen und diese lösen, werden Sie wirklich lernen, was die Vor- und Nachteile sind.
Whatsisname
Vielen Dank an @whatsisname (+1) - das ist ein guter Rat und ich werde Sie wahrscheinlich darauf ansprechen. Ich denke jedoch nicht, dass es ein Fauxpas ist, immer noch daran interessiert zu sein, was die RTOS bieten, selbst wenn ich Monate / Jahre davon entfernt bin, sie zu brauchen. Ich denke, ich würde gerne das ganze Bild von vorne sehen, bei einer Sicht von 30.000 Fuß. Danke noch einmal!
Smeeb

Antworten:

11

Mikrocontroller-Programme bestehen aus einer Reihe von Aufgaben . Angenommen, Sie wollten eine computergesteuerte Teleskophalterung herstellen. Die Aufgaben wären:

  • Rufen Sie ein neues Eingabebyte aus dem seriellen USB-Puffer ab.
  • Überprüfen Sie, ob wir einen vollständigen Befehl erhalten haben.
  • Wenn ja, führen Sie diesen Befehl aus.
  • Lesen Sie die Sensoren für die aktuelle Teleskopposition ab.
  • Stellen Sie den richtigen Ausgang ein, um den nächsten Schritt der Motoren zu steuern.

Dies ist ein ziemlich typischer Satz von Aufgaben für etwas, für das Sie einen Mikrocontroller verwenden würden, und der mit einer Endlosschleife ziemlich einfach zu verwalten ist, wie:

while(TRUE) {
  uint8_t input = readUsbBuffer();
  parseCommand(input);
  readSensors();
  setMotors();
}

Wenn Sie weiterhin Funktionen hinzufügen und hinzufügen, stoßen Sie schließlich auf häufig auftretende Probleme, für die Sie Abstraktionen erstellen möchten, z.

  • Ihr Puffer läuft über, daher möchten Sie sicherstellen, dass die Aufgabe andere Aufgaben unterbrechen kann, bevor sie überläuft.
  • Sie möchten Batterie sparen, indem Sie schlafen, wenn nichts benötigt wird.
  • Sie möchten sicherstellen, dass alle Aufgaben fair ausgeführt werden. Wenn es readSensorszu lange dauert, möchten Sie es unterbrechen und später darauf zurückkommen können.
  • Sie möchten nur eine Aufgabe zurücksetzen können, ohne andere zu beeinflussen.
  • Sie möchten, dass ein Speicherverlust oder ein anderer Fehler in einer Aufgabe die anderen Aufgaben nicht beseitigt.
  • Sie möchten in der Lage sein, verschiedenen Aufgaben unterschiedliche Prioritäten zu geben.
  • Sie möchten in der Lage sein, eine nicht vertrauenswürdige Aufgabe zu sandboxen.
  • Sie möchten Aufgaben mit unterschiedlichen Raten ausführen können. Möglicherweise können Ihre Sensoren nur 10 Mal pro Sekunde gelesen werden, aber Sie möchten einen Motorschritt 100 Mal pro Sekunde ausführen.

Ein oder zwei dieser Elemente können relativ einfach manuell gehandhabt werden. Wenn Sie genug von diesen Problemen häufig genug haben, um sie in Bibliotheken zu verallgemeinern, haben Sie ein RTOS im Grunde neu erfunden. Wenn die Aufgabenverwaltung Ihres Programms komplex genug ist, selbst wenn Sie kein Standard-RTOS verwenden, werden Sie eines möglicherweise schlecht neu erfinden.

Nach meiner Erfahrung liegt die Leitung, in der Sie ein RTOS wünschen, jedoch sehr nahe an der Leitung, in der Sie einen Mikroprozessor anstelle eines Mikrocontrollers wünschen. Wenn Sie davon ausgehen, dass Ihre Firmware so komplex wird, ist es normalerweise besser, von Anfang an den Weg des Mikroprozessors zu gehen.

Karl Bielefeldt
quelle
Dies ist eine hervorragende Analyse und hat es mir wirklich klar gemacht. Ich stimme dem zu, was Sie sagen, aber ich stimme der Antwort von @Atsby eher zu. Besonders wenn das Ziel darin besteht, meine eigenen Fähigkeiten zu lernen / zu verbessern. In einem Produktionssystem, wahrscheinlich besser dran mit einem COTS-Produkt oder RTLinux, aber um dieses Produkt auf niedriger Ebene debuggen zu können, wenn etwas schief geht, müsste ich persönlich einen Code geschrieben haben, der so oft auf dieser Liste steht wie möglich.
Sam Hammamy
7

Ich habe meine eigene kooperative Multithreading-Bibliothek für ARM Cortex-M0 geschrieben.

Es waren kaum ein paar Seiten Code, und die erste Version brauchte nicht länger als einen Tag, um zu schreiben und zu debuggen.

Der große Vorteil von Roll-Your-Own ist, dass Sie den Code kennen und ihn auf Chips portieren können, die das RTOS möglicherweise nicht unterstützt. Außerdem verbringen Sie weniger Zeit damit, über Fragen wie "Wird es abstürzen, wenn ich versuche, die Funktionen A und B gleichzeitig zu verwenden?" Seit Sie den Code geschrieben haben, kennen Sie die Antwort.

Threading ist die Hauptsache, die Sie von einem RTOS erhalten, und es stellt sich heraus, dass es keine so große Sache ist, sich selbst zu implementieren. Es ist selten, dass Sie viele Funktionen eines RTOS benötigen. Wenn Sie jedoch Ihre Anforderungen erfüllen und sich herausstellt, dass dies der Fall ist, verwenden Sie ein RTOS.

Atsby
quelle
Danke @Atsby! Diese Antwort hat mir wirklich bei der Entscheidung geholfen, ob es sich lohnt, mehr über Bare Metal zu lernen. Ich habe geschrieben, was für den Pi einer GPIO-Bibliothek in Bare-Metal entspricht, und ich denke jetzt, es ist Zeit, ein oder zwei Schritte weiter zu gehen. Vielen Dank!
Sam Hammamy