Es gibt viele Techniken zur Entwicklung hochzuverlässiger eingebetteter Systeme, von gut regulierten Entwicklungszyklen bis hin zu strengen Ausführungs- und Systemprüfungen.
Wir stellen Ihnen 7 Tipps vor, die einfach zu bedienen sind und über einen langen Zeitraum angewendet werden können. Sie sind sehr hilfreich, um sicherzustellen, dass das System zuverlässiger läuft und ungewöhnliche Verhaltensweisen erkannt werden. Tipp 1 - Verwenden Sie bekannte, mit Werten gefüllte ROMs. Softwareentwickler sind in der Regel sehr optimistisch und möchten einfach nur, dass ihr Code lange Zeit zuverlässig läuft, und das war's. Es scheint ziemlich selten vorzukommen, dass ein Mikrocontroller aus dem Anwendungsbereich springt und in einem unbeabsichtigten Codebereich ausgeführt wird. Die Wahrscheinlichkeit, dass dies geschieht, ist jedoch nicht geringer als die eines Pufferüberlaufs oder eines fehlerhaften Zeigers, der seine Referenz verliert. Es passiert! Das Systemverhalten ist danach undefiniert, da der Speicherbereich standardmäßig alle 0xFF ist oder weil der Speicherbereich normalerweise nicht beschrieben wird und der darin enthaltene Wert möglicherweise nur Gott bekannt ist. Allerdings gibt es recht umfassende Linker- oder IDE-Kenntnisse, mit denen man solche Ereignisse identifizieren und das System nach ihnen wiederherstellen kann. Der Trick besteht darin, den FILL-Befehl zu verwenden, um das nicht verwendete ROM mit einem bekannten Bitmuster zu füllen. Um ungenutzten Speicher zu füllen, gibt es viele verschiedene mögliche Kombinationen. Wenn Sie jedoch ein zuverlässigeres System aufbauen möchten, ist die naheliegendste Wahl die Platzierung von ISR-Fehlerhandlern an diesen Stellen. Wenn mit dem System etwas schief geht und der Prozessor beginnt, Code außerhalb des Programmraums auszuführen, wird der ISR ausgelöst und bietet die Möglichkeit, Prozessor-, Register- und Systemstatus zu speichern, bevor über Korrekturmaßnahmen entschieden wird. Tipp 2 – Überprüfen Sie den CRC Ihrer Anwendung ), um anhand dieser Prüfsumme zu überprüfen, ob die Anwendung intakt ist. Interessanterweise wird die Prüfsumme in vielen dieser Fälle erst beim Laden des Programmcodes auf das Gerät verwendet.Wenn jedoch der CRC oder die Prüfsumme im Speicher aufbewahrt wird, ist es äußerst wichtig, beim Start (oder bei Systemen mit langer Laufzeit sogar regelmäßig) zu überprüfen, ob das Unerwartete nicht passiert Weg. Heutzutage ist die Wahrscheinlichkeit, dass sich eine programmierte Anwendung ändert, sehr gering, aber angesichts der Milliarden von Mikrocontrollern, die jedes Jahr ausgeliefert werden, und der möglicherweise rauen Arbeitsumgebung ist die Wahrscheinlichkeit, dass die Anwendung abstürzt, nicht gleich Null. Wahrscheinlicher ist, dass ein Fehler im System zu einem Flash-Schreib- oder Flash-Löschvorgang in einem Sektor führt und dadurch die Integrität der Anwendung beeinträchtigt. Tipp 3 – Führen Sie beim Start einen RAM-Check durch Um ein zuverlässigeres und solideres System aufzubauen, ist es wichtig sicherzustellen, dass die Systemhardware ordnungsgemäß funktioniert . Schließlich kann Hardware ausfallen. (Zum Glück versagt Software nie, sie macht einfach das, was der Code ihr sagt, egal, ob das richtig oder falsch ist.) Um sicherzustellen, dass die Hardware wie erwartet funktioniert, stellen Sie sicher, dass beim Booten keine internen oder externen Probleme mit dem RAM vorliegen. Es gibt viele verschiedene Möglichkeiten, eine RAM-Prüfung durchzuführen, aber eine gängige Methode besteht darin, nach einem bekannten Muster zu schreiben und dann eine kurze Zeit zu warten, bevor man es zurückliest. Das Ergebnis sollte sein, dass das Gelesene auch das Geschriebene ist. Die Wahrheit ist, dass die RAM-Prüfung in den meisten Fällen erfolgreich ist, was wir wollen. Es besteht jedoch eine sehr geringe Wahrscheinlichkeit, dass die Prüfung nicht bestanden wird, was eine hervorragende Gelegenheit für das System darstellt, ein Hardwareproblem zu melden. Tipp 4 – Verwenden Sie einen Stack-Monitor Für viele Embedded-Entwickler scheint der Stack eine eher mysteriöse Kraft zu sein. Als seltsame Dinge passierten, waren die Ingenieure schließlich ratlos und begannen zu denken, dass vielleicht etwas im Stapel los sei. Das Ergebnis ist eine blinde Anpassung der Größe und Position des Stapels usw. Aber der Fehler ist oft stapelunabhängig, aber wie kann man so sicher sein? Denn wie viele Ingenieure haben tatsächlich eine Worst-Case-Stackgrößenanalyse durchgeführt? Die Stapelgröße wird zur Kompilierungszeit statisch zugewiesen, der Stapel wird jedoch dynamisch verwendet. Während der Code ausgeführt wird, werden Variablen, Rücksprungadressen und andere von der Anwendung benötigte Informationen kontinuierlich auf dem Stapel gespeichert. Dieser Mechanismus bewirkt, dass der Stapel innerhalb seines zugewiesenen Speichers kontinuierlich wächst. Dieses Wachstum übersteigt jedoch manchmal die zur Kompilierungszeit festgelegte Kapazitätsgrenze, was dazu führt, dass der Stapel Daten in benachbarten Speicherbereichen beschädigt. Eine Möglichkeit, absolut sicher zu sein, dass Ihr Stack ordnungsgemäß funktioniert, besteht darin, einen Stack-Monitor als Teil des „Gesundheits“-Codes Ihres Systems zu implementieren (wie viele Ingenieure machen das?). Der Stack-Monitor erstellt einen Pufferbereich zwischen dem Stack und dem „anderen“ Speicherbereich, gefüllt mit bekannten Bitmustern. Der Monitor überwacht dann kontinuierlich das Muster auf etwaige Änderungen. Wenn sich dieses Bitmuster ändert, bedeutet das, dass der Stapel zu groß geworden ist und das System in die Hölle stürzen wird! An diesem Punkt kann der Monitor das Auftreten von Ereignissen, den Systemstatus und alle anderen nützlichen Daten aufzeichnen, die später bei der Diagnose von Problemen verwendet werden können. Ein Stapelmonitor ist in den meisten Echtzeitbetriebssystemen (RTOS) oder Mikrocontrollersystemen verfügbar, die eine Speicherschutzeinheit (MPU) implementieren. Das Erschreckende daran ist, dass diese Funktionen standardmäßig deaktiviert sind oder von Entwicklern oft absichtlich deaktiviert werden. Eine schnelle Suche im Internet zeigt, dass viele Leute empfehlen, den Stack-Monitor im Echtzeitbetriebssystem auszuschalten, um 56 Byte Flash-Speicherplatz zu sparen.Warten Sie, das ist den Gewinn nicht wert! Tipp 5 – Verwendung einer MPU hat begonnen, sich zu verändern. Mikrocontroller vom High-End- bis zum Low-End-Bereich verfügen jetzt über MPUs, und diese MPUs bieten Entwicklern eingebetteter Software die Möglichkeit, die Robustheit ihrer Firmware erheblich zu verbessern. MPUs wurden nach und nach mit dem Betriebssystem gekoppelt, um Speicherbereiche zu schaffen, in denen die Verarbeitung getrennt ist oder Aufgaben ihren Code ausführen können, ohne befürchten zu müssen, darauf herumgetrampelt zu werden. Sollte dennoch etwas passieren, wird die unkontrollierte Verarbeitung abgebrochen und andere Schutzmaßnahmen ergriffen. Halten Sie Ausschau nach Mikrocontrollern mit dieser Komponente, und wenn ja, nutzen Sie diese Funktion. Tipp 6: Bauen Sie ein leistungsstarkes Watchdog-System auf ), aber auch dort, wo der Watchdog mit einem periodischen Timer gelöscht werden kann; die Aktivierung des Timers ist völlig unabhängig von allem, was im Programm passiert. Der Zweck der Verwendung von Watchdog besteht darin, sicherzustellen, dass der Watchdog im Fehlerfall nicht gelöscht wird. Das heißt, wenn die Arbeit unterbrochen wird, wird das System gezwungen, einen Hardware-Reset (Hardware-Reset) durchzuführen sich erholen. Durch die Verwendung eines von der Systemaktivität unabhängigen Timers bleibt der Watchdog auch bei einem Systemausfall deaktiviert.Embedded-Entwickler müssen sorgfältig überlegen und entwerfen, wie Anwendungsaufgaben in das Watchdog-System integriert werden. Eine Technik könnte beispielsweise ermöglichen, dass jede Aufgabe, die über einen bestimmten Zeitraum ausgeführt wird, angibt, dass sie ihre Aufgabe erfolgreich abgeschlossen hat. In diesem Fall wird der Watchdog nicht gelöscht und muss zurückgesetzt werden. Es gibt auch fortgeschrittenere Techniken wie die Verwendung eines externen Watchdog-Prozessors, mit dem die Leistung des Hauptprozessors überwacht werden kann und umgekehrt. Für ein zuverlässiges System ist es wichtig, ein leistungsstarkes Watchdog-System einzurichten. Da es zu viele Technologien gibt, ist es schwierig, sie in diesen Absätzen vollständig zu behandeln, aber ich werde in Zukunft verwandte Artikel zu diesem Thema veröffentlichen. Tipp 7 – Vermeiden Sie flüchtige Speicherzuweisungen Ingenieure, die es nicht gewohnt sind, in einer Umgebung mit begrenzten Ressourcen zu arbeiten, könnten versucht sein, die Funktionen ihrer Programmiersprache auszunutzen , eine Sprache, die es ihnen ermöglicht, die flüchtige Speicherzuweisung zu verwenden. Schließlich handelt es sich hierbei um eine Technik, die häufig in Taschenrechnersystemen verwendet wird, bei denen Speicher nur bei Bedarf zugewiesen wird. Wenn Ingenieure beispielsweise in C entwickeln, neigen sie möglicherweise dazu, malloc zu verwenden, um Speicherplatz auf dem Heap zuzuweisen. Eine Operation wird ausgeführt und nach Abschluss kann free verwendet werden, um den zugewiesenen Speicher zurückzugeben, sodass der Heap verwendet werden kann. In einem ressourcenbeschränkten System könnte dies eine Katastrophe sein! Eines der Probleme bei der Verwendung der flüchtigen Speicherzuweisung besteht darin, dass Fehler oder falsche Techniken zu Speicherlecks oder Speicherfragmentierung führen können. Wenn diese Probleme auftreten, verfügen die meisten eingebetteten Systeme nicht über die Ressourcen oder das Wissen, um den Heap zu überwachen oder ordnungsgemäß damit umzugehen. Und wenn ja, was passiert, wenn eine Anwendung eine Speicherplatzanfrage stellt, der angeforderte Speicherplatz jedoch nicht verfügbar ist? Die durch die Verwendung der flüchtigen Speicherzuweisung verursachten Probleme sind sehr kompliziert, und es kann als Albtraum bezeichnet werden, diese Probleme richtig zu lösen! Eine Alternative besteht darin, Speicher einfach direkt und statisch zuzuweisen. Anstatt beispielsweise einen Speicherpuffer dieser Größe über malloc anzufordern, erstellen Sie einfach einen Puffer in Ihrem Programm, der 256 Bytes lang ist.Dieser zugewiesene Speicher bleibt während der gesamten Lebensdauer der Anwendung erhalten, ohne dass Bedenken hinsichtlich Heap- oder Speicherfragmentierungsproblemen bestehen. Dies sind nur einige Möglichkeiten, wie Entwickler mit dem Aufbau zuverlässigerer eingebetteter Systeme beginnen können. Es gibt viele andere Techniken, wie z. B. die Verwendung guter Codierungsstandards, die Erkennung von Bit-Flips, die Durchführung von Array- und Zeigergrenzenprüfungen und die Verwendung von Behauptungen. All diese Technologien sind das Geheimnis, das es Designern ermöglicht, zuverlässigere eingebettete Systeme zu entwickeln
Das obige ist der detaillierte Inhalt vonMehrere praktische Routinen und Techniken für die eingebettete Entwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!