Bei der Entwicklung eingebetteter Systeme und MCU-Software verwenden Ingenieure häufig Debugger, um Programme zu debuggen. Auf diese Weise können wir Fehler in Mikrocontroller-Programmen lokalisieren und reduzieren, sodass sie wie erwartet funktionieren. Manchmal kann das Debuggen von Mikrocontroller-Programmen eine Herausforderung sein, da selbst geringfügige Änderungen in einem Systemmodul zu Fehlern in einem anderen Subsystem führen können. Darüber hinaus unterscheiden sich die in der Mikrocontroller-Entwicklung verwendeten Debugging-Tools erheblich in Bezug auf Entwicklungszeit und Debugging-Fähigkeiten. Dieser Artikel stellt in erster Linie gängige Arten von Debuggern für Mikrocontroller und deren Verwendung vor.
Was ist ein Hardware-Debugger?
Ein Hardware-Debugger ist ein Werkzeug, das über eine Debugging-Schnittstelle mit einem Mikrocontroller kommuniziert und es ermöglicht, den Status des Prozesses auszuführen, anzuhalten, zu beobachten und sogar zu ändern. Mit anderen Worten: Ein Debugger ist ein Gerät, das von einem PC gesendete Befehle (z. B. über das USB-Protokoll) in eine Sprache übersetzt, die von der MCU verstanden wird (z. B. SWD- oder JTAG-Protokoll), Code lädt und die Ausführung präzise steuert.
Arten von Debuggern
Die Entwicklung eingebetteter Software stützt sich in hohem Maße auf Debugger und Programmierer, die dabei helfen, Programmfehler zu entdecken und zu beheben, die MCU-Programmierung durchzuführen und vieles mehr. Die meisten Halbleiter- oder Chiphersteller entwickeln Debugger für ihre eigenen MCUs, um ihr Produkt-Ökosystem zu verbessern. Daher gibt es auf dem Markt verschiedene Klassifizierungen, darunter J-Link-Debugger, U-Link-Emulatoren, ST-LINK-Debugger und Programmierer.
J-Link
J-Link ist ein JTAG-basierter Debugger, der von der deutschen Firma SEGGER eingeführt wurde. Einfach ausgedrückt handelt es sich um eine JTAG-Protokollkonvertierungsbox, eine kleine USB-zu-JTAG-Konvertierungsbox, die über eine USB-Schnittstelle mit einem Computer und über das JTAG-Protokoll mit den internen Komponenten der Zielplatine verbunden wird. Sie übernimmt die Übersetzung von Software zu Hardware.

I-Jet-Spur
I-jet Trace, veröffentlicht von IAR Systems, ist ein leistungsstarkes Tool zur Code-Fehlersuche und -Verfolgung, das mit einem großen Befehlscache ausgestattet ist und das Hochgeschwindigkeits-Kommunikationsprotokoll USB 3.0 unterstützt. I-jet Trace unterstützt alle Kerne der ARM Cortex-M-Serie, die mit dem Embedded Trace Macrocell (ETM)-Modul ausgestattet sind, einschließlich des neuesten Cortex-M7-Kerns. Durch die Verfolgung jedes ausgeführten Befehls ermöglicht ETM Entwicklern eine genaue Beobachtung des Laufzeitverhaltens der MCU und deckt so schwerwiegende Fehler auf, die mit herkömmlichen Debugging-Methoden nur schwer zu entdecken sind.

U-LINK
ULINK ist ein Debugger/Emulator, der von ARM/KEIL eingeführt wurde. Derzeit sind aktualisierte Versionen wie die Emulatoren ULINK2 und ULINK Pro erhältlich. ULINK/ULINK2 kann mit Keil-Software verwendet werden, um Emulationsfunktionen zu aktivieren, und ist in erster Linie mit Keil-Software kompatibel. Sie bieten Unterstützung für Serial Wire Debug (SWD), Return Clock Support, Echtzeit-Trace und andere Funktionen. Entwicklungsingenieure können bequem On-Chip-Debugging (mit On-Chip-JTAG, SWD und OCDS) und Flash-Programmierung durchführen, wenn sie den Debugger von RealView MDK in Kombination mit ULINK2 verwenden.

