Linker
Tato komponenta definuje rozložení paměti a umístění segmentů pro firmware mikrokontroléru STM32. Je klíčovou součástí BSP (Board Support Package) a linker ji potřebuje ke správnému uspořádání kódu a dat v paměti zařízení.
Účel
Linker script poskytuje:
- Explicitní kontrolu nad paměťovými oblastmi, jako jsou Flash, RAM a CCMRAM
- Umístění speciálních sekcí, např. tabulky vektorů,
.text,.data,.bssa zásobníku - Symboly, na které se odkazuje během startu (např.
_sdata,_edata,_sidata) - Podporu inicializačních polí ve stylu CMSIS (
.preinit_array,.init_array)
Klíčové vlastnosti
- Definuje
FLASH,RAMa volitelněCCMRAMpomocíORIGINaLENGTH - Umisťuje tabulku vektorů na začátek
FLASH - Rezervuje paměť pro:
- Inicializovaná data (
.data) - Neinicializovaná data (
.bss) - Heap a zásobník
- Inicializovaná data (
- Volitelně umisťuje kritická data nebo zásobník do
CCMRAMpro rychlejší přístup - Přidává oprávnění pouze pro čtení pro
.init_array,.preinit_arraya.fini_array, aby se předešlo varováním linkeru o RWX
Typické rozložení
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
}
SECTIONS
{
.isr_vector :
{
KEEP(*(.isr_vector))
} > FLASH
.text :
{
*(.text*)
*(.rodata*)
} > FLASH
.data : AT (_etext)
{
_sdata = .;
*(.data*)
_edata = .;
} > RAM
.bss :
{
_sbss = .;
*(.bss*)
_ebss = .;
} > RAM
.ccm_data :
{
*(.ccmram*)
} > CCMRAM
.stack :
{
. = ALIGN(8);
_stack_top = .;
} > RAM
/* Initialization arrays */
.preinit_array (READONLY) :
{
KEEP(*(.preinit_array))
} > FLASH
.init_array (READONLY) :
{
KEEP(*(.init_array))
} > FLASH
}
Poskytované symboly
Linker script definuje symboly používané při startu a inicializaci:
-
_sidata: počáteční adresa počátečních hodnot sekce.data, typicky umístěná ve Flash -
_sdata: počáteční adresa sekce.datav RAM -
_edata: koncová adresa sekce.datav RAM -
_sbss: počáteční adresa sekce.bss(neinicializovaná data) v RAM -
_ebss: koncová adresa sekce.bssv RAM -
_ccmram_start,_ccmram_end: hranice paměťové oblasti CCMRAM (volitelné) -
_stack_top: vrchol zásobníku, obvykle na konci RAM
Startup kód tyto symboly používá k tomu, aby:
- Zkopíroval inicializovaná data z Flash do RAM (sekce
.data) - Vynuloval sekci
.bss - Nastavil počáteční ukazatel zásobníku
- V případě potřeby přesunul tabulku vektorů do RAM nebo CCMRAM
Poznámky k použití
- Linker script musí zůstat synchronizovaný s konfigurací paměti definovanou v nastavení vašeho projektu.
- Všechny vlastní sekce přidané ve vašem kódu (např.
.ccmram,.bootloader,.shared) musí být v linker scriptu zohledněny. - Dávejte pozor na zarovnání a oprávnění sekcí, abyste předešli HardFault nebo neočekávanému chování.
Integrace
Soubor linker scriptu se pomocí CMake generuje ze souboru STM32G4xx_Linker.ld.in a závisí na nakonfigurovaném MCU STM32.
Zajistěte, aby příznaky kompilátoru a linkeru umožňovaly použití těchto symbolů ve vašem kódu v C, typicky pomocí:
extern uint32_t _sdata;
extern uint32_t _edata;
extern uint32_t _sidata;
extern uint32_t _sbss;
extern uint32_t _ebss;
extern uint32_t _ccmram_start;
extern uint32_t _ccmram_length;
extern uint32_t _ccmram_end;
extern uint32_t _ram_start;
extern uint32_t _ram_length;
extern uint32_t _ram_end;
🛠 Integrace s CMake
- Zahrňte
Nvic_Libdo své knihovny CMake. - Zahrňte
Nvic_Port.hdo svého projektu. - Prolinkujte implementační soubory modulu Nvic.
- Nakonfigurujte modul podle potřeb vašeho hardwaru.
Licence
Tento projekt je licencován pod licencí Creative Commons Uveďte původ–Neužívejte komerčně 4.0 Mezinárodní (CC BY-NC 4.0).
Toto dílo můžete volně používat, upravovat a sdílet pro nekomerční účely za předpokladu, že uvedete odpovídající autorství.
Úplné podmínky najdete v LICENSE.md nebo navštivte creativecommons.org/licenses/by-nc/4.0.
Autoři
- Mr.Nobody — embedbits.com
Příspěvky jsou vítány! Otevřete prosím pull request.