Jak przenieść projekt ze środowiska IAR Embedded Workbench do Atollic TrueSTUDIO – poradnik migracyjny

Tab. 4. Funkcje oparte na pamięci RAM

IAR GCC
Słowo kluczowe: __ramfunc __attribute__((section(“NAME”)))
Pragma:
Składnia:

__ramfunc void foo (void)

{…}

void foo (void)__attribute__ ((section („RAMFNS”)))

{…}

Komentarz: GCC nie obsługuje bezpośrednio opcji kopiowania funkcji z pamięci ROM do RAM przy starcie programu. Uzyskanie identycznego efektu jest jednak możliwe przy pomocy mechanizmu inicjalizacji danych, poprzez utworzenie sekcji zawierającej funkcje do skopiowania (np. „RAMFNS”) i modyfikację kodu rozruchowego oraz skryptu linkera.

 

Tab 5. Przerwania i wyjątki

IAR GCC
Słowo kluczowe:

__swi

__fiq

__irq

__attribute__((interrupt(“SWI”)))

__attribute__((interrupt(“FIQ”)))

__attribute__((interrupt(“IRQ”)))

Pragma:  swi_number=NN
Składnia:

__irq void foo (void)

{…}

void foo (void)__attribute__ ((interrupt(„IRQ”)))

{…}

Komentarz: Aby zdefiniować liczbę użytych przerwań programowych (SWI), oprócz słowa kluczowego __swi konieczne jest w środowisku IAR zastosowanie dyrektywy #pragma swi_number=N.

 

Tab. 6. Zagnieżdżone przerwania

IAR GCC
Słowo kluczowe: __nested __attribute__((nesting))
Pragma:
Składnia:

__nested __irq

void foo (void)

{…}

 void foo (void)__attribute__ ((nesting)) {…}
Komentarz: Atrybut ten (w połączeniu z: interrupt_handlerexception_handler lub nmi_handler) pozwala na używanie w GCC zagnieżdżonych przerwań i wyjątków.

 

Tab. 7. Funkcję niezwracające wartości

IAR GCC
Słowo kluczowe: __noreturn __attribute__((noreturn))
Pragma:
Składnia:

__noreturn void foo (void)

{…}

void foo (void)__attribute__ ((noreturn))

{…}

Komentarz: Funkcja z takim atrybutem jest oznaczona jako niezwracająca.

 

Tab. 8. Funkcje specyficzne dla architektury ARM

IAR GCC
Słowo kluczowe:

__arm

__thumb

__interwork

__attribute__((short_call))

__attribute__((long_call))

Pragma: long_calls
Składnia:

__arm void foo (void)

{…}

Komentarz: Wszystkie wymienione opcje można włączyć na poziomie modułu przy pomocy linii poleceń. W GCC nie ma na obecną chwilę możliwości kontroli każdej z tych funkcji z osobna. Aby odwoływać się do funkcji thumb z kodu zlokalizowanego daleko w mapie adresów można jednak używać atrybutów long_call i short_call.

 

Tab. 9. Słabe funkcje/dane

IAR GCC
Słowo kluczowe: __weak __attribute__((weak))
Pragma: weak Weak
Składnia:

__weak int i;

__weak void foo (void)

{…}

int i __attribute__((weak));

void foo (void) __attribute__((weak))

{…}

Komentarz: Funkcję lub zmienną definiuje się jako słabą, aby można ją było nadpisać jakąkolwiek „silną” (nie-słabą) funkcją o tej samej nazwie. Jeśli taka „silna” funkcja nie jest zdefiniowana, przy konsolidacji zostanie włączona do postaci binarnej funkcja słaba.

 

Tab. 10. Funkcje typu root i nieużywane dane

IAR GCC
Słowo kluczowe: __root __attribute__((used))
Pragma: required
Składnia:

#pragma required=i

int i;

__root void foo (void)

{…}

int i __attribute__((used));

void foo (void) __attribute__((used))

{…}

Komentarz: IAR EmbeddedWorkbench jest wyposażone w dwa niezależne mechanizmy służące do wymuszania na kompilatorze, żeby nie usuwał nieużywanego kodu i danych w czasie konsolidacji. GCC wykorzystuje do tego celu jeden atrybut.

 

O autorze