Table of Contents

Die Überwachung der CPU-Auslastung in eingebetteten Geräten ist ein grundlegender Aspekt der Entwicklung eingebetteter Systeme, der sich direkt auf die Systemleistung, Zuverlässigkeit und Langlebigkeit auswirkt. Das Verständnis der Prozessorlast in einem eingebetteten System ist wichtig, wird jedoch oft übersehen und dient als Schritt zur Analyse der Fähigkeit Ihres Prozessors, Systemtermine einzuhalten. Ob Sie IoT-Geräte, Fahrzeugsteuerungssysteme, industrielle Automatisierungsgeräte oder medizinische Geräte entwickeln, eine genaue CPU-Auslastung hilft, Leistungsengpässe zu identifizieren, den Ressourcenverbrauch zu optimieren und sicherzustellen, dass Ihr System die Echtzeitanforderungen erfüllt. Dieser umfassende Leitfaden untersucht die Methoden, Techniken und Best Practices für die Berechnung und Überwachung der CPU-Auslastung in eingebetteten Umgebungen.

Verständnis der CPU-Last und -Nutzung in eingebetteten Systemen

Bevor wir uns mit Messtechniken befassen, ist es wichtig zu verstehen, was CPU-Last im Kontext eingebetteter Systeme bedeutet und warum sie sich von universellen Computerumgebungen unterscheidet.

Definieren von CPU-Last und -Nutzung

Embedded Echtzeit-Experten definieren Kernauslastung als die aggregierte Zeit, während der der Kern Anwendungscode ausführt (aktive Zeit), geteilt durch die Gesamtbeobachtungszeit. CPU-Last ist die Zeit, die die CPU in der Verarbeitung von aktivem Code verbringt, bis zu der Zeit, die die CPU im Idle-Zustand ohne aktive Verarbeitung verbringt, was einfach die Zeit bedeutet, die die CPU in der Verarbeitung von Aufgaben verbringt, bis zu der Zeit, die die CPU verbringt, während sie ruht und nichts tut.

Die CPU-Auslastung ist einfach das Verhältnis der Zeit, die ein Prozessor über einen bestimmten Zeitraum mit realer Arbeit verbringt. Diese Metrik liefert entscheidende Erkenntnisse darüber, wie effizient Ihr eingebettetes System seine Verarbeitungsressourcen nutzt und ob es genügend Spielraum für zusätzliche Funktionen oder unerwartete Lastspitzen gibt.

CPU Load vs. CPU Utilization: Terminologie-Klarstellung

Ingenieure aus der UNIX-Welt kennen den Begriff CPU-Auslastung, der sich auf ein anderes Konzept bezieht: Wie hoch ist die durchschnittliche Anzahl der laufenden plus Warteaufgaben zu einem bestimmten Zeitpunkt, was in Szenarien nützlich ist, in denen ein System überlastet ist. Embedded-Software-Ingenieure verwenden die Begriffe CPU-Auslastung und CPU-Auslastung jedoch austauschbar, um CPU-Auslastung zu bedeuten. In diesem Artikel werden wir diese Begriffe austauschbar verwenden, während wir uns auf den Kontext der eingebetteten Systeme konzentrieren.

Warum CPU Load Monitoring wichtig ist

Eine genaue CPU-Lastmessung dient mehreren kritischen Zwecken in der Entwicklung eingebetteter Systeme:

  • Zeitplanerbarkeitsanalyse: Die Bedeutung der CPU-Auslastung ergibt sich aus der Tatsache, dass sie als Faktor für die Bestimmung der Zeitplanerbarkeit unseres Designs verwendet wird. Dies hilft sicherzustellen, dass alle Aufgaben ihre Termine unter verschiedenen Betriebsbedingungen einhalten können.
  • Sicherheitsmargen: In sicherheitskritischen Systemen gibt es einen Spielraum für die CPU-Auslastung für gelieferte Produkte, zum Beispiel in Automotive soll die vorgeschlagene CPU-Auslastung 65 bis 70% betragen.
  • Stromverbrauch: CPU-Last hat auch einen unmittelbaren Einfluss auf den Stromverbrauch, und das kann ein No-Go für Systeme sein, bei denen dieser Punkt kritisch ist.
  • Systemoptimierung: Die CPU-Auslastung zeigt in Kombination mit einer Zeitanalyse an, ob die Aufgaben und ISRs im erforderlichen Zeitrahmen ausgeführt werden und wie viel Rechenleistung sie für ihren erfolgreichen Abschluss benötigen.
  • Hardware-Auswahl: Systemingenieure zahlen möglicherweise für mehr Chips, als sie benötigen, oder sie sind gefährlich nahe daran, ihren aktuellen Prozessor zu überfordern, so dass es wichtig ist, das Rätselraten aus der Messung der Prozessorauslastung zu nehmen.

Grundlegende Methoden zur Berechnung der CPU-Last

Es gibt mehrere Techniken zur Bestimmung der CPU-Auslastung in eingebetteten Umgebungen, von denen jede ihre eigenen Vorteile, Einschränkungen und geeigneten Anwendungsfälle hat.

Idle Task Monitoring Methode

Die Leerlauf-Task-Monitoring-Methode ist einer der häufigsten und einfachsten Ansätze zur Messung der CPU-Auslastung in eingebetteten Systemen mit einem RTOS.

Wie Idle Task Monitoring funktioniert

