Empfehlungen für die Entwicklung produktionsbereiter Anwendungen

Wenn Sie Anwendungen für Ihre Azure Sphere-Geräte entwickeln, müssen Sie verschiedene Dinge berücksichtigen, um sicherzustellen, dass Ihre Anwendungen produktionsbereit sind. Dieses Thema enthält eine Checkliste mit bewährten Methoden, um zu überprüfen, ob Ihre Anwendungen für die Pilot- oder Produktionsbereitstellung bereit sind. Wenn Sie sich vergewissern, dass diese Elemente vollständig sind, kann die Anzahl von Problemen reduziert werden, die in der Produktion auftreten, und es ist einfacher, auftretende Probleme zu diagnostizieren.

Wenn Sie eine Azure Sphere-Anwendung entwickeln, entscheiden Sie, ob sie auf dem High-Level (HL), dem Echtzeitkern (Real-Time, RT) oder einer Hybride aus beidem ausgeführt werden soll. Allgemeine Anwendungen werden unter dem Azure Sphere-Betriebssystem in Containern ausgeführt, und echtzeitfähige Anwendungen (RTApps) werden auf Bare-Metal oder mit einem Echtzeitbetriebssystem (Real-Time Operating System, RTOS) auf den Echtzeitkernen ausgeführt.

Die hier bereitgestellten Empfehlungen sollen Ihnen helfen, die Qualität und Produktivität in Ihren produktionsbereiten Anwendungen zu steigern. Die folgende Checkliste enthält eine kurze Liste von Entwurfsvorschlägen für beide Anwendungstypen sowie empfohlene Programmiergrundlagen und Überlegungen zum Lösungsentwurf, einschließlich Links zu Themen, in denen die einzelnen Punkte ausführlicher erläutert werden. Diese Vorschläge stammen aus unseren Partnerschaften mit Kunden, einschließlich Feldanalysen, Code reviews und Supportinteraktionen von in der Produktion bereitgestellten Anwendungen in realen Lösungen und Geräteentwürfen.

Programmiergrundlagen

  • Häufige Probleme

    • Stellen Sie sicher, dass produktionsbereite Anwendungen keine Beta-Toolsets verwenden.
    • Wenn Sie den API-Satz als Ziel verwenden, verwenden Sie die neuesten CMake- und Azure Sphere-Tools.
    • Um eine vollständige Codeoptimierung und -größe sicherzustellen, sollten Sie die endgültigen Imagepakete im Releasemodus kompilieren, bevor Sie eine Anwendung in der Produktion bereitstellen. Stellen Sie sicher, dass Sie das Releasepaket erstellen und testen, bevor Sie es bereitstellen.
    • Verwenden Sie eine Nullwarnungsrichtlinie, wenn Sie einen vollständigen Build ausführen, um sicherzustellen, dass Compilerwarnungen absichtlich behoben werden.
    • Richten Sie eine konsistente CI/CD-Pipeline ein, und verwenden Sie eine geeignete Verzweigungsstrategie.
  • Speicherbezogene Probleme

    • Wenn möglich, definieren Sie alle gängigen festen Zeichenfolgen als global const char* anstelle von hartcodieren, damit sie als Datenzeiger verwendet werden können.
    • Wenn globale Datenstrukturen relativ klein sind, sollten Sie den Arraymembern feste Längen zuweisen, anstatt Zeiger für dynamisch zugewiesenen Speicher zu verwenden.
    • Vermeiden Sie nach Möglichkeit die dynamische Speicherbelegung.
    • Für Funktionen, die einen Zeiger auf einen Speicherpuffer zurückgeben, sollten Sie die Konvertierung in Funktionen in Betracht ziehen, die einen Referenzpufferzeiger und seine zugehörige Größe an die Aufrufer zurückgeben.
  • Dynamische Container und Puffer

    • Erwägen Sie die Verwendung eines inkrementellen Zuordnungsansatzes für Container wie Listen und Vektoren.

