Powrót do strony głównej

Budowanie STM32 z IAR za pomocą GNU Make: automatyzacja dla CI/CD

Artykuł opisuje proces konfiguracji GNU Make do automatycznego budowania firmware'ów STM32 z wykorzystaniem kompilatora IAR. Omówiono kluczowe narzędzia IAR, strukturę Makefile, konfigurację opcji kompilacji i linkowania, a także zalety integracji z systemami CI/CD dla rozwoju przemysłowego.

Zautomatyzuj budowanie STM32 z IAR i Make dla CI/CD
Advertisement 728x90

Automatyzacja kompilacji firmware'ów STM32 z IAR za pomocą GNU Make dla CI/CD

Integracja kompilatora IAR z GNU Make otwiera drogę do przemysłowej automatyzacji rozwoju systemów wbudowanych, eliminując zależność od IDE i upraszczając procesy CI/CD. To podejście pozwala na kompilację firmware'ów dla mikrokontrolerów STM32 bezpośrednio z konsoli, zapewniając powtarzalność, skalowalność i integrację z systemami ciągłej integracji.

Analiza IAR ToolChain i jego narzędzi konsolowych

IAR Embedded Workbench dostarcza zestaw narzędzi konsolowych, które wykonują wszystkie etapy kompilacji i linkowania. Kluczowe komponenty obejmują:

  • iasmarm.exe — asembler dla ARM.
  • iccarm.exe — kompilator C/C++ dla ARM.
  • ilinkarm.exe — linker.
  • ielftool.exe — narzędzie do generowania plików binarnych (HEX, BIN).

Te narzędzia są wywoływane z IDE podczas graficznej kompilacji, ale można je bezpośrednio używać w skryptach. Analiza loga kompilacji z IDE IAR pozwala określić dokładne klucze wiersza poleceń, które są stosowane do każdego narzędzia. Na przykład, dla kompilatora iccarm.exe typowe opcje obejmują --cpu=Cortex-M4, --fpu=VFPv4_sp, --debug i flagi wyłączania optymalizacji, takich jak --no_inline lub --no_cse.

Google AdInline article slot

Struktura Makefile dla IAR

Głównym zadaniem jest stworzenie Makefile, który poprawnie wywołuje narzędzia IAR z niezbędnymi parametrami. Skrypt powinien elastycznie określać ścieżki do narzędzi, albo poprzez zmienną środowiskową IAR_PATH, albo poprzez systemowy PATH. Przykład definicji zmiennych dla narzędzi:

ifdef IAR_PATH
    CC = $(IAR_PATH)/iccarm.exe
    AS = $(IAR_PATH)/iasmarm.exe
    LD = $(IAR_PATH)/ilinkarm.exe
    ELF_TOOL = $(IAR_PATH)/ielftool.exe
else
    CC = iccarm.exe
    AS = iasmarm.exe
    LD = ilinkarm.exe
    ELF_TOOL = ielftool.exe
endif

Kluczowe sekcje Makefile obejmują:

  • Definicja flag kompilacji (CFLAGS): zestaw opcji specyficznych dla IAR, takich jak wybór rdzenia procesora, FPU i informacji debugowania.
  • Flagi asemblera (ASFLAGS): parametry do przetwarzania plików asemblerowych.
  • Flagi linkowania (LDFLAGS): opcje linkera, w tym plik konfiguracyjny (.icf) i punkt wejścia.
  • Zasady kompilacji: cele dla kompilacji plików źródłowych (.c, .s) w pliki obiektowe (.o) i późniejszego linkowania w plik wykonywalny (.out).

Konfiguracja kompilatora i kluczowe opcje

Dla udanej kompilacji konieczne jest poprawne skonfigurowanie opcji kompilatora IAR. Główne klucze, używane w typowym projekcie dla STM32F407 (Cortex-M4), obejmują:

Google AdInline article slot
  • --cpu=Cortex-M4: wskazanie docelowego rdzenia procesora.
  • --fpu=VFPv4_sp: aktywacja jednostki obliczeń zmiennoprzecinkowych.
  • --endian=little: kolejność bajtów.
  • -e: włączenie rozszerzeń języka C od IAR.
  • --debug: dodanie informacji debugowania.
  • Flagi zarządzania optymalizacją, na przykład --no_inline dla zakazu funkcji inline.

