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:

pokaże symbol __thumb__, natomiast:

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.

 

O autorze