forked from espressif/esp-idf
heap_tlsf: use tlsf IMPL in ESP32C2 ROM
This commit is contained in:
committed by
wuzhenghui
parent
a9f8b20431
commit
6ec373daf5
@@ -195,6 +195,10 @@ else() # Regular app build
|
|||||||
# only link them if the toolchain is also using 32-bit time_t and nano formatting was requested.
|
# only link them if the toolchain is also using 32-bit time_t and nano formatting was requested.
|
||||||
rom_linker_script("newlib-nano")
|
rom_linker_script("newlib-nano")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_HEAP_ROM_IMPL)
|
||||||
|
rom_linker_script("heap")
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(CONFIG_IDF_TARGET_ARCH_XTENSA)
|
if(CONFIG_IDF_TARGET_ARCH_XTENSA)
|
||||||
|
@@ -256,7 +256,7 @@ PROVIDE( multi_heap_get_block_address_impl = 0x40000330 );
|
|||||||
PROVIDE( multi_heap_get_allocated_size_impl = 0x40000334 );
|
PROVIDE( multi_heap_get_allocated_size_impl = 0x40000334 );
|
||||||
PROVIDE( multi_heap_register_impl = 0x40000338 );
|
PROVIDE( multi_heap_register_impl = 0x40000338 );
|
||||||
PROVIDE( multi_heap_set_lock = 0x4000033c );
|
PROVIDE( multi_heap_set_lock = 0x4000033c );
|
||||||
PROVIDE( multi_heap_mutex_init = 0x40000340 );
|
PROVIDE( multi_heap_os_funcs_init = 0x40000340 );
|
||||||
PROVIDE( multi_heap_internal_lock = 0x40000344 );
|
PROVIDE( multi_heap_internal_lock = 0x40000344 );
|
||||||
PROVIDE( multi_heap_internal_unlock = 0x40000348 );
|
PROVIDE( multi_heap_internal_unlock = 0x40000348 );
|
||||||
PROVIDE( multi_heap_get_first_block = 0x4000034c );
|
PROVIDE( multi_heap_get_first_block = 0x4000034c );
|
||||||
|
@@ -1,8 +1,11 @@
|
|||||||
set(srcs
|
set(srcs
|
||||||
"heap_caps.c"
|
"heap_caps.c"
|
||||||
"heap_caps_init.c"
|
"heap_caps_init.c"
|
||||||
"multi_heap.c"
|
"multi_heap.c")
|
||||||
"heap_tlsf.c")
|
|
||||||
|
if(NOT CONFIG_HEAP_ROM_IMPL)
|
||||||
|
list(APPEND srcs "heap_tlsf.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT CONFIG_HEAP_POISONING_DISABLED)
|
if(NOT CONFIG_HEAP_POISONING_DISABLED)
|
||||||
list(APPEND srcs "multi_heap_poisoning.c")
|
list(APPEND srcs "multi_heap_poisoning.c")
|
||||||
|
@@ -71,4 +71,21 @@ menu "Heap memory debugging"
|
|||||||
help
|
help
|
||||||
When enabled, if a memory allocation operation fails it will cause a system abort.
|
When enabled, if a memory allocation operation fails it will cause a system abort.
|
||||||
|
|
||||||
|
config HEAP_HAS_ROM_IMPL
|
||||||
|
bool
|
||||||
|
default y if IDF_TARGET_ESP32C2
|
||||||
|
|
||||||
|
config HEAP_ROM_IMPL
|
||||||
|
bool "Use heap implementation in ROM"
|
||||||
|
depends on HEAP_HAS_ROM_IMPL
|
||||||
|
default y
|
||||||
|
help
|
||||||
|
Enable this flag to use heap functions from ROM instead of ESP-IDF.
|
||||||
|
|
||||||
|
If keeping this as "n" in your project, you will have less free IRAM.
|
||||||
|
If making this as "y" in your project, you will increase free IRAM,
|
||||||
|
but you will lose the possibility to debug this module, and some new
|
||||||
|
features will be added and bugs will be fixed in the IDF source
|
||||||
|
but cannot be synced to ROM.
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
@@ -49,6 +49,10 @@ void heap_caps_enable_nonos_stack_heaps(void)
|
|||||||
*/
|
*/
|
||||||
void heap_caps_init(void)
|
void heap_caps_init(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_HEAP_ROM_IMPL
|
||||||
|
extern void multi_heap_in_rom_init(void);
|
||||||
|
multi_heap_in_rom_init();
|
||||||
|
#endif
|
||||||
/* Get the array of regions that we can use for heaps
|
/* Get the array of regions that we can use for heaps
|
||||||
(with reserved memory removed already.)
|
(with reserved memory removed already.)
|
||||||
*/
|
*/
|
||||||
|
@@ -127,6 +127,9 @@ void tlsf_walk_pool(pool_t pool, tlsf_walker walker, void* user);
|
|||||||
int tlsf_check(tlsf_t tlsf);
|
int tlsf_check(tlsf_t tlsf);
|
||||||
int tlsf_check_pool(pool_t pool);
|
int tlsf_check_pool(pool_t pool);
|
||||||
|
|
||||||
|
/* Used for heap tlsf in ROM IMPL */
|
||||||
|
void tlsf_poison_fill_pfunc_set(void *pfunc);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -1,7 +1,8 @@
|
|||||||
[mapping:heap]
|
[mapping:heap]
|
||||||
archive: libheap.a
|
archive: libheap.a
|
||||||
entries:
|
entries:
|
||||||
heap_tlsf (noflash)
|
if HEAP_HAS_ROM_IMPL = n || HEAP_ROM_IMPL = n:
|
||||||
|
heap_tlsf (noflash)
|
||||||
multi_heap (noflash)
|
multi_heap (noflash)
|
||||||
if HEAP_POISONING_DISABLED = n:
|
if HEAP_POISONING_DISABLED = n:
|
||||||
multi_heap_poisoning (noflash)
|
multi_heap_poisoning (noflash)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2015-2021 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
#include "heap_tlsf.h"
|
#include "heap_tlsf.h"
|
||||||
#include <multi_heap.h>
|
#include "multi_heap.h"
|
||||||
#include "multi_heap_internal.h"
|
#include "multi_heap_internal.h"
|
||||||
|
|
||||||
/* Note: Keep platform-specific parts in this header, this source
|
/* Note: Keep platform-specific parts in this header, this source
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
/* Defines compile-time configuration macros */
|
/* Defines compile-time configuration macros */
|
||||||
#include "multi_heap_config.h"
|
#include "multi_heap_config.h"
|
||||||
|
|
||||||
#ifndef MULTI_HEAP_POISONING
|
#if (!defined MULTI_HEAP_POISONING) && (!defined CONFIG_HEAP_ROM_IMPL)
|
||||||
/* if no heap poisoning, public API aliases directly to these implementations */
|
/* if no heap poisoning, public API aliases directly to these implementations */
|
||||||
void *multi_heap_malloc(multi_heap_handle_t heap, size_t size)
|
void *multi_heap_malloc(multi_heap_handle_t heap, size_t size)
|
||||||
__attribute__((alias("multi_heap_malloc_impl")));
|
__attribute__((alias("multi_heap_malloc_impl")));
|
||||||
@@ -77,6 +77,30 @@ typedef struct multi_heap_info {
|
|||||||
tlsf_t heap_data;
|
tlsf_t heap_data;
|
||||||
} heap_t;
|
} heap_t;
|
||||||
|
|
||||||
|
#ifdef CONFIG_HEAP_ROM_IMPL
|
||||||
|
|
||||||
|
void _multi_heap_lock(void *lock)
|
||||||
|
{
|
||||||
|
MULTI_HEAP_LOCK(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _multi_heap_unlock(void *lock)
|
||||||
|
{
|
||||||
|
MULTI_HEAP_UNLOCK(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
multi_heap_os_funcs_t multi_heap_os_funcs = {
|
||||||
|
.lock = _multi_heap_lock,
|
||||||
|
.unlock = _multi_heap_unlock,
|
||||||
|
};
|
||||||
|
|
||||||
|
void multi_heap_in_rom_init(void)
|
||||||
|
{
|
||||||
|
multi_heap_os_funcs_init(&multi_heap_os_funcs);
|
||||||
|
}
|
||||||
|
|
||||||
|
#else //#ifndef CONFIG_HEAP_ROM_IMPL
|
||||||
|
|
||||||
/* Return true if this block is free. */
|
/* Return true if this block is free. */
|
||||||
static inline bool is_free(const block_header_t *block)
|
static inline bool is_free(const block_header_t *block)
|
||||||
{
|
{
|
||||||
@@ -201,7 +225,6 @@ void *multi_heap_malloc_impl(multi_heap_handle_t heap, size_t size)
|
|||||||
|
|
||||||
void multi_heap_free_impl(multi_heap_handle_t heap, void *p)
|
void multi_heap_free_impl(multi_heap_handle_t heap, void *p)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (heap == NULL || p == NULL) {
|
if (heap == NULL || p == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -380,3 +403,4 @@ void multi_heap_get_info_impl(multi_heap_handle_t heap, multi_heap_info_t *info)
|
|||||||
}
|
}
|
||||||
multi_heap_internal_unlock(heap);
|
multi_heap_internal_unlock(heap);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@@ -1,18 +1,26 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// 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.
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
/* Define a structure that contains some function pointers that point to OS-related functions.
|
||||||
|
An instance of this structure will be provided to the heap in ROM for use if needed.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
void (*lock)(void *lock);
|
||||||
|
void (*unlock)(void *lock);
|
||||||
|
} multi_heap_os_funcs_t;
|
||||||
|
|
||||||
|
/** @brief Initialize structure pointer that points a structure that contains OS-related functions pointers.
|
||||||
|
*
|
||||||
|
* @param heap_os_funcs Points to a structure that contains some OS-related function pointers.
|
||||||
|
* @return None.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void multi_heap_os_funcs_init(multi_heap_os_funcs_t *heap_os_funcs);
|
||||||
|
|
||||||
/* Opaque handle to a heap block */
|
/* Opaque handle to a heap block */
|
||||||
typedef const struct block_header_t *multi_heap_block_handle_t;
|
typedef const struct block_header_t *multi_heap_block_handle_t;
|
||||||
|
|
||||||
|
@@ -1,16 +1,8 @@
|
|||||||
// Copyright 2015-2016 Espressif Systems (Shanghai) PTE LTD
|
/*
|
||||||
//
|
* SPDX-FileCopyrightText: 2015-2022 Espressif Systems (Shanghai) CO LTD
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
*
|
||||||
// you may not use this file except in compliance with the License.
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
// 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.
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -29,6 +21,8 @@
|
|||||||
/* Defines compile-time configuration macros */
|
/* Defines compile-time configuration macros */
|
||||||
#include "multi_heap_config.h"
|
#include "multi_heap_config.h"
|
||||||
|
|
||||||
|
#include "heap_tlsf.h"
|
||||||
|
|
||||||
#ifdef MULTI_HEAP_POISONING
|
#ifdef MULTI_HEAP_POISONING
|
||||||
|
|
||||||
/* Alias MULTI_HEAP_POISONING_SLOW to SLOW for better readabilty */
|
/* Alias MULTI_HEAP_POISONING_SLOW to SLOW for better readabilty */
|
||||||
@@ -339,6 +333,9 @@ multi_heap_handle_t multi_heap_register(void *start, size_t size)
|
|||||||
if (start != NULL) {
|
if (start != NULL) {
|
||||||
memset(start, FREE_FILL_PATTERN, size);
|
memset(start, FREE_FILL_PATTERN, size);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_HEAP_ROM_IMPL
|
||||||
|
tlsf_poison_fill_pfunc_set(multi_heap_internal_poison_fill_region);
|
||||||
#endif
|
#endif
|
||||||
return multi_heap_register_impl(start, size);
|
return multi_heap_register_impl(start, size);
|
||||||
}
|
}
|
||||||
|
@@ -946,8 +946,6 @@ components/heap/include/esp_heap_task_info.h
|
|||||||
components/heap/include/esp_heap_trace.h
|
components/heap/include/esp_heap_trace.h
|
||||||
components/heap/include/heap_memory_layout.h
|
components/heap/include/heap_memory_layout.h
|
||||||
components/heap/multi_heap_config.h
|
components/heap/multi_heap_config.h
|
||||||
components/heap/multi_heap_internal.h
|
|
||||||
components/heap/multi_heap_poisoning.c
|
|
||||||
components/heap/test/test_aligned_alloc_caps.c
|
components/heap/test/test_aligned_alloc_caps.c
|
||||||
components/heap/test/test_allocator_timings.c
|
components/heap/test/test_allocator_timings.c
|
||||||
components/heap/test/test_diram.c
|
components/heap/test/test_diram.c
|
||||||
|
Reference in New Issue
Block a user