soc: esp32: ESP WiFi heap

Provide symbols for the creation of dynamic memory pool.
Fix static allocation size check.

Signed-off-by: Marek Matej <marek.matej@espressif.com>
This commit is contained in:
Marek Matej 2024-09-02 14:43:19 +02:00 committed by Henrik Brix Andersen
commit 94731488e7
3 changed files with 41 additions and 45 deletions

View file

@ -24,7 +24,7 @@ user_iram_end = SRAM1_DRAM_IRAM_CALC(SRAM1_DRAM_USER_START);
user_iram_seg_org = (SRAM0_IRAM_START + SRAM0_CACHE_SIZE); user_iram_seg_org = (SRAM0_IRAM_START + SRAM0_CACHE_SIZE);
user_iram_seg_len = user_iram_end - user_iram_seg_org; user_iram_seg_len = user_iram_end - user_iram_seg_org;
user_dram_seg_org = SRAM2_DRAM_USER_START; user_dram_seg_org = SRAM2_DRAM_USER_START;
user_dram_seg_len = SRAM2_USER_SIZE; user_dram_seg_len = SRAM2_DRAM_USER_SIZE;
user_dram_2_seg_org = SRAM1_DRAM_USER_START; user_dram_2_seg_org = SRAM1_DRAM_USER_START;
user_dram_2_seg_len = SRAM1_USER_SIZE; user_dram_2_seg_len = SRAM1_USER_SIZE;
@ -116,11 +116,7 @@ _rom_store_table = 0;
PROVIDE(_memmap_vecbase_reset = 0x40000450); PROVIDE(_memmap_vecbase_reset = 0x40000450);
PROVIDE(_memmap_reset_vector = 0x40000400); PROVIDE(_memmap_reset_vector = 0x40000400);
#ifdef CONFIG_BT _heap_sentry = SRAM2_DRAM_END;
_heap_sentry = SRAM1_DRAM_USER_START;
#else
_heap_sentry = DRAM1_BT_SHM_BUFFERS_START; /* was 0x3ffe3f20; */
#endif
SECTIONS SECTIONS
{ {
@ -357,12 +353,6 @@ SECTIONS
*libzephyr.a:periph_ctrl.*(.literal .text .literal.* .text.*) *libzephyr.a:periph_ctrl.*(.literal .text .literal.* .text.*)
*(.literal.sar_periph_ctrl_power_enable .text.sar_periph_ctrl_power_enable) *(.literal.sar_periph_ctrl_power_enable .text.sar_periph_ctrl_power_enable)
/* TODO: optimize SRAM usage
*libzephyr.a:periph_ctrl.*(.literal.periph_module_reset .text.periph_module_reset)
*libzephyr.a:periph_ctrl.*(.literal.wifi_module_disable .text.wifi_module_disable)
*libzephyr.a:periph_ctrl.*(.literal.wifi_module_enable .text.wifi_module_enable)
*libzephyr.a:rtc_wdt.*(.literal .literal.* .text .text.*)
*/
*libzephyr.a:esp_system_chip.*(.literal.esp_system_abort .text.esp_system_abort) *libzephyr.a:esp_system_chip.*(.literal.esp_system_abort .text.esp_system_abort)
*libzephyr.a:spi_hal_iram.*(.literal .literal.* .text .text.*) *libzephyr.a:spi_hal_iram.*(.literal .literal.* .text .text.*)
*libzephyr.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*) *libzephyr.a:spi_slave_hal_iram.*(.literal .literal.* .text .text.*)
@ -453,7 +443,7 @@ SECTIONS
*libzephyr.a:mpu_hal.*(.literal .text .literal.* .text.*) *libzephyr.a:mpu_hal.*(.literal .text .literal.* .text.*)
*libzephyr.a:cpu_region_protect.*(.literal .text .literal.* .text.*) *libzephyr.a:cpu_region_protect.*(.literal .text .literal.* .text.*)
/* to overcome the bug in esptool making Simple boot compatible image */ /* NOTE: to overcome the bug in esptool making Simple boot compatible image */
. += 16; . += 16;
. = ALIGN(16); . = ALIGN(16);
} GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION) } GROUP_DATA_LINK_IN(IRAM_REGION, ROMABLE_REGION)
@ -488,6 +478,12 @@ SECTIONS
_iram_end = ABSOLUTE(.); _iram_end = ABSOLUTE(.);
} GROUP_LINK_IN(IRAM_REGION) } GROUP_LINK_IN(IRAM_REGION)
/* This symbol is here to check SRAM1 usage in case it is used for data too */
_iram_end_at_dram_addr = SRAM1_IRAM_DRAM_CALC(_iram_end);
_unallocated_iram_memory_size = ORIGIN(iram0_0_seg) + LENGTH(iram0_0_seg) - _iram_end;
ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)), "IRAM code does not fit.")
/* --- IRAM END --- */ /* --- IRAM END --- */
/* --- DRAM BEGIN --- */ /* --- DRAM BEGIN --- */
@ -707,9 +703,6 @@ SECTIONS
_bss_end = ABSOLUTE(.); _bss_end = ABSOLUTE(.);
} GROUP_LINK_IN(RAMABLE_REGION) } GROUP_LINK_IN(RAMABLE_REGION)
ASSERT(((__bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)),
"DRAM segment data does not fit.")
.dram0.noinit (NOLOAD) : .dram0.noinit (NOLOAD) :
{ {
. = ALIGN (8); . = ALIGN (8);
@ -718,15 +711,12 @@ SECTIONS
. = ALIGN (8); . = ALIGN (8);
} GROUP_LINK_IN(RAMABLE_REGION_1) } GROUP_LINK_IN(RAMABLE_REGION_1)
.dram0.end (NOLOAD) : /* Provide total SRAM usage, including IRAM and DRAM */
{ _image_ram_start = _dram_data_start;
. = ALIGN(4); #include <zephyr/linker/ram-end.ld>
_end = ABSOLUTE(.); _image_ram_size += _iram_end - _iram_start;
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
/* TODO: Provide total SRAM usage, including IRAM and DRAM */ ASSERT(((_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)), "DRAM data does not fit.")
/* _image_ram_start = _iram_start - IRAM_DRAM_OFFSET; */
/* #include <zephyr/linker/ram-end.ld> */
/* --- DRAM END --- */ /* --- DRAM END --- */
@ -934,9 +924,6 @@ SECTIONS
/* --- XTENSA GLUE AND DEBUG END --- */ /* --- XTENSA GLUE AND DEBUG END --- */
ASSERT(((_iram_end - ORIGIN(iram0_0_seg)) <= LENGTH(iram0_0_seg)),
"IRAM0 segment data does not fit.")
#ifdef CONFIG_ESP_SPIRAM #ifdef CONFIG_ESP_SPIRAM
ASSERT(((_ext_ram_data_end - _ext_ram_data_start) <= CONFIG_ESP_SPIRAM_SIZE), ASSERT(((_ext_ram_data_end - _ext_ram_data_start) <= CONFIG_ESP_SPIRAM_SIZE),
"External SPIRAM overflowed.") "External SPIRAM overflowed.")

View file

@ -51,6 +51,8 @@ _rom_store_table = 0;
PROVIDE(_memmap_vecbase_reset = 0x40000450); PROVIDE(_memmap_vecbase_reset = 0x40000450);
PROVIDE(_memmap_reset_vector = 0x40000400); PROVIDE(_memmap_reset_vector = 0x40000400);
_heap_sentry = 0x3ffe3f20;
SECTIONS SECTIONS
{ {
#include <zephyr/linker/rel-sections.ld> #include <zephyr/linker/rel-sections.ld>
@ -285,9 +287,10 @@ SECTIONS
.dram0.end : .dram0.end :
{ {
. = ALIGN(4); . = ALIGN(4);
#include <snippets-rwdata.ld> #include <snippets-rwdata.ld>
. = ALIGN(4); . = ALIGN(4);
_end = ABSOLUTE(.);
__data_end = ABSOLUTE(.); __data_end = ABSOLUTE(.);
} GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_DATA_REGION) } GROUP_DATA_LINK_IN(RAMABLE_REGION, ROMABLE_DATA_REGION)
@ -322,9 +325,13 @@ SECTIONS
*(COMMON) *(COMMON)
. = ALIGN (8); . = ALIGN (8);
__bss_end = ABSOLUTE(.); __bss_end = ABSOLUTE(.);
_end = ABSOLUTE(.);
} GROUP_LINK_IN(RAMABLE_REGION) } GROUP_LINK_IN(RAMABLE_REGION)
/* Provide total SRAM usage, including IRAM and DRAM */
_image_ram_start = __rodata_region_start;
#include <zephyr/linker/ram-end.ld>
_image_ram_size += _iram_end - _iram_start;
ASSERT(((__bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)), ASSERT(((__bss_end - ORIGIN(dram0_0_seg)) <= LENGTH(dram0_0_seg)),
"DRAM segment data does not fit.") "DRAM segment data does not fit.")
@ -357,7 +364,6 @@ SECTIONS
_flash_cache_start = ABSOLUTE(0); _flash_cache_start = ABSOLUTE(0);
} GROUP_DATA_LINK_IN(FLASH_CODE_REGION, ROMABLE_REGION) } GROUP_DATA_LINK_IN(FLASH_CODE_REGION, ROMABLE_REGION)
_heap_sentry = 0x3ffe3f20;
#include <zephyr/linker/debug-sections.ld> #include <zephyr/linker/debug-sections.ld>

