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.
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:
- 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:
- 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
Brak komentarzy.