From 17b62d8d2b2691610f5b14853c4456fd58b913ef Mon Sep 17 00:00:00 2001 From: Rutherther Date: Sat, 28 Sep 2024 22:02:24 +0200 Subject: [PATCH] feat: more robust ram data loading The .data section was assumed to start after .text. This condition is satisfied now, but why rely on it? The load address can be exported from the linker script with LOADADDR call. --- devices/general/startup.c | 8 ++++---- devices/stm32f401/linker_script.ld | 5 +++++ devices/stm32f446/linker_script.ld | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/devices/general/startup.c b/devices/general/startup.c index 51bbe35..f6c0937 100644 --- a/devices/general/startup.c +++ b/devices/general/startup.c @@ -1,14 +1,14 @@ #include #include "defines.h" -extern uint32_t _etext, _sdata, _edata, _sbss, _ebss; +extern uint32_t _data_size, _bss_size, _data_loadaddr, _sdata, _sbss; void main(void); void reset_handler(void) { // Copy .data from FLASH to SRAM - uint32_t data_size = (uint32_t)&_edata - (uint32_t)&_sdata; - uint8_t *flash_data = (uint8_t*) &_etext; + uint32_t data_size = (uint32_t)&_data_size; + uint8_t *flash_data = (uint8_t*) &_data_loadaddr; uint8_t *sram_data = (uint8_t*) &_sdata; for (uint32_t i = 0; i < data_size; i++) @@ -17,7 +17,7 @@ void reset_handler(void) } // Zero-fill .bss section in SRAM - uint32_t bss_size = (uint32_t)&_ebss - (uint32_t)&_sbss; + uint32_t bss_size = (uint32_t)&_bss_size; uint8_t *bss = (uint8_t*) &_sbss; for (uint32_t i = 0; i < bss_size; i++) diff --git a/devices/stm32f401/linker_script.ld b/devices/stm32f401/linker_script.ld index e11a59e..490cc59 100644 --- a/devices/stm32f401/linker_script.ld +++ b/devices/stm32f401/linker_script.ld @@ -33,6 +33,9 @@ SECTIONS _edata = .; } >SRAM AT> FLASH + _data_size = _edata - _sdata; + _data_loadaddr = LOADADDR(.data); + .bss : { . = ALIGN(4); @@ -43,6 +46,8 @@ SECTIONS . = ALIGN(4); _ebss = .; } >SRAM + + _bss_size = _ebss - _sbss; } ENTRY(reset_handler) diff --git a/devices/stm32f446/linker_script.ld b/devices/stm32f446/linker_script.ld index 6415a6b..8e4ee4b 100644 --- a/devices/stm32f446/linker_script.ld +++ b/devices/stm32f446/linker_script.ld @@ -33,6 +33,9 @@ SECTIONS _edata = .; } >SRAM AT> FLASH + _data_size = _edata - _sdata; + _data_loadaddr = LOADADDR(.data); + .bss : { . = ALIGN(4); @@ -43,6 +46,8 @@ SECTIONS . = ALIGN(4); _ebss = .; } >SRAM + + _bss_size = _ebss - _sbss; } ENTRY(reset_handler) -- 2.48.1