Vorschläge für den Entwurf allgemeiner Kernanwendungen

  • Allgemeine Grundlagen

    • Initialisieren und zerstören Sie alle Handler beim Beenden oder Fehler.
    • Verwenden Sie immer Exitcodes.
    • Wenn eine Anwendung erkennt, dass sie sich in einem nicht wiederherstellbaren Zustand befindet und einen Neustart erfordert, stellen Sie sicher, dass sie immer als "sauber"-Anwendungsausgang behandelt wird, anstatt einen Deadlockzustand zu riskieren.
    • Implementieren sie die Fehlerbehandlung und -protokollierung. Weitere Informationen finden Sie unter Fehlerbehandlung und -protokollierung.
    • Verwenden Sie einen Systemtimer als Watchdog, um zu erkennen, ob sich die Anwendung in einem nicht wiederherstellbaren Zustand befindet oder angehalten ist (z. B. Deadlock, erschöpfter Arbeitsspeicher oder Konnektivität, die nicht wiederhergestellt wird, wenn die implementierte Logik ausgeführt wird) und eine ordnungsgemäße Wiederherstellung bewirken. Weitere Informationen finden Sie unter Verwenden eines Systemtimers als Watchdog.
  • Behandeln von Parallelität

    • Verwenden Sie Nach Möglichkeit EventLoop.
    • Suchen Sie nach Effizienz bei gleichzeitigen Aufgaben.
    • Bewerten Sie, wann Threads verwendet werden sollen, und legen Sie den Bereich nur auf bestimmte Aufgaben fest. Weitere Informationen zur Verwendung von Threads finden Sie unter Behandeln von Parallelität.
  • Konnektivitätsüberwachung

    • Implementieren Sie eine ordnungsgemäße Aufgabe zur Überprüfung der Konnektivitätsintegrität basierend auf einem stabilen Zustandscomputer, der regelmäßig die status der Internetverbindung überprüft.
    • Bei Lösungen, die eine Energieverwaltung erfordern, schalten Sie den Azure Sphere-Chip nach dem Senden von Daten herunter, verfolgen Die Gesamtbetriebszeit nach, und legen Sie einen Timer für das Herunterfahren fest.
    • cURL hat kürzlich das Rückrufverhalten und bewährte Methoden aktualisiert. Während Azure Sphere anstrengungen unternommen hat, um sicherzustellen, dass ältere Versionen von cURL Verhalten weiterhin wie erwartet funktionieren, wird empfohlen, bei der Verwendung von curl_multi die neuesten Anleitungen zur Sicherheit und Zuverlässigkeit zu befolgen, da die Verwendung rekursiver Rückrufe zu unerwarteten Abstürzen, Konnektivitätsausfällen und potenziellen Sicherheitsrisiken führen kann. Wenn ein TimerCallback mit einem Timeout von 0 ms ausgelöst wird, behandeln Sie ihn als Timeout von 1 ms, um rekursive Rückrufe zu vermeiden. Achten Sie darauf, dass Sie curl_multi_socket_action nach Aufrufen von curl_multi_add_handle mindestens einmal explizit aufrufen.
  • Speicherverwaltung und -nutzung

    • Verfolgen Sie die Speicherauslastung der Anwendung mit den Azure Sphere-Betriebssystem-APIs nach, und stellen Sie sicher, dass Anwendungen angemessen auf unerwartete Speichernutzung reagieren.

Vorschläge für den Entwurf von Echtzeitkernanwendungen

  • Aktivieren Sie den MT3620-Watchdog-Timer, um Deadlocks zu erkennen und die richtige Wiederherstellungslogik zu implementieren.
  • Implementieren Sie kernübergreifende Kommunikation für hybride HL-Core- und RT-Core-Anwendungen.

Überlegungen zum Lösungsentwurf

  • Konnektivitätsanforderungen und Problembehandlung

    • Stellen Sie sicher, dass alle Netzwerkvoraussetzungen erfüllt sind. Weitere Informationen finden Sie unter Konnektivitätsanforderungen und Problembehandlung.
    • Behandeln von Konnektivitätsproblemen mithilfe OSNetworkRequirementCheck-HLApp von und OSNetworkRequirementChecker-PC.

Weitere Punkte, die beim Verschieben einer IoT-Lösung in eine Produktionsumgebung berücksichtigt werden sollten, finden Sie unter Verschieben einer IoT-Lösung vom Test in die Produktion.