Te opcje są zbierane w zmiennej COMPILE_IAR_OPT w Makefile. Dodatkowo mogą być tłumione specyficzne komunikaty diagnostyczne kompilatora za pomocą --diag_suppress.

Proces linkowania i generacja końcowych artefaktów

Linker IAR (ilinkarm.exe) łączy pliki obiektowe, używając skryptu linkowania (.icf), który określa rozmieszczenie sekcji w pamięci mikrokontrolera. Kluczowe opcje linkera:

  • --config $(LDSCRIPT): wskazanie pliku konfiguracji linkowania.
  • --entry __iar_program_start: punkt wejścia programu.
  • --semihosting: wsparcie semihosting dla debugowania.
  • --map $(BUILD_DIR)/$(TARGET).map: generacja mapy pamięci.

Po utworzeniu pliku .out narzędzie ielftool.exe konwertuje go do formatów nadających się do wgrania do mikrokontrolera:

Google AdInline article slot
  • --ihex dla generacji pliku HEX.
  • --bin dla stworzenia obrazu binarnego.

Integracja z CI/CD i zalety podejścia

Użycie GNU Make do kompilacji z IAR zapewnia kilka krytycznych zalet w rozwoju przemysłowym:

  • Automatyzacja: kompilacje mogą być uruchamiane automatycznie na serwerach CI/CD (na przykład Jenkins, GitLab CI) bez ręcznej interwencji.
  • Powtarzalność: Makefile gwarantuje identyczne wyniki kompilacji na różnych maszynach, w przeciwieństwie do ustawień IDE, które mogą zależeć od środowiska.
  • Skalowalność: łatwo dodawać nowe konfiguracje kompilacji (na przykład dla różnych modeli urządzeń) poprzez zmianę kilku linii w Makefile, a nie ręcznego edytowania dziesiątek konfiguracji w IDE.
  • Niezależność od IDE: programiści mogą używać dowolnego edytora tekstu lub środowiska programistycznego, nie będąc przywiązanymi do IAR Embedded Workbench.
  • Porównanie kompilatorów: możliwość szybkiego przełączania między różnymi kompilatorami (na przykład IAR i GCC) dla dodatkowej weryfikacji kodu i szukania błędów.

Praktyczne kroki do wdrożenia

  • Zainstaluj IAR Embedded Workbench i upewnij się, że narzędzia konsolowe są dostępne w PATH lub zdefiniuj zmienną IAR_PATH.
  • Przeanalizuj istniejący projekt IAR, wygenerowany, na przykład, poprzez STM32CubeMX, aby wyodrębnić klucze kompilacji z loga kompilacji IDE.
  • Stwórz podstawowy Makefile, definiując zmienne dla narzędzi, flagi kompilacji i linkowania, oraz zasady kompilacji.
  • Dostosuj skrypt linkowania (.icf) pod twoją docelową platformę, jeśli to konieczne.
  • Przetestuj kompilację z wiersza poleceń, upewniając się, że generowane są poprawne artefakty (HEX, BIN).
  • Zintegruj z CI/CD, dodając wywołanie make w potoku kompilacji.

Co jest ważne

  • Automatyzacja kompilacji: GNU Make pozwala na pełną automatyzację procesu kompilacji firmware'u z IAR, wykluczając ręczne operacje w IDE.
  • Elastyczność konfiguracji: łatwo zarządzać wieloma konfiguracjami kompilacji poprzez Makefile, co jest krytyczne dla projektów z szerokim asortymentem produktów.
  • Integracja z CI/CD: podejście zapewnia bezproblemową integrację z systemami ciągłej integracji i dostawy, przyspieszając cykle rozwoju.
  • Niezależność od narzędzi: programiści nie są przywiązani do konkretnego IDE, co podnosi elastyczność workflowu.
  • Podniesienie jakości kodu: możliwość kompilacji różnymi kompilatorami pomaga wykrywać ukryte błędy i poprawiać przenośność kodu.

— Editorial Team

Advertisement 728x90

Czytaj dalej