Die Leerlaufzeit ist die Zeit, die die CPU nicht beschäftigt ist, und wenn das Betriebssystem (OS) eine Leerlaufaufgabe hat, ist die Leerlaufzeit einfach die Zeit, die die Leerlaufaufgabe ausführt. Unter idealen nicht geladenen Situationen würde die Leerlaufaufgabe eine bekannte und konstante Anzahl von Malen während eines bestimmten Zeitraums ausführen (z. B. eine Sekunde), und die meisten Systeme bieten einen zeitbasierten Interrupt, den Sie verwenden können, um einen freilaufenden Hintergrundschleifenzähler mit dieser bekannten Konstante zu vergleichen.

Die einfachste Art, 0% Auslastung zu definieren, besteht darin, einen Zähler in Ihrer Leerlaufaufgabe zu inkrementieren und zu sehen, wie viele Leerlaufzählungen während eines Messzeitraums auftreten Wenn keine Arbeit ausgeführt wird (außer dem Timer-Interrupt), dann stellt dies die maximale Anzahl von Leerlaufzählungen und 0% Auslastung dar.

Durchführungsbedenken

Wenn man die maximalen Leerlaufzahlen ermittelt, kann man der Leerlaufaufgabe keinen Code hinzufügen, da dies die maximalen Leerlaufzahlen ändern würde. Die Leerlaufaufgabe sollte so minimal wie möglich bleiben, um die Messgenauigkeit zu erhalten. Außerdem ist es besser, die Messzeit mit der kürzesten Deadlinezeit in Ihrem Projekt auszurichten; es hängt von den Zielen der CPU-Auslastungsmessung ab.

Die Berechnung für die CPU-Auslastung mit dieser Methode ist einfach:

CPU-Auslastung (%) = 100 - (Idle Counts / Maximum Idle Counts × 100)

Task Execution Time Messung

Bei diesem Verfahren wird die Ausführungszeit jeder Aufgabe direkt gemessen und die aggregierte CPU-Auslastung basierend auf Aufgabenfrequenzen und Ausführungszeiten berechnet.

Mathematische Formelansatz

