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_handler, exception_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. |