arch/xtensa/esp32: Add the RTC Slow memory as a separate heap.

This memory region can be accessed by both I & D buses, so the heap can
be used for data storage and code execution.

Signed-off-by: Abdelatif Guettouche <abdelatif.guettouche@espressif.com>
This commit is contained in:
Abdelatif Guettouche
2021-06-18 17:03:39 +01:00
committed by Masayuki Ishikawa
parent 6582c19904
commit 1719e9df94
13 changed files with 400 additions and 0 deletions
+4
View File
@@ -231,6 +231,10 @@ config ESP32_RUN_IRAM
This loads all of NuttX inside IRAM. Used to test somewhat small This loads all of NuttX inside IRAM. Used to test somewhat small
images that can fit entirely in IRAM. images that can fit entirely in IRAM.
config ESP32_RTC_HEAP
bool "Use the RTC memory as a separate heap"
default n
menu "ESP32 Peripheral Selection" menu "ESP32 Peripheral Selection"
config ESP32_UART config ESP32_UART
+4
View File
@@ -97,6 +97,10 @@ ifeq ($(CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP),y)
CHIP_CSRCS += esp32_imm.c CHIP_CSRCS += esp32_imm.c
endif endif
ifeq ($(CONFIG_ESP32_RTC_HEAP),y)
CHIP_CSRCS += esp32_rtcheap.c
endif
ifeq ($(CONFIG_ESP32_I2C),y) ifeq ($(CONFIG_ESP32_I2C),y)
CHIP_CSRCS += esp32_i2c.c CHIP_CSRCS += esp32_i2c.c
endif endif
+201
View File
@@ -0,0 +1,201 @@
/****************************************************************************
* arch/xtensa/src/esp32/esp32_rtcheap.c
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <nuttx/arch.h>
#include <nuttx/fs/procfs.h>
#include <nuttx/mm/mm.h>
#include <malloc.h>
#include "esp32_rtcheap.h"
/****************************************************************************
* Private Data
****************************************************************************/
static struct mm_heap_s g_rtcheap;
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: esp32_rtcheap_initialize
*
* Description:
* Initialize the RTC heap.
*
****************************************************************************/
void esp32_rtcheap_initialize(void)
{
void *start;
size_t size;
/* These values come from the linker scripts. Check boards/xtensa/esp32. */
extern uint8_t *_srtcheap;
extern uint8_t *_ertcheap;
start = (void *)&_srtcheap;
size = (size_t)((uintptr_t)&_ertcheap - (uintptr_t)&_srtcheap);
mm_initialize(&g_rtcheap, start, size);
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MEMINFO)
static struct procfs_meminfo_entry_s g_rtc_procfs;
g_rtc_procfs.name = "rtcheap";
g_rtc_procfs.mallinfo = (void *)mm_mallinfo;
g_rtc_procfs.user_data = &g_rtcheap;
procfs_register_meminfo(&g_rtc_procfs);
#endif
}
/****************************************************************************
* Name: esp32_rtcheap_malloc
*
* Description:
* Allocate memory from the RTC heap.
*
* Parameters:
* size - Size (in bytes) of the memory region to be allocated.
*
****************************************************************************/
void *esp32_rtcheap_malloc(size_t size)
{
return mm_malloc(&g_rtcheap, size);
}
/****************************************************************************
* Name: esp32_rtcheap_calloc
*
* Description:
* Calculates the size of the allocation and allocate memory from
* the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_calloc(size_t n, size_t elem_size)
{
return mm_calloc(&g_rtcheap, n, elem_size);
}
/****************************************************************************
* Name: esp32_rtcheap_realloc
*
* Description:
* Reallocate memory from the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_realloc(void *ptr, size_t size)
{
return mm_realloc(&g_rtcheap, ptr, size);
}
/****************************************************************************
* Name: esp32_rtcheap_zalloc
*
* Description:
* Allocate and zero memory from the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_zalloc(size_t size)
{
return mm_zalloc(&g_rtcheap, size);
}
/****************************************************************************
* Name: esp32_rtcheap_free
*
* Description:
* Free memory from the RTC heap.
*
****************************************************************************/
void esp32_rtcheap_free(void *mem)
{
mm_free(&g_rtcheap, mem);
}
/****************************************************************************
* Name: esp32_rtcheap_memalign
*
* Description:
* memalign requests more than enough space from malloc, finds a region
* within that chunk that meets the alignment request and then frees any
* leading or trailing space.
*
* The alignment argument must be a power of two (not checked). 8-byte
* alignment is guaranteed by normal malloc calls.
*
* Parameters:
* alignment - Requested alignment.
* size - Size (in bytes) of the memory region to be allocated.
*
****************************************************************************/
void *esp32_rtcheap_memalign(size_t alignment, size_t size)
{
return mm_memalign(&g_rtcheap, alignment, size);
}
/****************************************************************************
* Name: esp32_rtcheap_heapmember
*
* Description:
* Check if an address lies in the RTC heap.
*
* Parameters:
* mem - The address to check.
*
* Return Value:
* True if the address is a member of the RTC heap. False if not.
*
****************************************************************************/
bool esp32_rtcheap_heapmember(void *mem)
{
return mm_heapmember(&g_rtcheap, mem);
}
/****************************************************************************
* Name: esp32_rtcheap_mallinfo
*
* Description:
* mallinfo returns a copy of updated current heap information for the
* user heap.
*
* Parameters:
* info - Where memory information will be copied.
*
****************************************************************************/
int esp32_rtcheap_mallinfo(struct mallinfo *info)
{
return mm_mallinfo(&g_rtcheap, info);
}
+149
View File
@@ -0,0 +1,149 @@
/****************************************************************************
* arch/xtensa/src/esp32/esp32_rtcheap.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __ARCH_XTENSA_SRC_ESP32_ESP32_RTCHEAP_H
#define __ARCH_XTENSA_SRC_ESP32_ESP32_RTCHEAP_H
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
#ifdef __cplusplus
#define EXTERN extern "C"
extern "C"
{
#else
#define EXTERN extern
#endif
struct mallinfo; /* Forward reference, see malloc.h */
/****************************************************************************
* Name: esp32_rtcheap_initialize
*
* Description:
* Initialize the RTC heap.
*
****************************************************************************/
void esp32_rtcheap_initialize(void);
/****************************************************************************
* Name: esp32_rtcheap_malloc
*
* Description:
* Allocate memory from the RTC heap.
*
* Parameters:
* size - Size (in bytes) of the memory region to be allocated.
*
****************************************************************************/
void *esp32_rtcheap_malloc(size_t size);
/****************************************************************************
* Name: esp32_rtcheap_calloc
*
* Description:
* Calculates the size of the allocation and allocate memory from
* the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_calloc(size_t n, size_t elem_size);
/****************************************************************************
* Name: esp32_rtcheap_realloc
*
* Description:
* Reallocate memory from the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_realloc(void *ptr, size_t size);
/****************************************************************************
* Name: esp32_rtcheap_zalloc
*
* Description:
* Allocate and zero memory from the RTC heap.
*
****************************************************************************/
void *esp32_rtcheap_zalloc(size_t size);
/****************************************************************************
* Name: esp32_rtcheap_free
*
* Description:
* Free memory from the RTC heap.
*
****************************************************************************/
void esp32_rtcheap_free(void *mem);
/****************************************************************************
* Name: esp32_rtcheap_memalign
*
* Description:
* memalign requests more than enough space from malloc, finds a region
* within that chunk that meets the alignment request and then frees any
* leading or trailing space.
*
* The alignment argument must be a power of two (not checked). 8-byte
* alignment is guaranteed by normal malloc calls.
*
****************************************************************************/
void *esp32_rtcheap_memalign(size_t alignment, size_t size);
/****************************************************************************
* Name: esp32_rtcheap_heapmember
*
* Description:
* Check if an address lies in the RTC heap.
*
* Parameters:
* mem - The address to check
*
* Return Value:
* True if the address is a member of the RTC heap. False if not.
*
****************************************************************************/
bool esp32_rtcheap_heapmember(void *mem);
/****************************************************************************
* Name: esp32_rtcheap_mallinfo
*
* Description:
* mallinfo returns a copy of updated current heap information for the
* user heap.
*
****************************************************************************/
int esp32_rtcheap_mallinfo(struct mallinfo *info);
#undef EXTERN
#ifdef __cplusplus
}
#endif
#endif /* __ARCH_XTENSA_SRC_ESP32_ESP32_RTCHEAP_H */
@@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM;
/* Text heap ends at top of dram0_0_seg */ /* Text heap ends at top of dram0_0_seg */
_etextheap = 0x400a0000; _etextheap = 0x400a0000;
/* Mark the end of the RTC heap (top of the RTC region) */
_ertcheap = 0x50001fff;
@@ -215,5 +215,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }
@@ -192,5 +192,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }
@@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM;
/* Text heap ends at top of dram0_0_seg */ /* Text heap ends at top of dram0_0_seg */
_etextheap = 0x400a0000; _etextheap = 0x400a0000;
/* Mark the end of the RTC heap (top of the RTC region) */
_ertcheap = 0x50001fff;
@@ -217,5 +217,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }
@@ -192,5 +192,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }
@@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM;
/* Text heap ends at top of dram0_0_seg */ /* Text heap ends at top of dram0_0_seg */
_etextheap = 0x400a0000; _etextheap = 0x400a0000;
/* Mark the end of the RTC heap (top of the RTC region) */
_ertcheap = 0x50001fff;
@@ -217,5 +217,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }
@@ -192,5 +192,10 @@ SECTIONS
{ {
*(.rtc.data) *(.rtc.data)
*(.rtc.rodata) *(.rtc.rodata)
/* Whatever is left from the RTC memory is used as a special heap. */
. = ALIGN (4);
_srtcheap = ABSOLUTE(.);
} > rtc_slow_seg } > rtc_slow_seg
} }