CMSIS-DAP
CMSIS-DAP lässt sich in zwei Teile unterteilen: CMSIS und DAP. CMSIS steht für ARM Cortex-M Software Interface Standard, während DAP für Debug Access Port steht. CMSIS-DAP ist eine Firmware-Implementierung einer USB-Debugger-Geräteenheit. Die auf dem Host-Computer ausgeführte Debugging-Software kommuniziert über eine USB-Schnittstelle mit dem Debugger-Gerät und ermöglicht so letztlich das Debugging der auf der Ziel-MCU ausgeführten Anwendungssoftware. Der CMSIS-DAP-Debugger wird über JTAG oder SWD mit dem Zielgerät verbunden. ARM Cortex-Prozessoren bieten Core Sight Debug- und Trace-Einheiten. CMSIS-DAP-Debugger können Prozessoren mit einem oder mehreren ARM-Kernen unterstützen.

DAPLink
DAPLink ist ein von ARM offiziell entwickelter Open-Source-Emulator, der das Herunterladen und Debuggen von Programmen für eine vollständige Palette von Cortex-M0/M3/M4/M7-Core-Chips ermöglicht.

ICD Debugger
ICD (In-Circuit Debugger), oft einfach als „ICD-Debugger” bezeichnet, ist ein Hardware-Debugging-Tool, das bei der Entwicklung eingebetteter Systeme zum Einsatz kommt. Es ermöglicht Entwicklern das Echtzeit-Debugging von Mikrocontrollern oder anderen eingebetteten Geräten, während diese innerhalb der Zielschaltung (in-circuit) betrieben werden.

ICD-Debugger verbinden sich in der Regel über die Debugging-Schnittstelle des Zielgeräts, beispielsweise JTAG (Joint Test Action Group) oder SWD (Serial Wire Debug). Diese Debugger bieten eine Reihe wichtiger Debugging-Funktionen, darunter das Setzen von Haltepunkten, das schrittweise Durchlaufen des Codes, die Überprüfung von Variablenwerten und die Überwachung des Ausführungsflusses eines Programms.
Einer der Hauptvorteile von ICD-Debuggern ist ihre Fähigkeit, Software in ihrem tatsächlichen Hardwarekontext zu debuggen, sodass Entwickler Probleme identifizieren und beheben können, die möglicherweise nur auftreten, wenn das Zielgerät in seiner vorgesehenen Umgebung ausgeführt wird.
ST-Link ist ein spezieller Online-Debugger und Programmierer für STM8- und STM32-Mikrocontroller, der oft als Downloader bezeichnet wird. ST-Link verfügt über Kommunikationsschnittstellen wie SWIM, JTAG und SWD für die Kommunikation mit STM8- oder STM32-Mikrocontrollern (verschiedene Versionen verfügbar).

MCU-Verbindung
MCU-Link, gemeinsam entwickelt von NXP und Embedded Artist, ist ein leistungsstarker und kostengünstiger Debugger, der sich nahtlos in die MCUXpresso IDE integrieren lässt. Er ist auch kompatibel mit IDEs von Drittanbietern, die das CMSIS-DAP-Protokoll unterstützen, wie beispielsweise die häufig verwendeten MDK Keil und IAR Embedded Workbench.

MCU-Link basiert auf dem Mikrocontroller LPC55S69 und verfügt über eine Hochgeschwindigkeits-USB-Schnittstelle für leistungsstarkes Debugging. Der LPC55S69 ist ein Dual-Core-Cortex-M33-Mikrocontroller mit einer Taktrate von bis zu 150 MHz. Er verfügt über eine USB-zu-Seriell-Funktion (VCOM), mit der Entwickler während des Debuggens Daten von der MCU-Seite an den PC ausgeben können.
OpenSDA
OpenSDA ist eine integrierte Hardware-Debugging-Schaltung, die Debugging, USB-zu-Seriell-Konvertierung und Drag-and-Drop-Firmware-Funktionen kombiniert. Sie ist auf fast allen offiziellen Entwicklungsboards von NXP und Freescale vorhanden. OpenSDA wird von Anwendern wegen seiner Einfachheit, geringen Kosten, leistungsstarken Funktionalität und breiten Verfügbarkeit geschätzt.

