it-swarm.com.de

Wie ändere ich Software so, dass sie in Echtzeit funktioniert?

Zum ersten möchte ich erwähnen, dass ich ein Neuling in der Echtzeit-Systemprogrammierung bin. Deshalb bin ich mir nicht sicher, ob meine Fragen richtig sind. Entschuldigung, aber ich brauche etwas Hilfe

Frage kurz : Wie implementiere ich harte Echtzeitsoftware, um sicherzustellen, dass sie die harten Fristen einhält? Ist es notwendig, einige QNX-Funktionen zu verwenden? Oder reicht es gerade aus, es für Linux zu schreiben, auf QNX zu portieren und es wird standardmäßig in Echtzeit sein?

Vollständige Frage : Wir haben eine komplexe plattformübergreifende Multiprozess-Software mit prozessübergreifender Kommunikation für Linux, Windows, Android und QNX) implementiert. Die Programmiersprache ist C++, die wir verwenden Boost und Planty anderer Bibliotheken. Unsere Software erledigt ihre Arbeit gut und schnell, ist aber immer noch ein Prototyp. Für Produktionszwecke müssen wir dies in Echtzeit tun. Einige unserer Funktionen müssen in Echtzeit und sehr robust sein, da sie sehr wichtig sind und die Sicherheit von Personen, die unsere Software verwenden, kann von ihnen abhängen. Sie arbeiten ziemlich schnell - bis zu Hunderten von Millisekunden. Aber ich bin mir nicht sicher, ob unser System aufgrund dieser Tatsache wirklich in Echtzeit ist (habe ich Recht?).

Es gibt also eine Hauptfrage: Wie kann man unsere Software so ändern, dass sie in Echtzeit ist? Ich habe viel gegoogelt, aber ich habe immer noch keine Ahnung, wie ich es machen soll.

Einige zusätzliche Informationen zu unseren Plattformen: Linux und Windows verwenden wir derzeit nur zu Testzwecken. Android - wir haben immer noch nicht entschieden, ob wir es brauchen. QNX - ist unser Zielbetriebssystem für die Produktion. Ich denke, die Antwort auf meine nächste Frage lautet "NEIN" :) Aber ist es möglich bei alles, um plattformübergreifende Echtzeitsoftware (für Echtzeitbetriebssysteme (RTOS) sowie für Allzweckbetriebssysteme (GPOS)) zu implementieren?

Möglicherweise müssen wir uns bemühen, alle Echtzeitfunktionen nur für QNX zu implementieren? Aber ich verstehe immer noch nicht, wie es geht. Könnte jemand ein Licht auf diese Frage werfen?

9
user172825

Schnell bedeutet nicht Echtzeit und Echtzeit bedeutet nicht schnell.

Echtzeit bedeutet, dass das Datum, an dem das Ergebnis geliefert wird, genauso wichtig ist wie sein Wert. Mit anderen Worten, wenn das Ergebnis einen korrekten Wert hat, aber zu früh oder zu spät geliefert wird, ist das Gesamtergebnis falsch.

Stellen Sie sich zum Beispiel einen Videoplayer vor. Wenn Videobilder nicht mit der richtigen Rate angezeigt werden, sind die Benutzer nicht zufrieden. Schlimmer noch, wenn Bild und Ton nicht synchron sind.

Dieses Beispiel zeigt, dass einige Echtzeitanwendungen auf aktuellen Allzweckbetriebssystemen implementiert werden können.

In Bezug auf die Folgen eines Terminfehlers wird jedoch zwischen harter Echtzeit und weicher Echtzeit unterschieden: In weichen Echtzeitsystemen ist dies nur ein Ärger oder ein verschlechterter Dienst (denken Sie an eingefrorene Bilder während einiger Sekunden in Beispiel für einen Videoplayer), während es sich um einen (möglicherweise katastrophalen) Fehler in einem Echtzeitsystem handelt, beispielsweise in einem Kernkraftwerk.

38
mouviciel

Wie @ mouviciel bereits sagte, sind Echtzeit und schnell zwei unabhängige Eigenschaften, obwohl viele Echtzeitfristen implizieren, dass eine relativ schnelle Antwort erforderlich ist.

Beim Schreiben von Echtzeitsoftware ist die wichtigste Eigenschaft neben einer korrekten Antwort, dass Sie genau vorhersagen können, wie schnell die Antwort gegeben wird. Für harte Echtzeitfunktionen müssen Sie sogar garantieren können, dass die Frist unter allen möglichen Bedingungen bis zu einem vollständigen Stromausfall eingehalten wird.

Typische Ursachen für Unvorhersehbarkeit finden sich in

  • Dynamische Speicherzuordnung und Speicherbereinigung
  • (Höhere Priorität) Interrupts
  • Der Scheduler im Betriebssystem
  • Dynamische Erstellung und Zerstörung von Objekten
  • Große Mengen an bedingt ausgeführtem Code

Ich sage nicht, dass Sie diese Bereiche meiden müssen (wie Sie es höchstwahrscheinlich nicht können), aber Sie müssen sich bewusst sein, wie sie sich auf die Leichtigkeit auswirken können, mit der Sie vorhersagen können, dass Sie die Echtzeitfristen für die relevanten Funktionen einhalten werden.

Ich nehme an, die Erklärung von Echtzeit in zwei Sätzen lautet, dass ein Echtzeitsystem so ausgelegt ist, dass verstehen und steuern die Worst-Case Antwortzeit von sich ändernden Eingängen zu sich ändernden Ausgängen.

Dies erfordert eine Analyse, die das gesamte System abdeckt. Angenommen, Sie haben ein triviales System, das aus einer USB-Tastatur und einem Bremsservo besteht. Welche Reaktionsfähigkeit können Sie mit diesem System erreichen? Möglicherweise müssen Sie Folgendes berücksichtigen:

  • geben Sie die Abfragefrequenz ein und wie lange dies dauert
  • eingangsinterrupt-Latenz
  • betriebssystemumschaltzeit, sobald Sie ein Eingabeereignis haben
  • betriebssystem Priorisierung von Aufgaben
  • vermeiden der Verwendung von dynamischer Zuordnung oder virtuellem Speicher im Programm, um unvorhersehbare Antwortverzögerungen oder OOM-Ereignisse zu vermeiden
  • vermeidung der Verwendung der Speicherbereinigung
  • vermeiden Sie die Verwendung von O(n) oder schlechteren Algorithmen mit hohem oder unvorhersehbarem N (verlangsamt das Laden einer sehr großen Wiedergabeliste in das Unterhaltungssystem Ihres Autos die Bremsreaktion?)
  • berücksichtigen Sie die Festplatten- oder Netzwerklatenz (z. B. Verwendung des CAN-Busses in Autos).
  • latenz der Ausgangssteuerung

In solchen Umgebungen wird in der Regel auch besonders auf Zuverlässigkeit geachtet, beispielsweise bei den MISRA C-Standards.

8
pjc50