Zpět na domů

Ladění firmware MCU: metody diagnostiky

Článek popisuje metody diagnostiky firmware mikrokontrolérů: od základních indikátorů HeartBeat LED a MCO po CLI s logováním a GPIO-trasováním. Podrobně o nástrojích bez porušení real-time časování, s příklady kódu pro STM32. Doporučení pro senior vývojáře.

Diagnostika firmware: CLI, GDB, GPIO pro MCU
Advertisement 728x90

Metody diagnostiky a ladění firmware mikrokontrolérů

Diagnostika firmware na mikrokontrolérech začíná základními kontrolami systémových parametrů. Bez nich se vývoj snižuje k slepému programování. Projdeme osvědčené metody od jednoduchých indikátorů po pokročilé rozhraní, s důrazem na reálné scénáře pro STM32 a podobné platformy.

První krok — výstup systémové frekvence na MCO piny. To umožňuje osciloskopem změřit reálnou frekvenci HSE nebo SYSCLK po dělení.

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,},

Porovnání měření s kódem odhalí chyby v nastavení taktování.

Google AdInline article slot

Indikátory stavu a základní kontrola

HeartBeat LED je povinnou součástí každého firmware. Blikající LED s frekvencí 1 Hz potvrzuje start a provádění kódu, kontroluje taktování. Samostatná červená LED signalizuje chyby v softwaru nebo hardwaru.

  • Výhody: vizuální smoke test, nevyžaduje vybavení.
  • Realizace: timer s periodou 500 ms pro přepínání pinu.
  • Rozšíření: několik LED pro různé podsystémy (taktování, periferie).

Bez blikající LED je další diagnostika zbytečná — firmware nespustil nebo zamrzl.

Funkce assert posilují kontrolu. Spouštějí se při nulovém argumentu:

Google AdInline article slot
  • makeAssert: v fázi kompilace z Makefile.
  • preprocAssert: předkompilační kontroly.
  • staticAssert: kompilace, validace konfigurací.
  • DynamicAssert: za běhu, s breakpointem pro GDB.

Rozmístění assertů podle fází projektu lokalizuje selhání.

Pokročilé ladění přes rozhraní

CLI (Command Line Interface) nad UART je nejuniverzálnější nástroj. Plně duplexní textové rozhraní na Rx/Tx/GND umožňuje:

  • Čtení/zápis paměti podle adres.
  • Volání funkcí podle ukazatele.
  • Monitorování čítačů, odesílání paketů v I2C/SPI/UART.
  • Interpretace registrů timerů.

Minimální sada funkcí CLI:

Google AdInline article slot
  • Echo vstupu.
  • Historie příkazů v nevolatilní paměti.
  • Nápověda a TAB-autodoplnění.
  • Autorizace.
  • Barevný výstup (červená pro chyby, žlutá pro varování).
  • Tabulkový render (GPIO, ADC).

CLI nenarušuje real-time načasování, na rozdíl od JTAG/SWD. Logování do RAM s flush do UART po inicializaci umožňuje diagnostikovat rané fáze včetně taktování. Podpora úrovní: LOG_ERROR, LOG_WARNING, LOG_INFO, LOG_DEBUG s filtrem podle modulů (ll usb debug).

Nástroje analýzy signálů

Pro real-time procesy použijte GPIO jako značky:

  • Přepínání pinů pro počítání kroků v system_init.
  • GPIO mapper: přirozené číslo do binárního kódu na sadě pinů.

Osciloskop (min. 2 kanály, digitální) zachytí přechody. Logický analyzátor (Saleae, 8–16 kanálů) je lepší pro sběrnice MII/I2S/SDIO: USB 3.0, výpočet období/frekvencí/plnitelností na PC.

DAC (10–12 bitů) výstupuje analogové hodnoty pro osciloskop. Užitečné pro ladění plánovačů: stupně napětí ukazují priority vláken.

Omezení krok za krokem ladění a alternativy

GDB přes SWD/JTAG zastavuje provádění na breakpointu (PC/LR z HardFault). Ale narušuje načasování: hardwarové timery běží rychleji, WDT resetuje MCU. Optimalizace (-O0 -g3) vyžadují místo ve Flash, často nedostupné.

Alternativa — arm-none-eabi-addr2line pro převod adres HardFault na řádky kódu:

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

Displej (OLED) pro autonomní výstup metrik: tamagoči-like monitoring bez UART. Modulární testy pokrývají kód bez debuggeru, zajišťují refactoring.

Co je důležité

  • HeartBeat LED a MCO — startovní smoke test, bez nich diagnostika nejde.
  • CLI s úrovněmi logování dává totální kontrolu bez narušení načasování.
  • GPIO/DAC + osciloskop/analyzátor pro real-time signály.
  • Assert a addr2line lokalizují HardFault bez plného ladění.
  • GDB/SWD — krajní řešení kvůli zkreslení načasování.

— Editorial Team

Advertisement 728x90

Číst dál