Nu-Link
Nu-Link ist ein von Nuvoton entwickeltes Debugging- und Programmierwerkzeug, das Debugging- und Online-/Offline-Programmierfunktionen bietet. Das Werkzeug verfügt über einen USB-Anschluss für die Verbindung mit dem Host-Computer, LED-Statusanzeigen, eine Offline-Programmier-Taste und eine SWD-Schnittstelle für die Verbindung mit dem Zielchip zum Debuggen und Programmieren (der SWD-Anschluss arbeitet mit einer Standardspannung von 5 V).

Wie funktionieren Debugger?
Das Prinzip der Mikrocontroller-Fehlersuche basiert auf der Kommunikation zwischen dem Debugging-Tool und dem Mikrocontroller, wodurch die Fehlersuche im Mikrocontroller-Programm erleichtert wird. Breakpoints sind gängige Debugging-Techniken, um Fehler im Code zu lokalisieren.
Einstellung der Haltepunktbedingungen

In der obigen Abbildung sehen Sie eine Liste mit insgesamt vier Haltepunkten. Jedem Haltepunkt können Bedingungen zugewiesen werden, wie im roten Kasten 1 dargestellt.
Sie können festlegen, wie oft ein Haltepunkt wirksam ist, d. h. wie oft er bei Erreichen dieser Position ausgelöst wird, wie im roten Kasten 2 zu sehen ist. In diesem Beispiel ist er so eingestellt, dass er einmal ausgelöst wird.
Sie können einen Auswertungsausdruck festlegen, wie im roten Kasten 3 der Abbildung gezeigt. Der Haltepunkt wird beispielsweise ausgelöst, wenn „g_iCounter“ größer oder gleich 100 ist. Bedingungen wie diese werden mit der Bedingung im roten Kasten 2 unter Verwendung einer logischen „UND“-Beziehung kombiniert. Beide Bedingungen müssen erfüllt sein, damit der Haltepunkt ausgelöst wird; andernfalls wird der Code weiter ausgeführt.
Wenn der Haltepunkt ausgelöst wird, können Sie ein Python-Skript ausführen, wie im roten Kasten 4 der Abbildung gezeigt.
Sie können auch ein Meldungsfeld anzeigen und/oder einen Summer ertönen lassen, um Warnungen auszugeben, wenn der Haltepunkt ausgelöst wird.
Einrichten von Breakpoint-Triggern

Breakpoint-Trigger ähneln vordefinierten Triggern, die den Code anhalten, wenn bestimmte Bedingungen während der Ausführung erfüllt sind. Der Auslösepunkt ist möglicherweise nicht im Voraus bekannt.
In der Abbildung stellt das rote Feld 1 einen Befehlstrigger dar, der den Code an einer bestimmten Zeile anhält, ähnlich wie beim Setzen eines Breakpoints direkt im Code.
Das rote Feld 2 stellt einen Datentrigger dar, der den Code stoppt, wenn eine Lese-/Schreiboperation für eine bestimmte Variable oder Adresse erfolgt, und der überwachen kann, ob ein bestimmtes Bit gesetzt oder gelöscht ist (die Verfügbarkeit hängt vom Mikrocontroller ab). Der Code wird an der entsprechenden Position angehalten.
Das rote Feld 3 ist ein Beispiel, bei dem „g_iCounter” ausgewählt ist. Wenn sein höchstes Bit auf 1 gesetzt ist, löst es den Haltepunkt aus. Andernfalls wird der Code weiter ausgeführt.
Das rote Feld 4 veranschaulicht eine komplexe Auslösebedingung mit mehreren Bedingungen, die ebenfalls von den Fähigkeiten des Mikrocontrollers abhängt.
Fazit
Zusammenfassend lässt sich sagen, dass Hardware-Debugger und ihre verschiedenen Typen eine entscheidende Rolle bei der Entwicklung eingebetteter Systeme spielen, da sie es Entwicklern ermöglichen, Softwarefehler zu lokalisieren und zu beheben, Echtzeit-Debugging durchzuführen und Einblicke in die Ausführung von Mikrocontroller-Programmen zu gewinnen. Diese Tools bieten wichtige Funktionen wie Breakpoints, Triggerbedingungen und die Möglichkeit, Skripte auszuführen, wodurch der Debugging-Prozess effizienter und effektiver wird.




