Přeskočit na hlavní obsah

Linker

Podporované rodiny STM32: G4 · H5 · H7 · L4 · U5

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, .bss a 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, RAM a volitelně CCMRAM pomocí ORIGIN a LENGTH
  • Umisťuje tabulku vektorů na začátek FLASH
  • Rezervuje paměť pro:
    • Inicializovaná data (.data)
    • Neinicializovaná data (.bss)
    • Heap a zásobník
  • Volitelně umisťuje kritická data nebo zásobník do CCMRAM pro rychlejší přístup
  • Přidává oprávnění pouze pro čtení pro .init_array, .preinit_array a .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 .data v RAM

  • _edata: koncová adresa sekce .data v RAM

  • _sbss: počáteční adresa sekce .bss (neinicializovaná data) v RAM

  • _ebss: koncová adresa sekce .bss v 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:

  1. Zkopíroval inicializovaná data z Flash do RAM (sekce .data)
  2. Vynuloval sekci .bss
  3. Nastavil počáteční ukazatel zásobníku
  4. 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​

  1. Zahrňte Nvic_Lib do své knihovny CMake.
  2. Zahrňte Nvic_Port.h do svého projektu.
  3. Prolinkujte implementační soubory modulu Nvic.
  4. 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​

Příspěvky jsou vítány! Otevřete prosím pull request.