View file

@ -4,25 +4,27 @@
*/ */
#pragma once #pragma once
/* SRAM0 (64k+128k) instruction cache+memory */ /* SRAM0 (192kB) instruction cache+memory */
#define SRAM0_IRAM_START 0x40070000 #define SRAM0_IRAM_START 0x40070000
#define SRAM0_CACHE_SIZE 0x10000 #define SRAM0_CACHE_SIZE 0x10000
#define SRAM0_SIZE 0x30000 #define SRAM0_SIZE 0x30000
/* SRAM1 (128k) instruction/data memory */ /* SRAM1 (128kB) instruction/data memory */
#define SRAM1_IRAM_START 0x400a0000 #define SRAM1_IRAM_START 0x400a0000
#define SRAM1_DRAM_START 0x3ffe0000 #define SRAM1_DRAM_START 0x3ffe0000
#define SRAM1_SIZE 0x20000 #define SRAM1_SIZE 0x20000
#define SRAM1_DRAM_END (SRAM1_DRAM_START + SRAM1_SIZE)
#define SRAM1_DRAM_PROAPP_PRIV_SIZE 0x8000 #define SRAM1_DRAM_PROAPP_PRIV_SIZE 0x8000
#define SRAM1_DRAM_USER_START 0x3ffe5400 #define SRAM1_DRAM_USER_START 0x3ffe8000
#define SRAM1_USER_SIZE (0x40000000 - SRAM1_DRAM_USER_START) #define SRAM1_USER_SIZE (0x40000000 - SRAM1_DRAM_USER_START)
/* SRAM2 (200k) data memory */ /* SRAM2 (200kB) data memory */
#define SRAM2_DRAM_START 0x3ffae000 #define SRAM2_DRAM_START 0x3ffae000
#define SRAM2_SIZE 0x32000 #define SRAM2_DRAM_SIZE 0x32000
#define SRAM2_DRAM_SHM_PRIV_SIZE 0x2000 #define SRAM2_DRAM_SHM_SIZE 0x2000
#define SRAM2_DRAM_USER_START 0x3ffb0000 #define SRAM2_DRAM_END (SRAM2_DRAM_START + SRAM2_DRAM_SIZE)
#define SRAM2_USER_SIZE (SRAM1_DRAM_START - SRAM2_DRAM_USER_START) #define SRAM2_DRAM_USER_START (SRAM2_DRAM_START + SRAM2_DRAM_SHM_SIZE)
#define SRAM2_DRAM_USER_SIZE (SRAM2_DRAM_END - SRAM2_DRAM_USER_START)
/** Simplified memory map for the bootloader. /** Simplified memory map for the bootloader.
* Make sure the bootloader can load into main memory without overwriting itself. * Make sure the bootloader can load into main memory without overwriting itself.
@ -41,19 +43,20 @@
#define DRAM1_BT_SHM_BUFFERS_START 0x3ffe4350 #define DRAM1_BT_SHM_BUFFERS_START 0x3ffe4350
#define DRAM1_BT_SHM_BUFFERS_END 0x3ffe5230 #define DRAM1_BT_SHM_BUFFERS_END 0x3ffe5230
/* Conversion beween IRAM and DRAM in SRAM1 memory */ /* Convert IRAM address to its DRAM counterpart in SRAM1 memory */
#define SRAM1_IRAM_DRAM_CALC(addr_iram) \ #define SRAM1_IRAM_DRAM_CALC(addr_iram) ((addr_iram > SRAM1_IRAM_START) ? \
(SRAM1_SIZE - ((addr_iram) - SRAM1_IRAM_START) + SRAM1_DRAM_START) (SRAM1_SIZE - (addr_iram - SRAM1_IRAM_START) + SRAM1_DRAM_START) : (SRAM1_DRAM_END))
/* Convert DRAM address to its IRAM counterpart in SRAM1 memory */
#define SRAM1_DRAM_IRAM_CALC(addr_dram) \ #define SRAM1_DRAM_IRAM_CALC(addr_dram) \
(SRAM1_SIZE - ((addr_dram) - SRAM1_DRAM_START) + SRAM1_IRAM_START) (SRAM1_SIZE - (addr_dram - SRAM1_DRAM_START) + SRAM1_IRAM_START)
/* For safety margin between bootloader data section and startup stacks */ /* Set bootloader segments size */
#define BOOTLOADER_DRAM_SEG_LEN 0x7a00 #define BOOTLOADER_DRAM_SEG_LEN 0x7a00
#define BOOTLOADER_IRAM_LOADER_SEG_LEN 0x4000 #define BOOTLOADER_IRAM_LOADER_SEG_LEN 0x4000
#define BOOTLOADER_IRAM_SEG_LEN 0xa000 #define BOOTLOADER_IRAM_SEG_LEN 0xa000
/* Start of the lower region is determined by region size and the end of the higher region */ /* Start of the lower region is determined by region size and the end of the higher region */
#define BOOTLOADER_DRAM_SEG_START 0x3fff0000 #define BOOTLOADER_DRAM_SEG_START 0x3ffe8000
#define BOOTLOADER_DRAM_SEG_END (BOOTLOADER_DRAM_SEG_START + BOOTLOADER_DRAM_SEG_LEN) #define BOOTLOADER_DRAM_SEG_END (BOOTLOADER_DRAM_SEG_START + BOOTLOADER_DRAM_SEG_LEN)
#define BOOTLOADER_IRAM_LOADER_SEG_START 0x40078000 #define BOOTLOADER_IRAM_LOADER_SEG_START 0x40078000
#define BOOTLOADER_IRAM_SEG_START 0x400a0000 #define BOOTLOADER_IRAM_SEG_START 0x400a0000