esp32/esp32_allocateheap.c: Support the maximum available internal heap configuration

This commit is contained in:
chenwen
2021-02-08 17:16:04 +08:00
committed by Xiang Xiao
parent 516c553b97
commit 19627095e4
10 changed files with 124 additions and 38 deletions
+10 -2
View File
@@ -116,7 +116,7 @@ config XTENSA_INTBACKTRACE
---help--- ---help---
Add necessary logic to be able to have a full backtrace from an interrupt context. Add necessary logic to be able to have a full backtrace from an interrupt context.
config XTENSA_USE_SEPARATE_IMEM config XTENSA_IMEM_USE_SEPARATE_HEAP
bool "Use a separate heap for internal memory" bool "Use a separate heap for internal memory"
default n default n
help help
@@ -128,9 +128,17 @@ config XTENSA_USE_SEPARATE_IMEM
This separate heap will be part of the internal DRAM. It starts right after .data This separate heap will be part of the internal DRAM. It starts right after .data
and ends at the configurable size given by the OPTION XTENSA_IMEM_REGION_SIZE. and ends at the configurable size given by the OPTION XTENSA_IMEM_REGION_SIZE.
config XTENSA_IMEM_MAXIMIZE_HEAP_REGION
bool "Use a maximum separate heap for internal memory"
default n
depends on XTENSA_IMEM_USE_SEPARATE_HEAP
help
This separate heap will be part of the internal DRAM. It starts right after .data
and ends at the (HEAP_REGION1_END - HEAP_REGION_OFFSET).
config XTENSA_IMEM_REGION_SIZE config XTENSA_IMEM_REGION_SIZE
hex "DRAM region size for internal use" hex "DRAM region size for internal use"
depends on XTENSA_USE_SEPARATE_IMEM depends on XTENSA_IMEM_USE_SEPARATE_HEAP && !XTENSA_IMEM_MAXIMIZE_HEAP_REGION
default 0x18000 default 0x18000
source arch/xtensa/src/lx6/Kconfig source arch/xtensa/src/lx6/Kconfig
+6 -6
View File
@@ -91,7 +91,7 @@ extern "C"
#define EXTERN extern #define EXTERN extern
#endif #endif
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
struct mallinfo; /* Forward reference, see malloc.h */ struct mallinfo; /* Forward reference, see malloc.h */
/**************************************************************************** /****************************************************************************
@@ -112,7 +112,7 @@ void xtensa_imm_initialize(void);
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_malloc(size_t size); void *xtensa_imm_malloc(size_t size);
/**************************************************************************** /****************************************************************************
* Name: xtensa_imm_calloc * Name: xtensa_imm_calloc
@@ -123,7 +123,7 @@ FAR void *xtensa_imm_malloc(size_t size);
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_calloc(size_t n, size_t elem_size); void *xtensa_imm_calloc(size_t n, size_t elem_size);
/**************************************************************************** /****************************************************************************
* Name: xtensa_imm_realloc * Name: xtensa_imm_realloc
@@ -133,7 +133,7 @@ FAR void *xtensa_imm_calloc(size_t n, size_t elem_size);
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_realloc(void *ptr, size_t size); void *xtensa_imm_realloc(void *ptr, size_t size);
/**************************************************************************** /****************************************************************************
* Name: xtensa_imm_zalloc * Name: xtensa_imm_zalloc
@@ -143,7 +143,7 @@ FAR void *xtensa_imm_realloc(void *ptr, size_t size);
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_zalloc(size_t size); void *xtensa_imm_zalloc(size_t size);
/**************************************************************************** /****************************************************************************
* Name: xtensa_imm_free * Name: xtensa_imm_free
@@ -168,7 +168,7 @@ void xtensa_imm_free(FAR void *mem);
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_memalign(size_t alignment, size_t size); void *xtensa_imm_memalign(size_t alignment, size_t size);
/**************************************************************************** /****************************************************************************
* Name: xtensa_imm_heapmember * Name: xtensa_imm_heapmember
+1 -1
View File
@@ -150,7 +150,7 @@ void up_initialize(void)
/* Initialize the internal heap */ /* Initialize the internal heap */
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
xtensa_imm_initialize(); xtensa_imm_initialize();
#endif #endif
+1 -1
View File
@@ -34,7 +34,7 @@
* Pre-processor Macros * Pre-processor Macros
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
# define UMM_MALLOC(s) xtensa_imm_malloc(s) # define UMM_MALLOC(s) xtensa_imm_malloc(s)
# define UMM_MEMALIGN(a,s) xtensa_imm_memalign(a,s) # define UMM_MEMALIGN(a,s) xtensa_imm_memalign(a,s)
# define UMM_FREE(p) xtensa_imm_free(p) # define UMM_FREE(p) xtensa_imm_free(p)
+1
View File
@@ -285,6 +285,7 @@ config ESP32_SPIRAM
bool "SPI RAM Support" bool "SPI RAM Support"
default n default n
select ARCH_HAVE_HEAP2 select ARCH_HAVE_HEAP2
select XTENSA_IMEM_USE_SEPARATE_HEAP
if ESP32_SPIRAM && SMP if ESP32_SPIRAM && SMP
+1 -1
View File
@@ -103,7 +103,7 @@ endif
CHIP_CSRCS += esp32_rtc.c CHIP_CSRCS += esp32_rtc.c
ifeq ($(CONFIG_XTENSA_USE_SEPARATE_IMEM),y) ifeq ($(CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP),y)
CHIP_CSRCS += esp32_imm.c CHIP_CSRCS += esp32_imm.c
endif endif
+20 -2
View File
@@ -63,7 +63,7 @@
* *
* _sheap eg. 3ffc 8c6c * _sheap eg. 3ffc 8c6c
* : * :
* : g_iheap (CONFIG_XTENSA_USE_SEPARATE_IMEM) * : g_iheap (CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP)
* : * :
* _sheap + CONFIG_XTENSA_IMEM_REGION_SIZE eg. 3ffd ebfc * _sheap + CONFIG_XTENSA_IMEM_REGION_SIZE eg. 3ffd ebfc
* : * :
@@ -87,7 +87,9 @@
* script as "_sheap". Then end is defined here, as follows: * script as "_sheap". Then end is defined here, as follows:
*/ */
#ifndef HEAP_REGION1_END
#define HEAP_REGION1_END 0x3ffdfff0 #define HEAP_REGION1_END 0x3ffdfff0
#endif
/* Region 2 of the heap is the area from the end of the ROM data to the end /* Region 2 of the heap is the area from the end of the ROM data to the end
* of DRAM. The linker script has already set "_eheap" as the end of DRAM, * of DRAM. The linker script has already set "_eheap" as the end of DRAM,
@@ -102,12 +104,23 @@
# define HEAP_REGION2_START 0x3ffe7e40 # define HEAP_REGION2_START 0x3ffe7e40
#endif #endif
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
#define XTENSA_IMEM_REGION_SIZE CONFIG_XTENSA_IMEM_REGION_SIZE #define XTENSA_IMEM_REGION_SIZE CONFIG_XTENSA_IMEM_REGION_SIZE
#else #else
#define XTENSA_IMEM_REGION_SIZE 0 #define XTENSA_IMEM_REGION_SIZE 0
#endif #endif
/* If CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION is defined, it means
* using maximum separate heap for internal memory, but part of
* the available memory is reserved for the Region 1 heap.
*/
#ifdef CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION
#ifndef HEAP_REGION_OFFSET
#define HEAP_REGION_OFFSET 0x2000
#endif
#endif
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
****************************************************************************/ ****************************************************************************/
@@ -130,6 +143,10 @@
void up_allocate_heap(FAR void **heap_start, size_t *heap_size) void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
{ {
board_autoled_on(LED_HEAPALLOCATE); board_autoled_on(LED_HEAPALLOCATE);
#ifdef CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION
*heap_size = (size_t)HEAP_REGION_OFFSET;
*heap_start = (FAR void *)(HEAP_REGION1_END - *heap_size);
#else
*heap_start = (FAR void *)&_sheap + XTENSA_IMEM_REGION_SIZE; *heap_start = (FAR void *)&_sheap + XTENSA_IMEM_REGION_SIZE;
/* If the following DEBUGASSERT fails, /* If the following DEBUGASSERT fails,
@@ -138,6 +155,7 @@ void up_allocate_heap(FAR void **heap_start, size_t *heap_size)
DEBUGASSERT(HEAP_REGION1_END > (uintptr_t)*heap_start); DEBUGASSERT(HEAP_REGION1_END > (uintptr_t)*heap_start);
*heap_size = (size_t)(HEAP_REGION1_END - (uintptr_t)*heap_start); *heap_size = (size_t)(HEAP_REGION1_END - (uintptr_t)*heap_start);
#endif
} }
/**************************************************************************** /****************************************************************************
+43 -7
View File
@@ -31,7 +31,31 @@
#include "xtensa.h" #include "xtensa.h"
#if CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* Region 1 of the heap is the area from the end of the .data section to the
* begining of the ROM data. The start address is defined from the linker
* script as "_sheap". Then end is defined here, as follows:
*/
#ifndef HEAP_REGION1_END
#define HEAP_REGION1_END 0x3ffdfff0
#endif
/* If define CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION, it means
* using maximum separate heap for internal memory, but part of
* the available memory is reserved for the Region 1 heap.
*/
#ifdef CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION
#ifndef HEAP_REGION_OFFSET
#define HEAP_REGION_OFFSET 0x2000
#endif
#endif
/**************************************************************************** /****************************************************************************
* Private Data * Private Data
@@ -57,7 +81,19 @@ void xtensa_imm_initialize(void)
size_t size; size_t size;
start = (FAR void *)&_sheap; start = (FAR void *)&_sheap;
#ifdef CONFIG_XTENSA_IMEM_MAXIMIZE_HEAP_REGION
size_t offset = HEAP_REGION_OFFSET;
size = (size_t)(HEAP_REGION1_END - (uintptr_t)start - offset);
#else
/* If the following DEBUGASSERT fails,
* probably you have too large CONFIG_XTENSA_IMEM_REGION_SIZE.
*/
size = CONFIG_XTENSA_IMEM_REGION_SIZE; size = CONFIG_XTENSA_IMEM_REGION_SIZE;
DEBUGASSERT(HEAP_REGION1_END > ((uintptr_t)start + size));
#endif
mm_initialize(&g_iheap, start, size); mm_initialize(&g_iheap, start, size);
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MEMINFO) #if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MEMINFO)
@@ -78,7 +114,7 @@ void xtensa_imm_initialize(void)
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_malloc(size_t size) void *xtensa_imm_malloc(size_t size)
{ {
return mm_malloc(&g_iheap, size); return mm_malloc(&g_iheap, size);
} }
@@ -92,7 +128,7 @@ FAR void *xtensa_imm_malloc(size_t size)
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_calloc(size_t n, size_t elem_size) void *xtensa_imm_calloc(size_t n, size_t elem_size)
{ {
return mm_calloc(&g_iheap, n, elem_size); return mm_calloc(&g_iheap, n, elem_size);
} }
@@ -105,7 +141,7 @@ FAR void *xtensa_imm_calloc(size_t n, size_t elem_size)
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_realloc(void *ptr, size_t size) void *xtensa_imm_realloc(void *ptr, size_t size)
{ {
return mm_realloc(&g_iheap, ptr, size); return mm_realloc(&g_iheap, ptr, size);
} }
@@ -118,7 +154,7 @@ FAR void *xtensa_imm_realloc(void *ptr, size_t size)
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_zalloc(size_t size) void *xtensa_imm_zalloc(size_t size)
{ {
return mm_zalloc(&g_iheap, size); return mm_zalloc(&g_iheap, size);
} }
@@ -149,7 +185,7 @@ void xtensa_imm_free(FAR void *mem)
* *
****************************************************************************/ ****************************************************************************/
FAR void *xtensa_imm_memalign(size_t alignment, size_t size) void *xtensa_imm_memalign(size_t alignment, size_t size)
{ {
return mm_memalign(&g_iheap, alignment, size); return mm_memalign(&g_iheap, alignment, size);
} }
@@ -187,4 +223,4 @@ int xtensa_imm_mallinfo(FAR struct mallinfo *info)
return mm_mallinfo(&g_iheap, info); return mm_mallinfo(&g_iheap, info);
} }
#endif /* CONFIG_XTENSA_USE_SEPARATE_IMEM */ #endif /* CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP */
+5 -5
View File
@@ -870,14 +870,14 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
uint8_t *rp; uint8_t *rp;
uint32_t n; uint32_t n;
uint32_t regval; uint32_t regval;
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
uint8_t *alloctp; uint8_t *alloctp;
uint8_t *allocrp; uint8_t *allocrp;
#endif #endif
/* If the buffer comes from PSRAM, allocate a new one from DRAM */ /* If the buffer comes from PSRAM, allocate a new one from DRAM */
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
if (esp32_ptr_extram(txbuffer)) if (esp32_ptr_extram(txbuffer))
{ {
alloctp = xtensa_imm_malloc(total); alloctp = xtensa_imm_malloc(total);
@@ -891,7 +891,7 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
tp = (uint8_t *)txbuffer; tp = (uint8_t *)txbuffer;
} }
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
if (esp32_ptr_extram(rxbuffer)) if (esp32_ptr_extram(rxbuffer))
{ {
allocrp = xtensa_imm_malloc(total); allocrp = xtensa_imm_malloc(total);
@@ -963,7 +963,7 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
rp += n; rp += n;
} }
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
if (esp32_ptr_extram(rxbuffer)) if (esp32_ptr_extram(rxbuffer))
{ {
memcpy(rxbuffer, allocrp, total); memcpy(rxbuffer, allocrp, total);
@@ -971,7 +971,7 @@ static void esp32_spi_dma_exchange(FAR struct esp32_spi_priv_s *priv,
} }
#endif #endif
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
if (esp32_ptr_extram(txbuffer)) if (esp32_ptr_extram(txbuffer))
{ {
xtensa_imm_free(alloctp); xtensa_imm_free(alloctp);
+31 -8
View File
@@ -70,6 +70,10 @@
# define NVS_FILE_MODE 0777 # define NVS_FILE_MODE 0777
#endif #endif
#ifndef MIN
# define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
#define WIFI_CONNECT_TIMEOUT CONFIG_ESP32_WIFI_CONNECT_TIMEOUT #define WIFI_CONNECT_TIMEOUT CONFIG_ESP32_WIFI_CONNECT_TIMEOUT
#define TIMER_INITIALIZED_VAL (0x5aa5a55a) #define TIMER_INITIALIZED_VAL (0x5aa5a55a)
@@ -1862,7 +1866,7 @@ static void *esp_malloc(uint32_t size)
static void esp_free(void *ptr) static void esp_free(void *ptr)
{ {
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
if (xtensa_imm_heapmember(ptr)) if (xtensa_imm_heapmember(ptr))
{ {
xtensa_imm_free(ptr); xtensa_imm_free(ptr);
@@ -3438,7 +3442,7 @@ uint32_t esp_log_timestamp(void)
static void *esp_malloc_internal(size_t size) static void *esp_malloc_internal(size_t size)
{ {
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
return xtensa_imm_malloc(size); return xtensa_imm_malloc(size);
#else #else
void *ptr = kmm_malloc(size); void *ptr = kmm_malloc(size);
@@ -3469,16 +3473,35 @@ static void *esp_malloc_internal(size_t size)
static void *esp_realloc_internal(void *ptr, size_t size) static void *esp_realloc_internal(void *ptr, size_t size)
{ {
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
return xtensa_imm_realloc(ptr, size); return xtensa_imm_realloc(ptr, size);
#else #else
if (size == 0 || esp32_ptr_extram(ptr)) void *old_ptr = ptr;
void *new_ptr = NULL;
size_t old_size = 0;
if (size == 0)
{ {
esp_free(ptr); kmm_free(ptr);
return NULL; return NULL;
} }
return kmm_realloc(ptr, size); new_ptr = kmm_malloc(size);
if (new_ptr != NULL)
{
if (esp32_ptr_extram(new_ptr))
{
kmm_free(new_ptr);
return NULL;
}
old_size = malloc_usable_size(old_ptr);
DEBUGASSERT(old_size > 0);
memcpy(new_ptr, old_ptr, MIN(old_size, size));
kmm_free(old_ptr);
return new_ptr;
}
return NULL;
#endif #endif
} }
@@ -3499,7 +3522,7 @@ static void *esp_realloc_internal(void *ptr, size_t size)
static void *esp_calloc_internal(size_t n, size_t size) static void *esp_calloc_internal(size_t n, size_t size)
{ {
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
return xtensa_imm_calloc(n, size); return xtensa_imm_calloc(n, size);
#else #else
void *ptr = kmm_calloc(n, size); void *ptr = kmm_calloc(n, size);
@@ -3529,7 +3552,7 @@ static void *esp_calloc_internal(size_t n, size_t size)
static void *esp_zalloc_internal(size_t size) static void *esp_zalloc_internal(size_t size)
{ {
#ifdef CONFIG_XTENSA_USE_SEPARATE_IMEM #ifdef CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP
return xtensa_imm_zalloc(size); return xtensa_imm_zalloc(size);
#else #else
void *ptr = kmm_zalloc(size); void *ptr = kmm_zalloc(size);