Powrót do strony głównej

Debugowanie firmware MCU: metody diagnostyki

Artykuł opisuje metody diagnostyki firmware mikrokontrolerów: od podstawowych wskaźników HeartBeat LED i MCO po CLI z logowaniem i śledzeniem GPIO. Szczegółowo o narzędziach bez naruszania timingów real-time, z przykładami kodu dla STM32. Zalecenia dla senior deweloperów.

Diagnostyka firmware: CLI, GDB, GPIO dla MCU
Advertisement 728x90

Metody diagnostyki i debugowania firmware mikrokontrolerów

Diagnostyka firmware na mikrokontrolerach zaczyna się od podstawowych sprawdzeń parametrów systemowych. Bez nich rozwój sprowadza się do programowania na ślepo. Przyjrzymy się sprawdzonym metodom — od prostych wskaźników po zaawansowane interfejsy — z naciskiem na realne scenariusze dla STM32 i podobnych platform.

Pierwszy krok to wyprowadzenie częstotliwości systemowej na piny MCO. Dzięki oscyloskopowi można zmierzyć rzeczywistą częstotliwość HSE lub SYSCLK po podzieleniu.

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

Porównanie pomiarów z kodem ujawnia błędy w konfiguracji taktowania.

Google AdInline article slot

Wskaźniki stanu i podstawowe sprawdzenia

HeartBeat LED to obowiązkowy element każdej firmware. Miga z częstotliwością 1 Hz dioda potwierdza start i wykonywanie kodu, sprawdza taktowanie. Osobna czerwona dioda sygnalizuje błędy w oprogramowaniu lub części sprzętowej.

  • Zalety: wizualny test dymny, nie wymaga sprzętu.
  • Realizacja: timer z okresem 500 ms do przełączania pinu.
  • Rozszerzenie: kilka diod dla różnych podsystemów (taktowanie, peryferia).

Bez migającej diody dalsza diagnostyka jest bez sensu — firmware nie wystartowała lub zawisła.

Funkcje assert wzmacniają kontrolę. Wyzwalają się przy argumencie zerowym:

Google AdInline article slot
  • makeAssert: na etapie kompilacji z Makefile.
  • preprocAssert: sprawdzenia preprocesora.
  • staticAssert: kompilacja, walidacja konfiguracji.
  • DynamicAssert: runtime, z breakpointem dla GDB.

Rozmieszczenie assertów w fazach projektu lokalizuje awarie.

Zaawansowane debugowanie przez interfejsy

CLI (Command Line Interface) nad UART to najbardziej elastyczne narzędzie. Pełnodupleksowy interfejs tekstowy na Rx/Tx/GND pozwala:

  • Czytać/zapisywać pamięć po adresach.
  • Wykonywać funkcje po wskaźniku.
  • Monitorować liczniki, wysyłać pakiety w I2C/SPI/UART.
  • Interpretować rejestry timerów.

Minimalny zestaw funkcji CLI:

Google AdInline article slot
  • Echo wejścia.
  • Historia komend w pamięci nieulotnej.
  • Help i autouzupełnianie TAB.
  • Autoryzacja.
  • Kolorowy output (czerwony dla błędów, żółty dla ostrzeżeń).
  • Renderowanie tabelaryczne (GPIO, ADC).

CLI nie zakłóca timingów real-time, w przeciwieństwie do JDB/SWD. Logowanie do RAM z flush do UART po inicjalizacji pozwala diagnozować wczesne etapy, w tym taktowanie. Obsługa poziomów: LOG_ERROR, LOG_WARNING, LOG_INFO, LOG_DEBUG z filtrem po modułach (ll usb debug).

Narzędzia analizy sygnałów

Do procesów real-time używaj GPIO jako znaczników:

  • Przełączanie pinów do liczenia kroków w system_init.
  • Mapper GPIO: liczba naturalna w kod binarny na wielu pinach.

Oscyloskop (minimum 2 kanały, cyfrowy) rejestruje skoki. Analizator logiczny (Saleae, 8–16 kanałów) jest lepszy dla magistrali MII/I2S/SDIO: USB 3.0, obliczanie okresów/ częstotliwości/ wypełnienia na PC.

DAC (10–12 bit) wyprowadza wartości analogowe na oscyloskop. Przydatne do debugowania schedulerów: stopnie napięcia pokazują priorytety wątków.

Ograniczenia debugowania krok po kroku i alternatywy

GDB przez SWD/JTAG zatrzymuje wykonanie na breakpoint (PC/LR z HardFault). Ale zakłóca timingi: sprzętowe timery wyprzedzają, WDT resetuje MCU. Optymalizacje (-O0 -g3) wymagają miejsca w Flash, często niedostępnego.

Alternatywa — arm-none-eabi-addr2line do konwersji adresów HardFault na linie kodu:

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

Wyświetlacz (OLED) do autonomicznego pokazywania metryk: monitoring w stylu tamagotchi bez UART. Testy modułowe pokrywają kod bez debugera, umożliwiają refaktoring.

Co najważniejsze

  • HeartBeat LED i MCO — startowy test dymny, bez nich diagnostyka niemożliwa.
  • CLI z poziomami logowania daje pełną kontrolę bez naruszania timingów.
  • GPIO/DAC + oscyloskop/analizator dla sygnałów real-time.
  • Assert i addr2line lokalizują HardFault bez pełnego debugera.
  • GDB/SWD — ostateczność z powodu zakłóceń timingowych.

— Editorial Team

Advertisement 728x90

Czytaj dalej