Preskočiť na hlavný obsah

Linker

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

Tento komponent definuje rozloženie pamäte a umiestnenie segmentov pre firmware mikrokontroléra STM32. Je kritickou súčasťou BSP (Board Support Package) a linker ho potrebuje na správne usporiadanie kódu a dát v pamäti zariadenia.

Účel​

Linker script poskytuje:

  • Explicitnú kontrolu nad pamäťovými oblasťami, ako sú Flash, RAM a CCMRAM
  • Umiestnenie špeciálnych sekcií, ako sú vektorová tabuľka, .text, .data, .bss a zásobník
  • Symboly, na ktoré sa odkazuje počas štartu (napr. _sdata, _edata, _sidata)
  • Podporu inicializačných polí v štýle CMSIS (.preinit_array, .init_array)

Kľúčové vlastnosti​

  • Definuje FLASH, RAM a voliteľne CCMRAM pomocou ORIGIN a LENGTH
  • Umiestňuje vektorovú tabuľku na začiatok FLASH
  • Rezervuje pamäť pre:
    • Inicializované dáta (.data)
    • Neinicializované dáta (.bss)
    • Heap a zásobník
  • Voliteľne umiestňuje kritické dáta alebo zásobník do CCMRAM pre rýchlejší prístup
  • Pridáva oprávnenia len na čítanie pre .init_array, .preinit_array a .fini_array, aby sa predišlo upozorneniam linkera na RWX

Typické rozloženie​

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, ktoré sa používajú pri štarte a inicializácii:

  • _sidata: Štartovacia adresa počiatočných hodnôt sekcie .data, typicky umiestnená vo Flash

  • _sdata: Štartovacia adresa sekcie .data v RAM

  • _edata: Koncová adresa sekcie .data v RAM

  • _sbss: Štartovacia adresa sekcie .bss (neinicializované dáta) v RAM

  • _ebss: Koncová adresa sekcie .bss v RAM

  • _ccmram_start, _ccmram_end: Hranice pamäťovej oblasti CCMRAM (voliteľné)

  • _stack_top: Vrchol zásobníka, zvyčajne na konci RAM

Tieto symboly používa štartovací kód na:

  1. Skopírovanie inicializovaných dát z Flash do RAM (sekcia .data)
  2. Vynulovanie sekcie .bss
  3. Nastavenie počiatočného ukazovateľa zásobníka
  4. Voliteľné presunutie vektorovej tabuľky do RAM alebo CCMRAM, ak je to potrebné

Poznámky k použitiu​

  • Linker script musí byť udržiavaný v súlade s konfiguráciou pamäte definovanou v nastaveniach vášho projektu.
  • Každú vlastnú sekciu pridanú vo vašom kóde (napr. .ccmram, .bootloader, .shared) je potrebné zohľadniť v linker scripte.
  • Dávajte pozor na zarovnanie a oprávnenia sekcií, aby ste sa vyhli hard faultom alebo neočakávanému správaniu.

Integrácia​

Súbor linker scriptu sa generuje z STM32G4xx_Linker.ld.in pomocou CMake a závisí od nakonfigurovaného MCU STM32.

Uistite sa, že príznaky vášho kompilátora a linkera umožňujú používať tieto symboly vo vašom kóde v C, typicky takto:

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;

🛠 Integrácia s CMake​

  1. Zahrňte Nvic_Lib do svojej knižnice CMake.
  2. Zahrňte Nvic_Port.h do svojho projektu.
  3. Prilinkujte implementačné súbory modulu Nvic.
  4. Nakonfigurujte modul podľa potrieb vášho hardvéru.

Licencia​

Tento projekt je licencovaný pod licenciou Creative Commons Attribution–NonCommercial 4.0 International (CC BY-NC 4.0).

Toto dielo môžete slobodne používať, upravovať a zdieľať na nekomerčné účely, pokiaľ uvediete primeraný zdroj.

Úplné znenie podmienok nájdete v LICENSE.md alebo na creativecommons.org/licenses/by-nc/4.0.


Autori​

Príspevky sú vítané! Otvorte prosím pull request.