Zurück zur Startseite

MCU Firmware Debugging: Diagnosemethoden

Der Artikel beschreibt Diagnosemethoden für Mikrocontroller-Firmware: von grundlegenden HeartBeat LED- und MCO-Indikatoren bis CLI mit Logging und GPIO-Tracing. Details zu Tools ohne Verletzung von Echtzeit-Timings, mit Code-Beispielen für STM32. Empfehlungen für Senior-Entwickler.

Firmware-Diagnose: CLI, GDB, GPIO für MCU
Advertisement 728x90

Fehlerbehebung bei Mikrocontroller-Firmware: Bewährte Diagnosemethoden

Die Diagnose von Firmware auf Mikrocontrollern beginnt mit grundlegenden Überprüfungen der Systemparameter. Ohne diese wird die Entwicklung zur reinen Mutprobe. Wir stellen bewährte Techniken vor – von einfachen LEDs bis zu fortschrittlichen Schnittstellen – mit Fokus auf Praxisbeispiele für STM32 und ähnliche Plattformen.

Erster Schritt: Taktsignal an MCO-Pins ausgeben. So können Sie die tatsächliche HSE- oder SYSCLK-Frequenz nach der Teilung mit einem Oszilloskop messen.

HAL_RCC_MCOConfig(RCC_MCO1, RCC_MCO1SOURCE_HSE, RCC_MCODIV_4);
HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_5);

{.pad.port=PORT_C, .pad.pin=9, .name="MCO_2",   .stm_mode=GPIO_MODE_AF_PP,      .gpio_pull=GPIO__PULL_AIR, .speed=GPIO_SPEED_FREQ_VERY_HIGH,  .alternate= GPIO_AF0_MCO,},
{.pad.port=PORT_A, .pad.pin=8, .name="MCO_1",   .stm_mode=GPIO_MODE_AF_PP,      .gpio_pull=GPIO__PULL_AIR, .speed=GPIO_SPEED_FREQ_VERY_HIGH,  .alternate= GPIO_AF0_MCO,},

Vergleichen Sie die Messwerte mit Ihrem Code, um Taktkonfigurationsfehler aufzuspüren.

Google AdInline article slot

Statusanzeigen und grundlegende Checks

Eine Herzschlag-LED ist in jeder Firmware unverzichtbar. Eine mit 1 Hz blinkende LED bestätigt, dass der Code läuft, überprüft die Timing und zeigt: Das System lebt. Fügen Sie eine separate rote LED für Software- oder Hardwarefehler hinzu.

  • Vorteile: Visueller Funktionscheck – keine zusätzliche Ausrüstung nötig.
  • Umsetzung: Timer mit 500-ms-Periode zum Umschalten des Pins.
  • Erweiterungen: Mehrere LEDs für Teilsysteme (Takt, Peripherie).

Keine blinkende LED? Weiteres Debuggen ist sinnlos – die Firmware ist nicht gestartet oder hängt.

Assert-Funktionen sorgen für robuste Checks. Sie triggern bei Null-Argumenten:

Google AdInline article slot
  • makeAssert: Buildzeit-Checks aus dem Makefile.
  • preprocAssert: Präprozessor-Validierungen.
  • staticAssert: Kompilierzeit-Konfigurationsprüfung.
  • DynamicAssert: Laufzeit mit GDB-Breakpoint-Unterstützung.

Strategisch platzierte Asserts lokalisieren Fehler in allen Projektphasen.

Fortgeschrittene Fehlerbehebung über Schnittstellen

CLI über UART ist das flexibelste Tool. Eine Voll-Duplex-Textoberfläche auf Rx/Tx/GND ermöglicht:

  • Lesen/Schreiben von Speicher per Adresse.
  • Funktionsaufrufe per Pointer.
  • Überwachen von Zählern, Senden von I2C/SPI/UART-Paketen.
  • Interpretieren von Timer-Registern.

Minimale CLI-Features:

Google AdInline article slot
  • Eingabe-Echo.
  • Befehlshistorie im nichtflüchtigen Speicher.
  • Hilfe und TAB-Vervollständigung.
  • Authentifizierung.
  • Farbige Ausgabe (rot für Fehler, gelb für Warnungen).
  • Tabellen-Darstellung (GPIO, ADC).

CLI erhält Echtzeit-Timing, im Gegensatz zu JTAG/SWD. RAM-Logging mit UART-Flush nach Init diagnostiziert frühen Boot, inklusive Takts. Log-Stufen: LOG_ERROR, LOG_WARNING, LOG_INFO, LOG_DEBUG mit Modulfreigaben (z. B. ll usb debug).

Signalanalysetools

Für Echtzeit-Prozesse GPIO als Marker nutzen:

  • Pins umschalten, um Init-Schritte zu zählen.
  • GPIO-Mapper: Zahlen in Binärcodes über Pins wandeln.

Oszilloskop (mind. 2 Kanäle, digital) erfasst Flanken. Logikanalysatoren (Saleae, 8–16 Kanäle) glänzen bei Bussen wie MII/I2S/SDIO: USB-3.0-Geschwindigkeiten, PC-basierte Periode/Frequenz/Füllgrad-Analyse.

DAC (10–12 Bit) gibt analoge Werte ans Scope aus. Ideal zum Scheduler-Debug: Spannungsstufen offenbaren Thread-Prioritäten.

Grenzen des Schrittweisedebuggings und Alternativen

GDB über SWD/JTAG stoppt bei Breakpoints (PC/LR aus HardFault). Aber es stört das Timing: Hardware-Timer rasen voran, WDT resetet den MCU. Optimierungen (-O0 -g3) fressen Flash-Platz, oft nicht verfügbar.

Alternative: arm-none-eabi-addr2line, um HardFault-Adressen zu Quellzeilen zuzuordnen:

set ELF_FILE=C:/ncs/v2.1.0/nrf/applications/nrf5340_audio/build/gateway_app/zephyr/zephyr.elf
set ADDR2LINE="C:\Program Files (x86)\GNU Arm Embedded Toolchain\10 2021.10\bin\arm-none-eabi-addr2line.exe"
%ADDR2LINE% -e %ELF_FILE% 0x000054cd
%ADDR2LINE% -e %ELF_FILE% 0x0000857e

OLED-Displays bieten eigenständige Metriken: Tamagotchi-Style-Überwachung ohne UART. Unit-Tests decken Code ohne Debugger ab und ermöglichen sicheres Refactoring.

Wichtige Erkenntnisse

  • Herzschlag-LED und MCO: Essenzielle Funktionschecks – ohne sie tappen Sie im Dunkeln.
  • CLI mit Log-Stufen: Volle Kontrolle ohne Timing-Störungen.
  • GPIO/DAC + Scope/Analysator: Echtzeit-Signaleinsichten.
  • Asserts und addr2line: HardFaults präzise lokalisieren ohne volles Debug.
  • GDB/SWD: Letztes Mittel wegen Timing-Verzerrungen.

— Editorial Team

Advertisement 728x90

Weiterlesen