TT#3 Static Stack Analyzer

Analiza statyczna kodu to pierwszy etap wykrywania błędów w programie. Obejmuje takie obszary, jak analiza składni, jakość kodu czy zgodność z dobrymi praktykami. Pozwala także zwiększyć wydajność kodu oraz jego stabilność jeszcze przed uruchomieniem programu. Co w tym obszarze oferuje nam STM32CubeIDE?

Materiał jest częścią Tips and Tricks – serii artykułów dotyczących ciekawostek o STM32

czyli przydatnych, choć rzadko opisywanych elementów z ekosystemu STM32.

Static Stack Analyzer to wbudowana funkcja dostępna w STM32CubeIDE. Wykorzystuje pliki „elf” oraz „su” i na ich podstawie w sposób graficzny prezentuje dane o używanej przez poszczególne funkcje pamięci, sposób ich wywoływania i powiązania między nimi. Po uruchomieniu IDE funkcja powinna się nam pojawić domyślnie w oknie (perspektywie) C/C++. Jeżeli jednak nie masz jej dostępnej, można ją włączyć wybierając w menu „Windows->Show View->Static Stack Analyzer”.

W przypadku, gdyby po skompilowaniu projektu w oknie nie pojawiły się informacje o strukturze kodu, należy sprawdzić, czy funkcja Enable stack usage analysis (flaga -fstack-usage) jest aktywowana w ustawieniach projektu w menu „Project->Properties->C/C++ Build->Settings->Tool Settings->MCU GCC Compiler->Miscellaneous”.

Okno analizatora stosu składa się z dwóch zakładek: List oraz Call graph.

Zakładka List zawiera listę funkcji wybranego programu.

Znajdziemy tam takie informacje, jak:

  • Function – nazwa funkcji
  • Local cost – ile bajtów na stosie zajmuje funkcja
  • Type – rodzaj alokacji na stosie (statyczna, dynamiczna)
  • Location – nazwa pliku, w którym się znajduje
  • Info – informacje dodatkowe

Mamy też możliwość wyszukania po nazwie oraz ukrycie „martwych” funkcji dzięki „Hide dead code”. Podwójne kliknięcie na nią otwiera nam kod w oknie edytora, co znacznie ułatwia nawigację. Ciekawą funkcją okna jest możliwość kopiowania wraz z informacjami dodatkowymi(skróty Ctrl+C, Ctrl+V).

W zakładce Call Graph znajdziemy szczegóły w postaci drzewa. W pierwszej kolejności widoczne są funkcje, które nie są wywoływane przez inne, czyli głównie Handlery przerwań. Zagłębiając się w kolejne warstwy możemy sprawdzić, jaka zależność istnieje pomiędzy poszczególnymi funkcjami w programie. W tym oknie powinny być widoczne tylko funkcje, które są używane w naszym kodzie.

Ikona po lewej stronie nazwy funkcji informuje nas o sposobie alokacji na stosie:

  • zielona kropka – funkcja używa statycznej alokacji
  • niebieski kwadrat – funkcja używa dynamicznej alokacji
  • ikona 010 – informacja o sposobie alokacji nie jest znana
  • trzy strzałki – funkcja jest wywoływana rekurencyjne

W oknie Call Graph znajdziemy takie informacje, jak:

  • Function – nazwa funkcji
  • Depth – stopień zagnieżdżenia funkcji (0 – funkcja nie jest wywoływana przez inną, ? – wywoływana rekurencyjnie)
  • Max cost – ilość bajtów używanych na stosie z uwzględnieniem stosu potrzebnego na jej wywołanie
  • Local cost – ilość bajtów używanych na stosie przez samą funkcję
  • Type – rodzaj alokacji (statyczna lub dynamiczna)
  • Location – nazwa pliku, w którym się znajduje
  • Info – informacje dodatkowe

Mamy też możliwość sortowania oraz wyszukania po nazwie. Podwójne kliknięcie na funkcję otwiera nam ją w oknie edytora, a zaznaczenie opcji „Case sensitive” włącza/wyłącza uwzględnianie wielkich liter w trakcie wyszukiwania.

Co daje nam właściwie narzędzie Stack Static Analyzer? Dzięki niemu możemy dokonać przeglądu naszych funkcji i wyłapać te, które są np. niepotrzebne, a zajmują miejsce w kodzie. Pozwala nam zoptymalizować rozmiar poszczególnych funkcji oraz przeanalizować ilość zużywanego stosu. Dzięki temu jesteśmy w stanie usprawnić działanie naszego programu jeszcze przed jego uruchomieniem, co pozwala zaoszczędzić czas na wczesnym etapie pisania oprogramowania.

Komentarz

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *