Debugging Professionelle Spurensuche

Mit CoreSight steht Lizenznehmern eines ARM-Cores eine Vielzahl von technischen Mitteln für Debugging und Test zur Verfügung, darunter die Embedded Trace Macrocell (ETM). Wer die CoreSight-ETM in komplexen SoCs allerdings optimal ausnutzen will, ist auf leistungsfähige externe Trace Port Analyzer wie das UAD3+ von pls angewiesen.

Dass ARM neben ihren lizenzierbaren Prozessorkernen auch eine ganze Reihe weiterer IPs wie Memory Controller, Komponenten für Grafik, Video und Audio etc. im Programm führt, die sich von den Lizenznehmern je nach Bedarf mit eigener Peripherie zu vollständigen Mikrocontrollern und SoCs komplettieren lassen, dürfte inzwischen hinreichend bekannt sein.

Weniger bekannt ist, dass ARM für seine Mikroprozessoren unter dem Namen CoreSight auch viele unterschiedliche, skalierbare Technologien für Debugging und Test anbietet. Das Interessante an diesem IP-Baukasten: Da kein zwingender Zusammenhang zwischen Core und Debug-Features besteht, hat jeder Halbleiterhersteller die freie Wahl, welche Funktionen er implementiert und welche nicht.

Die unter CoreSight angebotenen Technologien decken einen großen Bereich von Testfunktionen ab. Diese reichen vom einfachen Target-Zugang über JTAG mit Run-Control über Trace mit geringer Bandbreite bis hin zum High-End-Trace mit hohen Frequenzen und großen Datenmengen.

Dem heutigen Stand der Technik entsprechende On-Chip-Debug-Funktionen sind über einen JTAG-Debug-Port mit fünf Signalleitungen oder die neuere Serial-Wire-Debug-Schnittstelle mit zwei Signalleitungen verfügbar.

Trace-Funktionen mit geringer Bandbreite stehen darüber hinaus mit dem Serial Wire Viewer zur Verfügung, der bisher allerdings nur in Mikrocontrollern mit Cortex-M-Kern implementiert wurde. Dieser gibt Trace-Informationen über einen einzelnen Pin aus. Als Informationsquellen dienen dabei zum einen die Instrumentation Trace Macrocell (ITM), zum anderen die Data Watchpoint und Trace Unit (DWT). Letztere enthält Statistik-Zähler für abgearbeitete Zyklen, Schlaf-Zyklen, die Interrupt-Belastung, die durchschnittliche Anzahl der Zyklen pro Instruktion sowie die Anzahl bestimmter Befehlstypen. Die Zähler erzeugen pro Überlauf eine Trace-Nachricht. Diese Informationen können zur Optimierung der Anwendungsperformance eingesetzt werden. Weiterhin enthält die DWT Logikfunktionen, mit deren Hilfe sich Änderungen von Programm-Variablen erkennen lassen, eine Trace-Nachricht generieren oder der Befehlszähler zyklisch ausgeben lässt. Die Applikations-Software kann auch Trace-Ereignisse durch Beschreiben von ITM-Registern erzeugen (printf-Style-Debugging). Eine vollständige Rekonstruktion des Programmflusses ist mit den geschilderten Eigenschaften aber nicht möglich.

Vollständige Rekonstruktion des Programmablaufs

Genau diese Rekonstruktion hilft allerdings bei komplexen SoCs, die Software effektiv zu testen, zu optimieren und Fehler mit vertretbarem Zeitaufwand zu finden.

Für diesen Zweck steht innerhalb des CoreSight-Baukastens die Embedded Trace Macrocell (ETM) zur Verfügung. Diese Einheit ist seit dem ARM7 in bislang 18 unterschiedlichsten Varianten verfügbar. Hauptzweck der ETM ist die Erzeugung eines Datenstroms mit Informationen über die Operationen des Prozessors. Das umfasst im Minimum die Befehlsabarbeitung (Code-Trace) und wahlweise Informationen über Speicherzugriffe (Daten-Trace). Letztere Eigenschaft ist bei den jeweiligen ETM-Versionen in unterschiedlicher Ausprägung vorhanden. Der von der ETM erzeugte Datenstrom muss aufgezeichnet und durch ein Debug-Werkzeug analysiert werden. Die Aufzeichnung erfolgt entweder mittels externen Speichers oder durch einen On-Chip-Speicher, den so genannten Embedded Trace Buffer (ETB).

Ein typischer ETB ist mit 4 bis 16 Kbyte Speicherkapazität allerdings nicht sehr groß und deshalb nur für sehr kurze bzw. eng begrenzte Messaufgaben geeignet. Zum Vergleich: Externe Trace-Hardware wie beispielsweise das Universal Access Device 3+ von pls Programmierbare Logik & Systeme ist mit bis zu 4 Gbyte Speicher erhältlich.

Zur Reduzierung der aufzuzeichnenden Datenmenge kommen unterschiedliche Verfahren zum Einsatz. Zum einen wird nur dann eine Adressinformation zur Befehlsabarbeitung ausgegeben, wenn diese wie bei bedingten Programmverzeigungen (Sprüngen) und Interrupts nicht aus der Analyse des Maschinen-Codes rekonstruierbar ist. Wenn möglich, werden zudem nur Offset-Werte zur Vorgängeradresse ausgegeben. Der Daten-Trace, der eine größere Anzahl an Informationen generiert, kann dabei abgeschaltet oder detailliert für die Ausgabe von Adressen, die Ausgabe von gelesenen bzw. geschriebenen Daten oder beides konfiguriert werden.

Einige ETMs unterstützen darüber hinaus auch noch weitere Kompressions-Techniken, die direkt auf den Datenstrom wirken, wie die Entfernung führender Nullen oder andere Packtechniken. Doch wie auch immer: In allen genannten Beispielen muss dem Debugger für die Auswertung des Trace-Datenstroms der ausgeführte Programm-Code, sprich der Programmspeicherinhalt, zur Verfügung stehen.

Neben der Erzeugung von Code- und Daten-Trace-Informationen bietet die ETM auch noch Logikfunktionen für die Steuerung des Trace-Stroms. Das heißt, die Erzeugung von Trace-Informationen kann von bestimmten Zuständen innerhalb des Prozessors abhängig gemacht werden. Dazu sind unter anderem Adress-Komparatoren, Daten-Komparatoren, Sequenzer und eine Start/Stopp-Logik implementiert. Diese Filter- und Triggerlogik wird vom Debug-Werkzeug entsprechend konfiguriert und gestattet dann beispielsweise die Aufzeichnung bestimmter Code-Adress-Bereiche, Speicherzugriffe oder Start und Stopp der Aufzeichnung in Abhängigkeit von einer bestimmten Ereignissequenz. So kann die Erzeugung von Trace-Informationen oder sogar das ganze System gestoppt werden, wenn durch die Applikation eine Fehlerbehandlungsroutine aufgerufen wird.