forked from espressif/esp-idf
bootloader, esp_system: increase static allocation space for esp32s3
The previously used splits between memory allocated for ROM code, 2nd stage bootloader and the app were somewhat safe and conservative. This resulted in some space being unavailable for static allocation in the app. This commit increases the space available for static allocation to the maximum possible amount. 1. Some of the ROM code static allocation is only used in UART/USB/SPI download modes. This region ("shared buffers") has been placed at the lower end of ROM memory area, to be reusable in flash boot mode. The 2nd stage bootloader linker script is modified to "pack" all sections exactly up to the end but with roughly 8K margin between startup stacks. 2. Instead of calculating the sections placement and hardcoding the addresses in the LD script again, rewrite it to calculate the start address of each memory region automatically based on the logic above. 3. Adjust the app memory layout (SRAM_IRAM_END) accordingly, increasing the space available for static allocation. Overall these changes increase the space available for static allocation by about 78kB. The downside of these changes is that the 2nd stage bootloader .data segment is now directly adjacent to the startup stack on the PRO CPU. Previously, there was effectively about 78kB of extra stack space for the PRO CPU, before the stack would run into the data segment.
This commit is contained in:
committed by
Mahavir Jain
parent
6c5fb29c2c
commit
6e6b9ec5a6
@@ -1,16 +1,51 @@
|
||||
/** Simplified memory map for the bootloader.
|
||||
* Make sure the bootloader can load into main memory without overwriting itself.
|
||||
* We put 2nd bootloader in the high address space (before ROM stack/data/bss).
|
||||
* See memory usage for ROM bootloader at the end of this file.
|
||||
*
|
||||
* ESP32-S3 ROM static data usage is as follows:
|
||||
* - 0x3fcd7e00 - 0x3fce9704: Shared buffers, used in UART/USB/SPI download mode only
|
||||
* - 0x3fce9710 - 0x3fceb710: PRO CPU stack, can be reclaimed as heap after RTOS startup
|
||||
* - 0x3fceb710 - 0x3fced710: APP CPU stack, can be reclaimed as heap after RTOS startup
|
||||
* - 0x3fced710 - 0x3fcf0000: ROM .bss and .data (not easily reclaimable)
|
||||
*
|
||||
* The 2nd stage bootloader can take space up to the end of ROM shared
|
||||
* buffers area (0x3fce9704). For alignment purpose we shall use value (0x3fce9700).
|
||||
*/
|
||||
|
||||
/* The offset between Dbus and Ibus. Used to convert between 0x403xxxxx and 0x3fcxxxxx addresses. */
|
||||
iram_dram_offset = 0x6f0000;
|
||||
|
||||
/* We consider 0x3fce9700 to be the last usable address for 2nd stage bootloader stack overhead, dram_seg,
|
||||
* and work out iram_seg and iram_loader_seg addresses from there, backwards.
|
||||
*/
|
||||
|
||||
/* These lengths can be adjusted, if necessary: */
|
||||
bootloader_usable_dram_end = 0x3fce9700;
|
||||
bootloader_stack_overhead = 0x2000; /* For safety margin between bootloader data section and startup stacks */
|
||||
bootloader_dram_seg_len = 0x4000;
|
||||
bootloader_iram_loader_seg_len = 0x7000;
|
||||
bootloader_iram_seg_len = 0x3000;
|
||||
|
||||
/* Start of the lower region is determined by region size and the end of the higher region */
|
||||
bootloader_dram_seg_end = bootloader_usable_dram_end - bootloader_stack_overhead;
|
||||
bootloader_dram_seg_start = bootloader_dram_seg_end - bootloader_dram_seg_len;
|
||||
bootloader_iram_loader_seg_start = bootloader_dram_seg_start - bootloader_iram_loader_seg_len + iram_dram_offset;
|
||||
bootloader_iram_seg_start = bootloader_iram_loader_seg_start - bootloader_iram_seg_len;
|
||||
|
||||
MEMORY
|
||||
{
|
||||
iram_seg (RWX) : org = 0x403B6000, len = 0x4000
|
||||
iram_loader_seg (RWX) : org = 0x403BA000, len = 0x6000
|
||||
dram_seg (RW) : org = 0x3FCD0000, len = 0x4000
|
||||
iram_seg (RWX) : org = bootloader_iram_seg_start, len = bootloader_iram_seg_len
|
||||
iram_loader_seg (RWX) : org = bootloader_iram_loader_seg_start, len = bootloader_iram_loader_seg_len
|
||||
dram_seg (RW) : org = bootloader_dram_seg_start, len = bootloader_dram_seg_len
|
||||
}
|
||||
|
||||
/* The app may use RAM for static allocations up to the start of iram_loader_seg.
|
||||
* If you have changed something above and this assert fails:
|
||||
* 1. Check what the new value of bootloader_iram_loader_seg start is.
|
||||
* 2. Update the value in this assert.
|
||||
* 3. Update SRAM_IRAM_END in components/esp_system/ld/esp32s3/memory.ld.in to the same value.
|
||||
*/
|
||||
ASSERT(bootloader_iram_loader_seg_start == 0x403cc700, "bootloader_iram_loader_seg_start inconsistent with SRAM_IRAM_END");
|
||||
|
||||
/* Default entry point: */
|
||||
ENTRY(call_start_cpu0);
|
||||
|
||||
@@ -172,28 +207,3 @@ SECTIONS
|
||||
} > iram_seg
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Appendix: Memory Usage of ROM bootloader
|
||||
*
|
||||
* +--------+--------------+------+ 0x3FCD_8000
|
||||
* | ^ |
|
||||
* | | |
|
||||
* | | data/bss |
|
||||
* | | |
|
||||
* | v |
|
||||
* +------------------------------+ 0x3FCE_9910
|
||||
* | ^ |
|
||||
* | | |
|
||||
* | | stack (pro) |
|
||||
* | | |
|
||||
* | v |
|
||||
* +------------------------------+ 0x3FCE_B910
|
||||
* | ^ |
|
||||
* | | |
|
||||
* | | stack (app) |
|
||||
* | | |
|
||||
* | v |
|
||||
* +--------+--------------+------+ 0x3FCE_D910
|
||||
*/
|
||||
|
@@ -36,7 +36,7 @@
|
||||
|
||||
#define SRAM_IRAM_START 0x40370000
|
||||
#define SRAM_DIRAM_I_START 0x40378000
|
||||
#define SRAM_IRAM_END 0x403BA000
|
||||
#define SRAM_IRAM_END 0x403CC700 /* Please refer to ESP32-S3 bootloader.ld for more information on this */
|
||||
#define I_D_SRAM_OFFSET (SRAM_DIRAM_I_START - SRAM_DRAM_START)
|
||||
|
||||
#define SRAM_DRAM_START 0x3FC88000
|
||||
|
Reference in New Issue
Block a user