diff --git a/arch/xtensa/src/esp32/Kconfig b/arch/xtensa/src/esp32/Kconfig index 14dfb0f9544..ddcb46d44e9 100644 --- a/arch/xtensa/src/esp32/Kconfig +++ b/arch/xtensa/src/esp32/Kconfig @@ -231,6 +231,10 @@ config ESP32_RUN_IRAM This loads all of NuttX inside IRAM. Used to test somewhat small 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" config ESP32_UART diff --git a/arch/xtensa/src/esp32/Make.defs b/arch/xtensa/src/esp32/Make.defs index 113edd9fab7..6516cfd05bd 100644 --- a/arch/xtensa/src/esp32/Make.defs +++ b/arch/xtensa/src/esp32/Make.defs @@ -97,6 +97,10 @@ ifeq ($(CONFIG_XTENSA_IMEM_USE_SEPARATE_HEAP),y) CHIP_CSRCS += esp32_imm.c endif +ifeq ($(CONFIG_ESP32_RTC_HEAP),y) +CHIP_CSRCS += esp32_rtcheap.c +endif + ifeq ($(CONFIG_ESP32_I2C),y) CHIP_CSRCS += esp32_i2c.c endif diff --git a/arch/xtensa/src/esp32/esp32_rtcheap.c b/arch/xtensa/src/esp32/esp32_rtcheap.c new file mode 100644 index 00000000000..43a12b79de0 --- /dev/null +++ b/arch/xtensa/src/esp32/esp32_rtcheap.c @@ -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 + +#include +#include +#include +#include + +#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); +} diff --git a/arch/xtensa/src/esp32/esp32_rtcheap.h b/arch/xtensa/src/esp32/esp32_rtcheap.h new file mode 100644 index 00000000000..e235fdabb0a --- /dev/null +++ b/arch/xtensa/src/esp32/esp32_rtcheap.h @@ -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 */ diff --git a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32.template.ld b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32.template.ld index 6ca7f461352..e37e49cdff2 100644 --- a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32.template.ld +++ b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32.template.ld @@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM; /* Text heap ends at top of dram0_0_seg */ _etextheap = 0x400a0000; + +/* Mark the end of the RTC heap (top of the RTC region) */ + +_ertcheap = 0x50001fff; diff --git a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_flash.ld index cd1d4a81825..56e4b9f91cb 100644 --- a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_flash.ld @@ -215,5 +215,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg } diff --git a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_iram.ld b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_iram.ld index 65b6823255a..672972b184a 100644 --- a/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_iram.ld +++ b/boards/xtensa/esp32/esp32-devkitc/scripts/esp32_iram.ld @@ -192,5 +192,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg } diff --git a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32.template.ld b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32.template.ld index f9f551294e9..35d9c3ddb6a 100644 --- a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32.template.ld +++ b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32.template.ld @@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM; /* Text heap ends at top of dram0_0_seg */ _etextheap = 0x400a0000; + +/* Mark the end of the RTC heap (top of the RTC region) */ + +_ertcheap = 0x50001fff; diff --git a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_flash.ld index a8515422f19..c1dfdd14fd7 100644 --- a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_flash.ld @@ -217,5 +217,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg } diff --git a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_iram.ld b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_iram.ld index 05e7d754958..927e177ff54 100644 --- a/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_iram.ld +++ b/boards/xtensa/esp32/esp32-ethernet-kit/scripts/esp32_iram.ld @@ -192,5 +192,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg } diff --git a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32.template.ld b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32.template.ld index f55138a719f..7745cebc12b 100644 --- a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32.template.ld +++ b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32.template.ld @@ -81,3 +81,7 @@ _eheap = 0x40000000 - CONFIG_ESP32_TRACEMEM_RESERVE_DRAM; /* Text heap ends at top of dram0_0_seg */ _etextheap = 0x400a0000; + +/* Mark the end of the RTC heap (top of the RTC region) */ + +_ertcheap = 0x50001fff; diff --git a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_flash.ld b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_flash.ld index a56b542adb5..ec4e40056a3 100644 --- a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_flash.ld +++ b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_flash.ld @@ -217,5 +217,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg } diff --git a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_iram.ld b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_iram.ld index b43ea8f348c..613ac15a846 100644 --- a/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_iram.ld +++ b/boards/xtensa/esp32/esp32-wrover-kit/scripts/esp32_iram.ld @@ -192,5 +192,10 @@ SECTIONS { *(.rtc.data) *(.rtc.rodata) + + /* Whatever is left from the RTC memory is used as a special heap. */ + + . = ALIGN (4); + _srtcheap = ABSOLUTE(.); } > rtc_slow_seg }