Die Gesamtauslastung der CPU entspricht der Summe (Task Frequency × Task's Worst Case Execution Time) und ergibt eine theoretische maximale CPU-Auslastung auf der Grundlage von Worst-Case-Execution-Szenarien, was besonders während der Designphase von Nutzen ist.

Durchführung der Laufzeitmessung

Um die CPU-Last zu messen, müssen Sie sie in einem Zeitfenster messen und dieses Fenster wird normalerweise so gewählt, dass es dem Hauptrahmenzyklusfenster Ihres Schedulers entspricht, dann wird bei allen unterstützten Aufgaben, die am Anfang und Ende der Aufgabe gelesen werden, der aktuelle Timer-Tickwert dann beide Messwerte subtrahieren und in einer globalen Variable speichern. Dieser Ansatz bietet Echtzeit-Sichtbarkeit in den tatsächlichen CPU-Verbrauch und nicht in theoretische Worst-Case-Szenarien.

Die Umsetzung umfasst typischerweise:

  1. Erfassen eines Zeitstempels zu Beginn jeder Aufgabe mit einem hochauflösenden Timer
  2. Erfassen eines weiteren Zeitstempels am Ende der Aufgabe
  3. Berechnung der Differenz zur Bestimmung der Ausführungszeit der Aufgabe
  4. Sammeln dieser Werte über alle Aufgaben
  5. Teilen Sie die Gesamtausführungszeit durch das Messfenster, um den CPU-Auslastungsanteil zu erhalten

Hardware-Gegenmessung

Viele moderne Mikrocontroller und Prozessoren bieten Hardware-Leistungszähler, die verschiedene Metriken wie CPU-Zyklen, Befehlsausführung, Cache-Hits / Misses und mehr verfolgen können. Diese Zähler bieten hochpräzise Messungen mit minimalem Software-Overhead.

Vorteile von Hardware Counters

  • Minimal Overhead: Hardwarezähler arbeiten unabhängig von der Softwareausführung und führen praktisch keinen Mess-Overhead ein.
  • High Precision: Cycle-accurate measurements provide detail insights into CPU behaviour
  • Mehrere Metriken: Über die einfache CPU-Auslastung hinaus können Hardwarezähler die Cache-Leistung, die Branch-Vorhersagen und andere architektonische Ereignisse verfolgen.
  • Nicht-Intrusiv: Messungen beeinflussen nicht das Timing-Verhalten des zu messenden Systems

Umsetzungsansatz

Die Implementierung von Hardwarezählern ist je nach Prozessorarchitektur unterschiedlich.

  • Konfigurieren von Leistungsüberwachungseinheiten (Performance Monitoring Units, PMUs) zur Zählung bestimmter Ereignisse
  • Zählerwerte in Messintervallen auslesen
  • Berechnung der Auslastung auf der Grundlage der Zykluszählungen im Vergleich zur verstrichenen Zeit
  • Verwendung von DWT-Einheiten (Data Watchpoint and Trace) auf ARM Cortex-M-Prozessoren

Hintergrundschleifenzählermethode

Ein freilaufender Zähler wird jedes Mal durch die Hintergrundschleife inkrementiert, und dieser Zähler verwendet eine Variable, die, wenn sie inkrementiert wird, überlaufen darf. Mit einer periodischen Aufgabe (z. B. einer 25-ms-Periode-Task) zur Überwachung der CPU-Auslastung bieten die meisten Systeme einen zeitbasierten Interrupt, mit dem Sie den Hintergrundschleifenzähler mit einer bekannten Konstante vergleichen können.

Diese Methode funktioniert, indem sie eine Grundlinienzählrate festlegt, wenn das System im Leerlauf ist, und dann die tatsächlichen Zählraten während des Betriebs vergleicht, um zu bestimmen, wie viel Zeit in produktiver Arbeit im Vergleich zu Leerlaufschleifen verbracht wird.

Automatisierte Berechnungsmethoden

Die automatisierte Methode berechnet in Echtzeit die durchschnittliche Zeit, die in der Hintergrundschleife verbracht wird. Es gibt zwei Hauptvorteile, wenn die Software die durchschnittliche Zeit berechnet, die die Hintergrundschleife zu Ende führen muss, entladen: Sie können Präemption genau erkennen (anstatt eine Vermutung aus Histogrammdaten zu machen), und die Erkennung von Präemption ermöglicht es Ihnen, durchschnittliche Daten zu verwerfen, die durch die Unterbrechungsverarbeitung verzerrt wurden.

Dieser Ansatz eliminiert die Notwendigkeit einer manuellen Charakterisierung und passt sich automatisch an Codeänderungen an, wodurch er für langfristige Projekte wartungsfreundlicher wird.

RTOS-spezifische CPU-Lastüberwachung

Echtzeit-Betriebssysteme bieten oft integrierte Mechanismen und APIs für die CPU-Lastüberwachung, was die Implementierung projektübergreifend einfacher und standardisierter macht.

FreeRTOS CPU-Lastüberwachung

FreeRTOS, eine der beliebtesten eingebetteten RTOS-Plattformen, bietet mehrere Mechanismen zur Verfolgung der CPU-Auslastung.

Konfiguration der Laufzeitstatistik

FreeRTOS hat einen Mechanismus, um die Ausführungszeit von Aufgaben durch einen Makro-Stil-Hook im präventiven Task-Scheduler zu profilieren, und der Hook verfolgt, wenn sich der Aufgabenkontext ändert, im Grunde der Zeitpunkt, an dem eine unblockierte Aufgabe mit einer höheren (oder runden Robin) Priorität für den nächsten Abschnitt geplant wird.

Um Laufzeitstatistiken in FreeRTOS zu aktivieren, müssen Sie:

  1. Setzen Sie configGENERATE RUN TIME STATS auf 1 in FreeRTOSConfig.h
  2. Definieren Sie portCONFIGURE TIMER FOR RUN TIME STATS(), um einen hochauflösenden Timer zu konfigurieren
  3. Definieren Sie portGET RUN TIME COUNTER VALUE(), um den aktuellen Timerwert zurückzugeben
  4. Verwenden Sie vTaskGetRunTimeStats() zum Abrufen formatierter Statistiken

Leerlaufhakenfunktion

Die Leerlauf-Hook-Funktion bietet einen weiteren Mechanismus für die Berechnung der CPU-Last. Indem Sie einen Zähler im Leerlauf-Hook inkrementieren und mit einem bekannten Maximum vergleichen, können Sie die Gesamtsystemauslastung bestimmen. Per Definition verbrauchen Sie Aufgabenausführungszyklen, so dass Sie nur die Leerlaufzeit verfolgen müssen.

Zephyr RTOS CPU-Statistik

Zephyr RTOS stellt über seine Kerneldienste eine Thread-Laufzeitstatistik bereit. Das System verfolgt die Ausführungszeit für jeden Thread und stellt APIs zur Abfrage dieser Informationen bereit.

  • Per Thread Ausführungszeit Tracking
  • Leerlaufüberwachung
  • Konfigurierbare Statistiken sammeln mit minimalem Overhead
  • Integration mit System-Workqueue für periodische Berichterstattung

Andere RTOS-Plattformen

Die meisten kommerziellen und Open-Source-RTOS-Plattformen bieten ähnliche Funktionen:

  • ThreadX: Bietet Ausführungsprofil-Kit für detaillierte Performance-Analysen
  • VxWorks: Bietet umfassende Profiling-Tools und System Viewer-Funktionen
  • RTEMS: Enthält CPU-Auslastungsstatistiken und Profiling-Unterstützung
  • Mikro μC/OS: Funktionen integrierte Aufgabenstatistik und CPU-Nutzung Tracking

Externe Messtechniken

Neben softwarebasierten Messmethoden können externe Tools und Techniken wertvolle Einblicke in die CPU-Auslastung liefern, ohne die Embedded Software zu modifizieren.

GPIO-Toggle-Methode

Die GPIO-Toggle-Methode beinhaltet das Setzen eines GPIO-Pins hoch, wenn die CPU aktiv und niedrig im Leerlauf ist, und dann die Messung des Duty-Cycles extern.

Multimeter-Technik

Die Multimeter-Technik, die ein Multimeter als Messinstrument verwendet, ermöglicht es Ihnen, die durchschnittliche Prozessorauslastung zu bestimmen und die aggregierte Prozessorauslastung für die gesamte Anwendung zu bestimmen, anstatt einzelne Aufgaben.

Durchführungsschritte:

  1. Konfigurieren Sie einen GPIO-Pin als Ausgang
  2. Setzen Sie den Pin hoch in den Leerlauf Task Eintrag
  3. Setzen Sie den Pin niedrig in den Leerlauf Task-Ausgang
  4. Verbinden Sie ein Multimeter im Gleichspannungsmodus mit dem Pin
  5. Der Spannungswert (in Prozent der VCC) stellt die CPU-Auslastung dar

Wenn die Anwendung jedoch schwankt, wird sie als platzend angesehen (dh die Prozessorauslastung variiert stark von einem Zeitintervall zum nächsten), und die Multimeter-Technik durchschnittlich platzende Anwendungen, die zu groben Ungenauigkeiten führen können.

Oszilloskop/Logikanalysator

Die Oszilloskop-Logik-Analysetechnik arbeitet, indem sie den Arbeitszyklus grafisch verfolgt, um die Gesamtprozessorauslastung mit Hilfe eines Logikanalysators oder Oszilloskops zu bestimmen, wobei diese Methode eine detailliertere Sichtbarkeit der Auslastungsmuster im Laufe der Zeit ermöglicht, wodurch sie sich für die Analyse von platzartigen Arbeitslasten und die Identifizierung periodischer Muster eignet.

Vorteile gegenüber der Multimeter-Technik:

  • Visuelle Darstellung von Nutzungsmustern
  • Fähigkeit, vorübergehende Spikes und Täler zu erfassen
  • Zeitkorrelierte Analyse mit anderen Systemsignalen
  • Triggerfähigkeiten zur Erfassung spezifischer Ereignisse

Debug Probe und Trace Tools

Moderne Debug-Sonden und Trace-Tools bieten ausgeklügelte CPU-Lastanalysefunktionen, ohne dass eine Code-Instrumentierung erforderlich ist.

SEGGER SystemView

SEGGER SystemView ermöglicht die Echtzeit-Aufzeichnung und Visualisierung von RTOS-Ereignissen, einschließlich CPU-Auslastung. Es nutzt die Trace-Fähigkeiten des Prozessors (wie die Embedded Trace Macrocell von ARM), um Ausführungsdaten mit minimalem Eindringen zu erfassen.

  • Echtzeit-CPU-Lastvisualisierung
  • Analyse der Ausführungszeit pro Aufgabe
  • Kontext Switch Tracking
  • Unterbrechungsanalyse
  • Timeline-Ansicht des Systemverhaltens

Percepio-Tracealysator

Tracealyzer bietet umfassendes RTOS-Tracing und -Analysen, einschließlich detaillierter CPU-Auslastungsmetriken. Es unterstützt mehrere RTOS-Plattformen und bietet Einblicke in:

  • Trends der CPU-Auslastung im Laufe der Zeit
  • Ausführungsmuster für Aufgaben
  • Analyse der Ansprechzeit
  • Statistiken über die Ressourcennutzung

Lauterbach TRACE32

TRACE32-Debugger bieten hardwaregestützte Profiling- und Performance-Analysen. Mit On-Chip-Trace-Funktionen können sie die CPU-Auslastung ohne Software-Overhead messen, wodurch sie sich ideal für Timing-kritische Systeme eignen, bei denen das Eindringen in die Messung minimiert werden muss.

Fortschrittliche CPU-Lastanalysetechniken

Über die grundlegende Auslastungsmessung hinaus bieten fortschrittliche Techniken tiefere Einblicke in das Systemverhalten und die Leistungsmerkmale.

Unterbrechungslastmessung

Wenn das Programm läuft, treten auch Unterbrechungen auf, die vom Prozessor behandelt werden müssen, und sie können jederzeit auftreten, während eine einfache Aufgabe ausgeführt wird oder zwischen den Aufgaben liegt, so dass die Verfolgung der in den Unterbrechungshandlern verbrachten Zeit notwendig ist.

Zu den Umsetzungsansätzen gehören:

  • Setzen eines Flags oder Umschalten eines GPIO-Pins beim Interrupt-Ein- / Ausstieg
  • Verwendung von verschachtelten Interrupt-Zählern zur Handhabung der Interrupt-Preemption
  • Tracking per Interrupt Ausführungszeit für detaillierte Analysen
  • Berechnung der Gesamtunterbrechungslast getrennt von der Tasklast

Multi-Core CPU-Lastüberwachung

Die CPU-Last wird pro Kern (CPU0, CPU1) berechnet und der übergeordnete Bereich zeigt den Durchschnittswert aller Kerne an. Die Auslastung für die gesamte CPU ist dann der Durchschnitt aller einzelnen Kernauslastungen. Mehrkernsysteme erfordern eine Nachverfolgungsauslastung für jeden Kern unabhängig voneinander und bieten auch aggregierte Systemebenenmetriken an.

Überlegungen für ein Multi-Core-Monitoring:

  • Per-Core-Idle-Task-Tracking
  • Gemeinkosten für die Kommunikation zwischen den Kernnetzen
  • Wirksamkeit des Lastausgleichs
  • Auswirkungen der Kernaffinität auf die Auslastung
  • Asymmetrische Multiprozessoren (AMP) vs. symmetrische Multiprozessoren (SMP)

Histogrammanalyse

Wenn man sich das Beispielhistogramm anschaut, könnte man schätzen, dass alle Daten über einem bestimmten Schwellenwert Fälle darstellen, in denen die Hintergrundaufgabe unterbrochen wurde, und mit diesem Schwellenwert würden Sie alle darüber liegenden Daten verwerfen, um eine durchschnittliche Leerlaufphase zu berechnen.

Vorteile der Histogrammanalyse:

  • Identifikation von Ausführungszeitmustern
  • Erkennung von Ausreißern und Anomalien
  • Schätzung der Worst-Case-Ausführungszeit (WCET)
  • Jitter-Analyse für Echtzeit-Systeme

Eine Langzeitüberwachung der CPU-Auslastung mit statistischer Analyse liefert Einblicke in das Systemverhalten über längere Zeiträume:

  • Gleitende Durchschnitte: Glätten Sie kurzfristige Schwankungen aus, um Trends zu identifizieren
  • Peak Detection: Identifizieren Sie maximale Auslastungsereignisse und deren Häufigkeit
  • Perzentilanalyse: Nutzverteilung verstehen (z.B. 95. Perzentilauslastung)
  • Korrelationsanalyse: Relation der CPU-Last zu externen Ereignissen oder Systemzuständen

Best Practices für eine genaue CPU-Lastmessung

Die effektive Implementierung der CPU-Lastüberwachung erfordert die Aufmerksamkeit auf mehrere Schlüsselfaktoren, die sich auf die Messgenauigkeit und -nützlichkeit auswirken.

Auswahl geeigneter Probenahmeintervalle

Die Messzeit kann beliebig sein, aber im Idealfall ist es besser, die Messzeit mit der kürzesten Deadlinezeit in Ihrem Projekt abzugleichen; es hängt von den Zielen der CPU-Auslastungsmessung ab.

  • Zu kurz: Kann übermäßige Mess-Overheads einführen und Lärm statt sinnvoller Trends einfangen
  • Zu lang: Kann vorübergehende Spitzen verfehlen und dynamisches Verhalten nicht erfassen
  • System-Aligned: Die Anpassung der Messperioden an Systemzyklen (Hauptrahmen, Hyperperiode) liefert aussagekräftigere Ergebnisse
  • Anwendungsspezifisch: Kritische Echtzeit-Fristen sollten die Auswahl des Messfensters leiten.

Minimierung des Messaufwands

Die Messung der CPU-Auslastung verbraucht CPU-Ressourcen, was sich möglicherweise auf die gemessene Metrik auswirkt.

  • Hardware-unterstützte Messung: Nutzen Sie Hardwarezähler und Trace-Fähigkeiten, wenn verfügbar
  • Effiziente Instrumentierung: Verwenden Sie leichte Zeitstempel-Erfassungsmechanismen
  • Konditionelle Zusammenstellung: Messcode nur während der Entwicklungs- und Testphasen aktivieren
  • Optimierte Algorithmen: Verwenden Sie effiziente Datenstrukturen und Berechnungen für Laufzeitstatistiken
  • Aufgeschobene Verarbeitung: Sammeln Sie Rohdaten schnell, führen Sie Analysen während der Leerlaufzeit oder offline durch

Man könnte argumentieren, dass die Berechnung von Leerlaufzählungen Arbeit ist und dass eine Auslastung von 0% mit dem vorhandenen Instrumentierungscode nicht erreichbar ist, aber solche Bedenken sind vernachlässigbar, wenn die CPU-Auslastungsmesszeit ausreichend groß ist.

Handhabung von Unterbrechungen

Im Wesentlichen können zwei Klassen von Interrupts die Hintergrundschleife stören: ereignisbasierte Trigger und zeitbasierte Trigger, die normalerweise von Geräten, Modulen und Signalen außerhalb des Mikroprozessors ausgelöst werden, und wenn Sie die durchschnittliche Hintergrundzeit messen, sollten Sie alle möglichen Schritte unternehmen, um die Wahrscheinlichkeit zu beseitigen, dass diese Elemente einen Interrupt verursachen können, der die der Hintergrundaufgabe zugeschriebene Zeit künstlich verlängern würde.

Best Practices für die Unterbrechungsbehandlung bei der CPU-Lastmessung:

  • Zeit für die Ausführung von Unterbrechungen getrennt von der Ausführung von Aufgaben
  • Konto für Interrupt Nesting und Preemption
  • Unterbrechungslatenz in Echtzeitanalysen berücksichtigen
  • Unterscheiden zwischen Interrupt Processing und Interrupt-Triggered Task Execution

Kalibrierung und Baseline-Einrichtung

Eine genaue CPU-Lastmessung erfordert eine korrekte Kalibrierung:

  1. Idle Baseline einrichten: Messen Sie das System in einem bekannten Leerlaufzustand, um 0% Auslastungsreferenz zu bestimmen
  2. Verifizieren Sie die volle Last: Erstellen Sie einen bekannten 100% Lastzustand, um die Messgenauigkeit zu validieren
  3. Konto für den Messcode: Verstehen und dokumentieren Sie den Overhead, der durch Messinstrumente eingeführt wird.
  4. Reguläre Rekalibrierung: Rekalibrieren nach signifikanten Codeänderungen oder Änderungen der Compileroptimierungsstufe

Cross-Verifizierung mit mehreren Methoden

Die Verwendung mehrerer Messtechniken bietet Vertrauen in die Ergebnisse und hilft bei der Identifizierung von Messartefakten:

  • Vergleichen Sie softwarebasierte Messungen mit Hardware-Trace-Daten
  • Überprüfen Sie RTOS-Statistiken mit manuellen Instrumenten
  • Überprüfung der Leerlaufaufgabenüberwachung mit der Summe der Ausführungszeit
  • Verwenden Sie externe GPIO-Toggle-Messungen, um interne Berechnungen zu validieren

Dokumentation und Berichterstattung

Eine umfassende Dokumentation stellt sicher, dass CPU-Lastmessungen während des gesamten Produktlebenszyklus nützlich bleiben:

  • Messmethode: Dokumentiere die spezifische verwendete Technik und ihre Konfiguration
  • Testbedingungen: Systemzustand, Eingabebedingungen und Umweltfaktoren aufzeichnen
  • Basiswerte: Halten Sie Aufzeichnungen über Kalibrierdaten und Referenzmessungen bereit
  • Trendanalyse: verfolgen CPU-Lastentwicklung über Softwareversionen hinweg
  • Threshold Definitions: Dokument akzeptable Auslastungsbereiche und Sicherheitsmargen

Praktische Umsetzungsbeispiele

Das Verständnis theoretischer Konzepte ist wichtig, aber praktische Umsetzungsbeispiele helfen, die Lücke zwischen Theorie und Praxis zu schließen.

Einfache Idle Counter Implementierung

Eine grundlegende Idle-Counter-Implementierung für Bare-Metal- oder einfache RTOS-Systeme:

  1. Definieren Sie globale Variablen für Leerlaufzählung und Nutzungsberechnung
  2. Implementieren Sie einen periodischen Timer-Interrupt (z. B. 1 Sekunde Intervall)
  3. In der Leerlaufschleife einen Leerlaufzähler kontinuierlich inkrementieren
  4. In der Timer-Interrupt, erfassen die aktuelle Leerlaufzähler, berechnen Auslastung und setzen Sie den Zähler
  5. Speichern oder Übertragen des Nutzungswerts zur Überwachung

Wichtige Überlegungen:

  • Verwenden Sie volatile Variablen, um Compiler-Optimierung zu verhindern
  • Überlauf des Zählers entsprechend handhaben
  • Minimieren der Verarbeitung im Timer-Interrupt
  • Betrachten Sie atomare Operationen für Mehrkernsysteme

Task Execution Time Tracking

Für Systeme, die Daten über die aufgabenbezogene Nutzung benötigen:

  1. Konfigurieren Sie einen hochauflösenden Timer (Mikrosekunden oder bessere Auflösung)
  2. Erstellen einer Datenstruktur zum Speichern der Ausführungszeit pro Aufgabe
  3. Bei der Aufgabeneingabe den aktuellen Zeitstempel erfassen
  4. Beim Aufgabenausgang wird die verstrichene Zeit berechnet und die Aufgabe insgesamt akkumuliert
  5. Periodische Berechnung der prozentualen Auslastung für jede Aufgabe

Dieser Ansatz liefert detaillierte Einblicke in die Aufgaben, die die meisten CPU-Ressourcen verbrauchen, und ermöglicht so gezielte Optimierungsbemühungen.

FreeRTOS Runtime Statistics Beispiel

Die Implementierung der CPU-Lastüberwachung in FreeRTOS beinhaltet:

  1. Konfigurieren eines Timers mit höherer Auflösung als der System-Tick
  2. Aktivieren von Laufzeitstatistiken in FreeRTOSConfig.h
  3. Implementierung der erforderlichen Zeitgeberkonfigurations-Makro
  4. Erstellen einer Überwachungsaufgabe, die regelmäßig vTaskGetRunTimeStats() aufruft
  5. Parsing und Anzeige oder Protokollierung der Statistiken

Die Laufzeitstatistiken bieten sowohl absolute Ausführungszeit als auch prozentuale Auslastung für jede Aufgabe, wodurch es einfach ist, CPU-intensive Operationen zu identifizieren.

GPIO Toggle für externe Messungen

Implementierung der GPIO-Toggle-Methode:

  1. Konfigurieren Sie einen GPIO-Pin als Ausgang
  2. Setzen Sie den Pin hoch zu Beginn der Leerlaufaufgabe
  3. Setzen Sie den Pin niedrig, wenn Sie die Leerlaufaufgabe verlassen
  4. Verbinden Sie ein Oszilloskop oder Multimeter, um den Duty-Cycle zu messen
  5. Berechnen Sie die CPU-Auslastung als (100 - Duty Cycle Prozentsatz)

Dieses Verfahren ermöglicht eine unabhängige Überprüfung von softwarebasierten Messungen und kann besonders während der Systemintegrations- und Testphasen nützlich sein.

Häufige Fallstricke und wie man sie vermeidet

Die CPU-Lastmessung kann täuschend komplex sein, und mehrere häufige Fehler können zu ungenauen oder irreführenden Ergebnissen führen.

Compiler-Optimierungsprobleme

Compiler-Optimierungen können den Messcode beeinträchtigen:

  • Counter Optimization: Compiler können weglaufende Leerlaufzähler optimieren, wenn sie nicht als volatil deklariert sind.
  • Code-Neuordnung: Timestamp-Erfassungscode kann neu geordnet werden, was sich auf die Genauigkeit auswirkt
  • Inlining Effects: Function Inlining kann das Ausführungs-Timing ändern
  • Loop Unrolling: Kann das Verhalten des Leerlauf-Loop-Zählers beeinflussen

Zu den Lösungen gehören die Verwendung flüchtiger Qualifikatoren, Compiler-Barrieren und die Überprüfung des generierten Assemblycodes.

Timer Auflösung und Overflow

Eine unzureichende Timerauflösung oder unsachgemäßes Überlaufhandling führt zu Messfehlern:

  • Timer mit ausreichender Auflösung für das Messintervall verwenden
  • ordnungsgemäße Überlauferkennung und -behandlung
  • Verwenden Sie 64-Bit-Zähler oder Überlauferweiterungstechniken
  • Validierung der Zeitgebergenauigkeit gegen bekannte Referenz

Intrusionseffekte messen

Der Messcode selbst beeinflusst das Systemverhalten:

  • Cache-Effekte aus der Ausführung von Messcodes
  • Unterbrechung der Latenz aufgrund von Instrumenten
  • Speicherbandbreitenverbrauch für die Statistikspeicherung
  • Prioritäre Inversion bei Messaufgaben

Minimieren Sie das Eindringen, indem Sie nach Möglichkeit hardwaregestützte Methoden verwenden und den Messcode so leicht wie möglich halten.

Falsche Baseline-Annahmen

Die Annahme falscher Basiswerte führt zu systematischen Fehlern:

  • Nichterfassung der Hintergrund-OS-Aktivität im "Idle"-Zustand
  • Ohne Berücksichtigung von Power-Management-Zustandsübergängen
  • Ignorieren von periodischen Wartungsaufgaben
  • DMA und periphere Aktivitäten überblicken

Legen Sie immer Basislinien durch tatsächliche Messungen statt theoretische Annahmen fest.

Unzureichende Testabdeckung

Die Messung der CPU-Auslastung unter begrenzten Bedingungen liefert ein unvollständiges Bild:

  • Test unter verschiedenen Eingabebedingungen und Datenmustern
  • Beziehen Sie Worst-Case-Szenarien und Stressbedingungen ein
  • Berücksichtigen Sie Umweltfaktoren (Temperatur, Spannung)
  • Bewerten Sie langfristiges Verhalten, nicht nur kurzfristige Snapshots

Optimierung der CPU-Last in eingebetteten Systemen

Sobald Sie die CPU-Auslastung genau gemessen haben, ist der nächste Schritt die Optimierung, wenn die Auslastung akzeptable Schwellenwerte überschreitet.

Softwareoptimierungsstrategien

Die wichtigste Lösung ist die Steigerung der Effizienz der Softwarelösung, was auch die Energieauswirkungen des Systems reduziert, und die Erhöhung oder Verschwendung von Hardwareressourcen sollte als letzter Ausweg beibehalten werden.

Software-Optimierungsansätze umfassen:

  • Algorithmusoptimierung: Ersetzen Sie ineffiziente Algorithmen durch effizientere Alternativen
  • Code-Profiling: Identifizieren und optimieren Sie Hot Spots, die unverhältnismäßige CPU-Zeit verbrauchen
  • Compiler Optimierung: Verwenden Sie geeignete Optimierungsflags und profilgeführte Optimierung
  • Datenstrukturauswahl: Wählen Sie Datenstrukturen, die für Zugriffsmuster optimiert sind
  • Cache-Optimierung: Verbessern Sie die Datenlokalität und reduzieren Sie Cache-Abstürze
  • Interrupt Optimization: Minimiere die Ausführungszeit für die Unterbrechungsdienstroutine

Architekturansätze

Die Verarbeitung der Aufgaben in mehrere Zyklen zu unterteilen, so dass die Ausführungszeit der Aufgaben während jedes Zyklus abnimmt und die CPU-Auslastung abnimmt.

  • Aufgaben-Dekomposition: Zerlege große Aufgaben in kleinere, überschaubarere Einheiten
  • Prioritätsanpassung: Optimieren Sie die Aufgabenprioritäten, um das Kontextwechseln zu reduzieren
  • Umsetzen zur Unterbrechung der Konvertierung: Ersetzen Sie Polling-Loops durch interruptgesteuerte Ansätze
  • DMA-Nutzung: Datenbewegung auf DMA-Controller auslagern
  • Hardware-Beschleunigung: Verwenden Sie dedizierte Hardware-Peripheriegeräte für rechenintensive Operationen

Hardwarelösungen

Wenn Softwareoptimierung an ihre Grenzen stößt, können Hardwarelösungen notwendig sein:

  • Erhöhen Sie die CPU-Taktfrequenz, damit die CPU Aufgaben schneller ausführen kann und somit mehr Zeitkapazität für die Ausführung anderer Aufgaben hat und so die Last verringert.
  • Verwenden eines Multi-Core-Prozessors, bei dem Aufgaben zwischen Kernen aufgeteilt werden können.
  • Hinzufügen von Co-Prozessoren oder Beschleunigern für bestimmte Funktionen
  • Upgrade auf eine leistungsfähigere Prozessorfamilie
  • Implementierung FPGA-basierter Beschleunigung für kritische Algorithmen

Power Management Überlegungen

CPU-Lastoptimierung schneidet sich oft mit Power Management:

  • Dynamische Spannungs- und Frequenzskalierung (DVFS): Taktgeschwindigkeit basierend auf Last anpassen
  • Sleep Modes: Betreten Sie während Leerlaufphasen Zustände mit geringem Stromverbrauch
  • Uhr Gating: Deaktivieren Sie Uhren in unbenutzte Peripheriegeräte
  • Workload Konsolidierung: Batch-Verarbeitung zur Maximierung der Schlafzeit

Industriestandards und Sicherheitsanforderungen

Viele Branchen haben spezifische Anforderungen und Standards bezüglich CPU-Auslastung in eingebetteten Systemen, insbesondere für sicherheitskritische Anwendungen.

Automobilnormen

Kritische Anwendungen werden stark durch Industriestandards wie Automotive ISO 26262 reguliert, die die maximale CPU-Auslastung vorschreiben, um plötzliche Verarbeitungsspitzen zu bewältigen.

Die Anforderungen nach ISO 26262 umfassen:

  • Dokumentierte CPU-Lastanalyse und Margen
  • Worst-Case-Execution-Time (WCET)-Analyse
  • Sicherheitsmargen für unerwartete Lasterhöhungen
  • Überwachungsmechanismen für die Überprüfung der Laufzeitlast

Luft- und Raumfahrtnormen

DO-178C und verwandte Normen für Luft- und Raumfahrtanwendungen erfordern:

  • Strenge Zeitanalyse und Überprüfung
  • Nachweis der Marge für Worst-Case-Szenarien
  • Rückverfolgbarkeit der CPU-Lastanforderungen
  • Unabhängige Überprüfung des Timingverhaltens

Medizinprodukte-Standards

IEC 62304 für Medizinprodukte-Software erfordert:

  • Risikoanalyse einschließlich Zeitfehlern
  • Überprüfung der Echtzeit-Leistung
  • Dokumentation der Ressourcenauslastung
  • Prüfung unter Stressbedingungen

Industrielle Automatisierung

IEC 61508 für Funktionale Sicherheit in industriellen Systemen spezifiziert:

  • Anforderungen an die Sicherheitsintegrität (SIL)
  • Zeitplanungsanalyse für Sicherheitsfunktionen
  • Ressourcenüberwachung und Fehlererkennung
  • Bewährte Nutzungsüberlegungen für CPU-Lastmargen

Tools und Ressourcen für die CPU-Load-Analyse

Eine Vielzahl von kommerziellen und Open-Source-Tools unterstützt die CPU-Lastmessung und -analyse in eingebetteten Systemen.

Kommerzielle Werkzeuge

  • SEGGER SystemView: Echtzeit-RTOS-Analyse und -Visualisierung (https://www.segger.com/products/development-tools/systemview/)
  • Percepio Tracealyzer: Umfassende RTOS-Tracing und Performance-Analyse
  • Lauterbach TRACE32: Hardware-unterstütztes Debuggen und Profiling
  • ARM Development Studio: Profiling und Optimierungstools für ARM-basierte Systeme
  • Green Hills MULTI: Integrierte Entwicklungsumgebung mit Performance-Analyse

Open-Source-Tools

  • FreeRTOS Runtime Statistics: Built-in task execution time tracking
  • Zephyr Tracing: Kernel Tracing und Performance Monitoring
  • LTTng: Linux Trace Toolkit für eingebettete Linux-Systeme
  • Perfetto: Systemprofiling und Trace-Analyse
  • Valgrind/Callgrind: Performance-Profiling für Linux-basierte Embedded-Systeme

Hardware-Tools

  • Logische Analysatoren: Erfassen Sie GPIO-Toggle-Muster für externe Messungen
  • Oszilloskope: Messen Sie die Duty Cycles und Timing-Beziehungen
  • JTAG/SWD Debuggers: Zugriff auf On-Chip-Debugging und Trace-Fähigkeiten
  • Power Analyzer: korrelieren CPU-Last mit Stromverbrauch

Online-Ressourcen und Communities

  • Embedded.com: Artikel und Tutorials zur Leistung eingebetteter Systeme (https://www.embedded.com)
  • FreeRTOS Foren: Community support for RTOS-related questions
  • Stack Overflow: Embedded Systems tag für technische Fragen
  • Reddit r/embedded: Community-Diskussionen zur eingebetteten Entwicklung
  • Embedded Systems Weekly: Newsletter zu eingebetteten Themen

Da sich eingebettete Systeme weiterentwickeln, schreiten auch die Techniken und Anforderungen zur CPU-Lastüberwachung voran.

Integration von Machine Learning

Machine Learning Algorithmen werden zur CPU-Lastanalyse eingesetzt:

  • Vorhersage der vorausschauenden Belastung auf der Grundlage historischer Muster
  • Anomalieerkennung zur Identifizierung von ungewöhnlichem Verhalten
  • Automatisierte Optimierungsempfehlungen
  • Adaptive Ressourcenzuweisung basierend auf erlernten Mustern

Cloud-verbundenes Monitoring

IoT-fähige Embedded Devices unterstützen zunehmend Cloud-basiertes Monitoring:

  • Fernüberwachung und -diagnose
  • Flottenweite CPU-Lastanalyse und Vergleich
  • Updates zur Over-the-Air-Optimierung
  • Predictive Maintenance basierend auf Auslastungstrends

Verbesserte Hardware-Unterstützung

Moderne Prozessoren integrieren eine ausgefeiltere Leistungsüberwachung:

  • Umfassendere Leistungszähler
  • Trace-Fähigkeiten mit geringerer Overhead-Fähigkeit
  • Hardware-gestütztes Profiling mit minimalem Eindringen
  • Integrierte Leistungs- und Leistungsüberwachung

Standardisierungsbemühungen

Industriebemühungen für eine standardisierte Leistungsüberwachung:

  • Gemeinsame APIs auf allen RTOS-Plattformen
  • Standardisierte Trace-Formate für die Interoperabilität von Werkzeugen
  • Branchenweite Best Practices und Richtlinien
  • Open-Source Referenzimplementierungen

Schlussfolgerung

Genaue Berechnung und Überwachung der CPU-Auslastung ist für die Entwicklung zuverlässiger, effizienter eingebetteter Systeme unerlässlich. Dieser Artikel stellt mehrere Möglichkeiten vor, um zu erkennen, wie viel CPU-Durchsatz eine eingebettete Anwendung wirklich verbraucht, und Sie können diese Informationen verwenden, um das Systemsoftwaredesign im Vergleich zu einer maximalen Prozessorlast zu überprüfen. Ob Sie sich für die Überwachung von Leerlaufaufgaben, die Messung der Ausführungszeit, Hardwarezähler oder externe Messtechniken entscheiden, der Schlüssel ist die Auswahl von Methoden, die Ihren spezifischen Anforderungen und Einschränkungen entsprechen.

Erfolg bei der CPU-Lastüberwachung erfordert die Aufmerksamkeit auf Messgenauigkeit, Minimierung des Overheads, eine ordnungsgemäße Kalibrierung und umfassende Tests unter realistischen Bedingungen. Eine hohe CPU-Last bedeutet keine schlechte Sache, wenn Ihr Design alle Termine erfüllt, aber es bedeutet, dass in Zukunft, wenn Sie weitere Prozesse zum System hinzufügen möchten, dies zu Überlastung führen kann. Die Aufrechterhaltung angemessener Sicherheitsmargen stellt sicher, dass Ihr System unerwartete Bedingungen und zukünftige Verbesserungen bewältigen kann.

Da eingebettete Systeme komplexer werden und sicherheitskritische Anwendungen sich vermehren, wird eine robuste CPU-Auslastungsüberwachung immer wichtiger. Durch die Implementierung der in diesem Handbuch beschriebenen Methoden und Best Practices können Sie sicherstellen, dass Ihre eingebetteten Systeme effizient arbeiten, Echtzeitanforderungen erfüllen und während ihrer gesamten Betriebsdauer angemessene Leistungsmargen aufrechterhalten. Die Investition in eine ordnungsgemäße CPU-Auslastungsüberwachung zahlt sich aus in Systemzuverlässigkeit, Optimierungsmöglichkeiten und Vertrauen, dass Ihr eingebettetes System unter allen Bedingungen wie vorgesehen funktioniert.