EMBEDDED TOOLKIT
SYSTEMS R&D // DEV_TOOLS SUITE
Narzędzia (65)
gcc attributes compiler flags
SYSTEM ONLINE
Najważniejsze rozszerzenia kompilatora GCC dla Embedded
__attribute__((packed))
Instruuje kompilator aby NIE wstawiał żadnych pustych bajtów wyrównujących (padding) wewnątrz struktury. Często powoduje Unaligned Access.
Zastosowanie: Mapowanie nagłówków sieciowych (TCP/IP) lub surowych binarnych frame'ów UART.
__attribute__((aligned(X)))
Wymusza wyrównanie zmiennej/struktury do granicy X bajtów w pamięci.
Zastosowanie: Wymagane np. przez sprzętowy kontroler DMA, który potrafi czytać tylko wyrównane adresy w pamięci SRAM.
__attribute__((section(".name")))
Umieszcza skompilowany kod funkcji lub zmienną w konkretnej, zdefiniowanej przez programistę sekcji w skrypcie linkera (.ld).
Zastosowanie: Umieszczanie krytycznych funkcji ISR w szybkiej pamięci RAM (ITCM) zamiast we Flashu, albo zapisywanie certyfikatów we Flashu.
__attribute__((weak))
Oznacza funkcję jako 'słabą'. Jeśli gdziekolwiek indziej w kodzie napiszesz funkcję o tej samej nazwie, ta słaba zostanie bezbłędnie nadpisana.
Zastosowanie: Domyślne handlery przerwań (Default_Handler) albo callbacki generowane w CubeMX (HAL_UART_RxCpltCallback).
__attribute__((always_inline))
Zmusza kompilator do bezwzględnego skopiowania kodu funkcji w miejsce wywołania, nawet jeśli flaga -O0 jest włączona.
Zastosowanie: Ultra-szybki, opóźniony kod w przerwaniach, lub makra zastępujące funkcje bitowe.
__attribute__((naked))
Kompilator nie generuje dla tej funkcji kodu wejściowego (prologue) ani wyjściowego (epilogue). Kompiluje C bezpośrednio jako assembler w środku.
Zastosowanie: Pisanie niestandardowych procedur RTOS (Context Switch), gdzie samodzielnie zarządzasz rejestrami SP, LR, PC.
__attribute__((used))
Mówi linkerowi (LTO), aby absolutnie nie wyrzucał tego kodu, nawet jeżeli wydaje się on nigdzie nie wywoływany w programie.
Zastosowanie: Tablice wektorów przerwań (Vector Table) lub funkcje wołane tylko z assemblera.
📖 Magia Kompilatora i Linkera
Samo napisanie czystego kodu w C często nie wystarcza na najmniejszych i najbardziej wrażliwych sprzętowo układach.
- Atrybuty GCC informują proces łączenia (linkowania) oraz generowania Assemblera, jak zoptymalizować dane w pamięci (z pominięciem reguł standardu C99/C11).
- Nawet najlepiej zoptymalizowany kod z flagą
-O0może okazać się ślamazarny, a z flagą-O3urosnąć tak bardzo objętościowo (np. przez rozwijanie pętli FOR), że nie zmieści się we Flashu. Zawsze balansuj za pomocą-Osi flag-flto.