Tab. 11. Dane spakowane
IAR | GCC | |
Słowo kluczowe: | __packed | __attribute__((packed)) |
Pragma: | pack | Pack |
Składnia: |
#pragma pack(4) struct tag1 { char a; int b; } mystruct1; #pragma pack() __packed struct tag1 { char a; int b; } mystruct1; |
#pragma pack(4) struct tag { char a; int b; } mystruct; #pragma pack() struct tag1 { char a; int b __attribute__ ((packed)); } mystruct1; |
Komentarz: | GCC obsługuje to rozszerzenie z użyciem słowa kluczowego __attribute__ i pozwala na pakowanie pojedynczych elementów struktury. |
Tab. 12. Ułożenie (rozmiar słowa) danych
IAR | GCC | |
Słowo kluczowe: | __attribute__((aligned(N))) | |
Pragma: | data_alignment | |
Składnia: |
#pragma data_alignment(8) int i; |
int i __attribute__((aligned(8))); |
Komentarz: | IAR EmbeddedWorkbench obsługuje to rozszerzenie poprzez dyrektywę #pragma, natomiast GCC poprzez słowo kluczowe __attribute__. |
Tab. 13. Ustawienia kolejności bajtów
IAR | GCC | |
Słowo kluczowe: |
__big_endian __little_endian |
|
Pragma: | ||
Składnia: | __big_endian int i; | |
Komentarz: | GCC obsługuje ustawianie kolejności bajtów tylko na poziomie modułu. |
Tab. 14. Dane niezainicjalizowane
IAR | GCC | |
Słowo kluczowe: | __no_init | __attribute__((section(“no_init”))) |
Pragma: | ||
Składnia: | __no_init int i; | int i __attribute__((section(“no_init”))); |
Komentarz: | Zmienna nie zostanie zainicjalizowana przy starcie, gdyż jest umieszczona w osobnej sekcji. W GNU można osiągnąć taki sam efekt wykorzystując atrybut section. |
Tab. 15. Kontrola lokalizacji danych
IAR | GCC | |
Słowo kluczowe: | @ | __attribute__((section(“NAME”))) |
Pragma: | location | |
Składnia: |
#pragma location i=0x0100 int i; __no_init int j @ 0x0104; |
#define i (*(int *)0x0100) |
Komentarz: | Narzędzia GNU obsługują ustawianie lokalizacji zmiennych tylko na poziomie sekcji. Lokalizację zmiennej w procesie konsolidacji można wybrać używając atrybutu section. Pokazana w przykładzie dyrektywa #define daje taki sam efekt. |
Funkcje wbudowane
Oprócz wykorzystania funkcji wbudowanych jako narzędzia dostępu do instrukcji mikrokontrolera, kompilator IAR EmbeddedWorkbench pozwala też na dostęp do adresu początkowego każdej nazwanej sekcji przy użyciu poniższych funkcji.
1 2 3 |
void * __section_begin(char const * section) void * __section_end (char const * section) size_t * __section_size (char const * section) |
Te funkcje nie są obsługiwane przez GCC, ale użytkownik może otrzymać te wartości definiując odpowiednie symbole w pliku sterującym linkerem.