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.
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ą:
--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_inlinedla 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:
--ihexdla generacji pliku HEX.--bindla 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
Brak komentarzy.