Leistungsverbrauch senken Power-Debugging: Versteckte Verbraucher finden

Die Senkung des Leistungsverbrauchs im Rahmen der Entwicklung war bislang ein Ziel, das nur Hardwareentwickler beeinflussen konnten. Jedoch hängt in einem Embedded System die Verlustleistung nicht nur vom Design der Hardware ab, sondern ebenso davon, wie diese eingesetzt wird. Und diesen Einsatz steuert die Systemsoftware. Power-Debugging ist eine Methode, mit deren Hilfe Softwareentwickler Informationen darüber erhalten, wie sich die Softwareimplementierung in einem Embedded System auf den Leistungsverbrauch auf Systemebene auswirkt.

Das »Power-Debugging« basiert auf der Möglichkeit, den Leistungsverbrauch abzutasten und jedes Sample zunächst der Befehlsfolge und folglich dem Quellcode des Programms zuzuordnen. Eine Schwierigkeit liegt darin, beim Sampling eine hohe Genauigkeit zu erzielen.

Im Idealfall müsste der Leistungsverbrauch mit derselben Frequenz abgetastet werden, die auch der Systemtakt verwendet, doch vermindern Speicherkondensatoren im Stromversorgungssystem die Zuverlässigkeit derartiger Messungen.

Vom Gesichtspunkt des Softwareentwicklers aus ist es interessanter, den Leistungsverbrauch auf den Quellcode und verschiedene Ereignisse in der Programmausführung zu beziehen, als auf einzelne Befehle. Deshalb liegt die benötigte Auflösung wesentlich niedriger als bei einem Sample pro Befehl.

Zum Beispiel veranschaulicht der Debugger »C-SPY« von IAR die Leistungsverbrauchsdaten sowohl statisch als auch dynamisch in verschiedenen Ansichten (Bild 1), und er stellt dabei sowohl das Profil als auch die Debugging-Möglichkeiten des Energiebedarfs einer Anwendung dar. Leistung misst der Debug-Tastkopf.

Zum Beispiel setzt die »Embedded Workbench« von IAR den Tastkopf »J-Link Ultra« ein.

Dieser misst den Spannungsabfall über einem kleinen Widerstand, der mit der Energieversorgung des Geräts in Reihe geschaltet ist (Bild 2). Dieser Spannungsabfall wird durch einen Differenzverstärker gemessen und dann durch einen A/D-Wandler abgetastet.

Beziehungen im Blick

Der Schlüssel zu einem genauen Power-Debugging liegt in einer guten Korrelation zwischen Befehlsverfolgung (Instruction Trace) und den Power-Samples. Die beste Zuordnung ist zu erreichen, wenn ein vollständiger Instruction-Trace zur Verfügung steht. Der Nachteil dabei ist, dass dieser nicht in allen Geräten vorhanden ist, und wenn doch, benötigt er oft einen speziellen Debug-Tastkopf.

Weniger genau, aber dennoch mit einer guten Zuordnung, ist der Einsatz einer Abtasteinrichtung für den Programmzähler, wie sie in einigen modernen On-Chip-Debug-Architekturen vorhanden ist. Sie tastet den Programmzähler periodisch ab, und jedes Sample erhält einen Zeitstempel. Der Debug-Tastkopf erfasst den Leistungsverbrauch des Geräts mithilfe eines A/D-Wandlers.

Durch den Zeitstempel sowohl auf den abgetasteten Leistungswerten als auch auf den Programmzähler-Samples kann der Debugger die Leistungsdaten auf der gleichen Zeitachse grafisch darstellen, beispielsweise als Interrupt-Protokolle oder variable Ausdrücke, und Leistungsverbrauchsdaten dem Quellcode zuordnen (Bild 3). Generell ist die Optimierung der Leistung der Geschwindigkeitsoptimierung sehr ähnlich.

Je schneller ein Task abgearbeitet wird, desto mehr Zeit kann das System in einem Energiesparmodus verbringen. Man senkt also den Stromverbrauch, wenn man die Leerlaufzeit möglichst hoch treibt. Die Identifizierung, wie ein System unnötig Energie verbraucht und wo sich die Leistungsanforderungen eines Systems optimieren lassen, kann einige Schwierigkeiten bereiten. Im Allgemeinen werden indessen nicht ausgesprochene Mängel im Quellcode aufgedeckt, sondern vielmehr Gelegenheiten und Möglichkeiten aufgezeigt, wie sich der Einsatz der Hardware abgleichen lässt.