Narzędzia do rozwiązywania problemów w systemach z mikrokontrolerami z rdzeniem Cortex-M3/M4
Praktyczne korzyści jakie przenosi projektantom ARM CoreSight
Jest kilka praktycznych udogodnień w pracy z mikrokontrolerami opartymi o rdzenie Cortex-M3 i M4, które niesie ze sobą architektura CoreSight oraz kilka wad i problemów, które trzeba mieć na uwadze.
Korzyści to:
- mniejsza liczba niezbędnych wyprowadzeń w układzie scalonym niż przy tradycyjnym JTAG’u,
- możliwość podglądu danych w czasie rzeczywistym, w trakcie pracy aplikacji, bez wprowadzania zmian w jej zachowaniu,
- możliwość wykorzystania niezbyt kosztownego debugowania za pomocą funkcji printf() poprzez kanał instruction trace macrocell (ITM),
- możliwość statystycznego profilowania aplikacji,
- możliwość debugowania w trybach obniżonego poboru energii,
- wykorzystanie mało kosztownych obliczeniowo tzw. próbników debugujących (ang. debug probes),
- możliwość raportowania przerwań i innych zdarzeń,
- łatwość pomiarów czasu wykonywania sekcji kodu dzięki wykorzystaniu znaczników czasowych.
Do wad natomiast można zaliczyć:
- transfer danych z wykorzystaniem pojedynczego pinu SWO skutkujący pewnymi ograniczeniami przepustowości (w niektórych układach dostępne są interfejsy 4-bitowe, przy ich wykorzystaniu koszta debugowania wzrastają jednak znacznie),
- monitorowanie stanu danych w czasie rzeczywistym jest ograniczone przez liczbę dostępnych w układzie komparatorów (typowo czterech),
- śledzenie wykonanych instrukcji jest możliwe w układach z 4-bitowym interfejsem debugingowym, nie ma w nich jednak możliwości śledzenia danych.
Aby porównać środowiska do debugowania wykorzystujące architekturę CoreSight i tradycyjnego JTAG’a warto prześledzić rysunki 2 i 3 zamieszczone poniżej.
Rys. 2. Widok okna programu w czasie debugowania z wykorzystaniem tradycyjnej metody run/stop
Rys. 3. Widok okna programu w czasie debugowania z wykorzystaniem Serial Wire Viewer
Na rysunku 3 widoczne jest wiele dodatkowych informacji, wliczając w to:
- wykresy wartości zmiennych w pamięci aktualizowane w czasie rzeczywistym, bez ingerencji w pracę układu (na rysunku są to wartości zmiennych X-Y-Z akcelerometru),
- statystyczny profil czasu, jaki aplikacja „spędza” w różnych miejscach kodu,
- komunikaty realizowane za pomocą funkcji printf() poprzez ITM z funkcji obsługujących akcelerometr,
- indeksowany czasem wystąpienia spis wszystkich przerwań systemowych wraz z opisami,
- statystyki dotyczące przerwań i wyjątków.
Podstawową cechą wszystkich tych informacji jest sposób ich prezentacji. W mgnieniu oka projektant może zwizualizować stan aplikacji i uzyskać odpowiedź na podstawowe pytania:
- czy dane z czujników zmianiają się na bieżąco zgodnie z przewidywaniami?
- czy przerwania są uruchamiane w odpowiednich momentach i w odpowiedniej kolejności?
- czy aplikacja spędza znaczne okresy czasu w konkretnych miejscach?
Są to bardzo wartościowe informacje w momencie gdy wszystkie części systemu, np.: sterowniki peryferiów, kod aplikacji, RTOS, stos TCP/IP, system plików użyty w pamięci Flash oraz stos USB są już połączone. Problemy z jednym z fragmentów kodu mogą wtedy być spowodowane przez problemy w innym, pozornie nie związanym, fragmencie. W takim wypadku, konkretne dane przekształcone w informację wizualną pozwalają szybko zlikwidować wiele potencjalnych kłopotów.