Jak przenieść projekt ze środowiska IAR Embedded Workbench do Atollic TrueSTUDIO – poradnik migracyjny
Tab. 1. Predefiniowane symbole specyficzne da środowiska IAR EmbeddedWorkbench
Symbol w IAR | Symbol w GCC | Komentarz |
__BUILD_NUMBER__ | __GNUC__, __GNUC_MINOR__, __GNUC__PATCHLEVEL |
GCC obsługuje osobne oznaczenia dla każdego poziomu numeru budowania X.Y.Z. |
__CORE__ | __ARM_ARCH_*__ | Wersja architektury, na którą projekt jest budowany. |
__ARMVFP__ | __VFP_FP__ | Użycie VFP (Vector Floating Point) |
__CPU_MODE__ | __THUMB_INTERWORK__ __thumb__ |
Wybór trybu pracy: ARM, thumb lub ARM/thumb (interwork) |
__embedded_cplusplus__ | brak | GCC nie ma pojedynczej opcji pozwalającej na wyłączenie obsługi właściwości C++. W zamian istnieje możliwość wyłączania pojedynczych funkcji (np. RTTI) z poziomu linii poleceń. |
__IAR_SYSTEMS_ICC__ | __GNUC__ | Wykorzystywane do sprawdzania jaki toolchain jest w użyciu. |
__ICC_ARM__ | __arm__ | Oznacza budowanie na architekturę ARM. |
__LITTLE_ENDIAN__ | __IEEE_LITTLE_ENDIAN, __IEEE_BIG_ENDIAN |
Ustawienie kolejności bajtów dla danej kompilacji. |
__VER__ | __VERSION__ | Łańcuch znakowy oznaczający wersję kompilatora „x.y.z” |
__TID__ | brak | Identyfikator układu docelowego. Można go dla kompilatora GNU utworzyć za pomocą innych oznaczeń. |
Predefiniowane symbole preprocesora są zasadniczo wykorzystywane do sterowania procesem kompilacji kodu, który został napisany dla więcej niż jednego projektu, architektury lub zestawu narzędzi typu toolchain. W takich przypadkach użytkownik może po prostu wybrać ekwiwalent danego symbolu dla kompilatora GNU z tabeli.
Najprostszą metodą określenia, jakie symbole są potrzebne, jest kompilacja pliku testowego z wymaganymi opcjami, ale przy uruchomieniu samego preprocesora, co można zrobić za pomocą opcji –dM.
Dla przykładu:
gcc -E -dM -mthumb test.c
pokaże symbol __thumb__, natomiast:
gcc -E -dM test.c
pokaże symbol __arm__ (domyślny).
Rozszerzenia języka
Wszystkie kompilatory C/C++ są wyposażone w obsługę rozszerzeń języka, co pozwala programistom pisać wydajniejsze oprogramowanie i utrzymać kontrolę nad procesem tworzenia kodu. Rozszerzenia języka można podzielić następująco:
- Typowe rozszerzenia, nie przeznaczone dla żadnej konkretnej architektury, ale oferujące pewne funkcje, których brakuje w języku (np.: funkcje inline w C, makra zwracające wartości);
- Rozszerzenia zaprojektowane, aby pozwolić programiście na kontrolę umiejscowienia kodu i/lub danych (np. definicja tzw. owning section);
- Rozszerzenia zapewniające specjalne „atrybuty” funkcjom lub danym, pozwalające zmienić sposób, w jaki kompilator je traktuje (np. funkcje obsługi przerwań, spakowane struktury);
- Rozszerzenia pozwalające na programowanie niskopoziomowe (używanie funkcji asemblera oraz funkcji istotnych – intrinsic functions).
Rozszerzenia mogą być implementowane jako:
- Słowa kluczowe: bardzo częste używanie jakiejś cechy (np. funkcje inline lub obsługa komend asemblera) uzasadnia dodanie nowego słowa kluczowego, co pozwala na tworzenie czytelnego kodu. Liczba rozszerzonych słów kluczowych jest zwykle ograniczona, aby zapobiegać „zanieczyszczeniu przestrzeni nazw”.
- Atrybuty ustawiane za pomocą słowa kluczowego __attribute__: mechanizm ten pozwala na zastosowanie dowolnej liczby atrybutów dla obiektu danych lub funkcji przy użyciu pojedynczego słowa kluczowego. Jest to podejście zalecane przy używaniu kompilatora GNU C/C++.
- Dyrektywy #pragma: wyglądają jak dyrektywy preprocesora i zachowują się różnie dla różnych implementacji. Zaletą rozszerzania zestawu funkcji za ich pomocą jest brak konieczności wprowadzania nowych słów kluczowych. Wadą – brak możliwości użycia ich w makrach (jak innych dyrektyw) oraz to, że zwykle włączają/wyłączają daną opcję w całym pliku lub aż do wystąpienia następnej dyrektywy #pragma.
Zestaw narzędzi kompilacji GNU jest wyposażony w wiele rozszerzeń języka, pozwalających na tworzenie kodu wydajnego i dobrze dopasowanego do układu docelowego. Niniejszy tekst nie omawia wszystkich rozszerzeń dostępnych w GNU. Poniższy zestaw tabel przedstawia rozszerzenia występujące w narzędziach IAR EmbeddedWorkbench i ich odpowiedniki w GCC wraz z komentarzami pozwalającymi na zastosowanie funkcji języka dostępnych w kompilatorze IAR w kompilatorze środowiska TrueSTUDIO, do którego przenoszony jest projekt.
Tab. 2. Używanie asemblera w kodzie
IAR | GCC | |
Słowo kluczowe: | __asm | __asm |
Pragma: | ||
Składnia: | __asm(“<assembler>”) | __asm(“<assembler>”) |
Komentarz: | GCC obsługuje podzbiór funkcji IAR EmbeddedWorkbench, pozwalając na dostęp do zmiennych języka C z poziomu asemblera. Zaawansowane wykorzystanie asemblera nie wchodzi w zakres niniejszego tekstu; szczegóły można znaleźć w dokumentacji kompilatora GNU. Warto zauważyć, że w GNU do kończenia instrukcji wykorzystywany jest średnik, natomiast w IAR EmbeddedWorkbench – znak nowej linii ‘\n’. |
Tab. 3. Funkcje inline
IAR | GCC | |
Słowo kluczowe: | inline | inline |
Pragma: | inline | inline |
Składnia: |
#pragma inline void foo (void) {…} inline void foo2 (void) {…} |
inline void foo2 (void) {…} |
Komentarz: | GCC obsługuje tylko realizację tej funkcji za pomocą słowa kluczowego. Rozszerzenie za pomocą #pragma zostało uznane za zbędne, co ma uzasadnienie jeśli weźmiemy pod uwagę obsługę funkcji inline w standardzie C99. |