Linker
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,.bssa 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,RAMa voliteľneCCMRAMpomocouORIGINaLENGTH - 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
- Inicializované dáta (
- Voliteľne umiestňuje kritické dáta alebo zásobník do
CCMRAMpre rýchlejší prístup - Pridáva oprávnenia len na čítanie pre
.init_array,.preinit_arraya.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.datav RAM -
_edata: Koncová adresa sekcie.datav RAM -
_sbss: Štartovacia adresa sekcie.bss(neinicializované dáta) v RAM -
_ebss: Koncová adresa sekcie.bssv 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:
- Skopírovanie inicializovaných dát z Flash do RAM (sekcia
.data) - Vynulovanie sekcie
.bss - Nastavenie počiatočného ukazovateľa zásobníka
- 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
- Zahrňte
Nvic_Libdo svojej knižnice CMake. - Zahrňte
Nvic_Port.hdo svojho projektu. - Prilinkujte implementačné súbory modulu Nvic.
- 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
- Mr.Nobody — embedbits.com
Príspevky sú vítané! Otvorte prosím pull request.