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í.
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:
- 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:
- 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
Zatím žádné komentáře.