[FL-1609] Redirected malloc, calloc, realloc and free functions from newlib to freertos heap. (#604)

* Core: newlib-nano heap management functions replaced with freertos functions
* Core: replace newlib heap management functions for firmware only, not for bootloader
* Core, Linker: automatically determine available heap size at linking.

Co-authored-by: あく <alleteam@gmail.com>
This commit is contained in:
SG 2021-07-25 22:37:43 +10:00 committed by GitHub
parent 81080a3a8b
commit 653295df6f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 35 additions and 17 deletions

View File

@ -67,3 +67,22 @@ size_t memmgr_get_free_heap(void) {
size_t memmgr_get_minimum_free_heap(void) { size_t memmgr_get_minimum_free_heap(void) {
return xPortGetMinimumEverFreeHeapSize(); return xPortGetMinimumEverFreeHeapSize();
} }
void* __wrap__malloc_r(struct _reent* r, size_t size) {
void* pointer = malloc(size);
return pointer;
}
void __wrap__free_r(struct _reent* r, void* ptr) {
free(ptr);
}
void* __wrap__calloc_r(struct _reent* r, size_t count, size_t size) {
void* pointer = calloc(count, size);
return pointer;
}
void* __wrap__realloc_r(struct _reent* r, void* ptr, size_t size) {
void* pointer = realloc(ptr, size);
return pointer;
}

View File

@ -59,14 +59,10 @@ task.h is included from an application file. */
/* Assumes 8bit bytes! */ /* Assumes 8bit bytes! */
#define heapBITS_PER_BYTE ((size_t)8) #define heapBITS_PER_BYTE ((size_t)8)
/* Allocate the memory for the heap. */ /* Heap start end symbols provided by linker */
#if(configAPPLICATION_ALLOCATED_HEAP == 1) extern const void __heap_start__;
/* The application writer has already defined the array used for the RTOS extern const void __heap_end__;
heap - probably so it can be placed in a special segment or address. */ uint8_t* ucHeap = (uint8_t*)&__heap_start__;
extern uint8_t ucHeap[configTOTAL_HEAP_SIZE];
#else
static uint8_t ucHeap[configTOTAL_HEAP_SIZE];
#endif /* configAPPLICATION_ALLOCATED_HEAP */
/* Define the linked list structure. This is used to link free blocks in order /* Define the linked list structure. This is used to link free blocks in order
of their memory address. */ of their memory address. */
@ -421,7 +417,7 @@ static void prvHeapInit(void) {
BlockLink_t* pxFirstFreeBlock; BlockLink_t* pxFirstFreeBlock;
uint8_t* pucAlignedHeap; uint8_t* pucAlignedHeap;
size_t uxAddress; size_t uxAddress;
size_t xTotalHeapSize = configTOTAL_HEAP_SIZE; size_t xTotalHeapSize = (size_t)&__heap_end__ - (size_t)&__heap_start__;
/* Ensure the heap starts on a correctly aligned boundary. */ /* Ensure the heap starts on a correctly aligned boundary. */
uxAddress = (size_t)ucHeap; uxAddress = (size_t)ucHeap;

View File

@ -2,6 +2,7 @@ PROJECT_ROOT = $(abspath $(dir $(abspath $(firstword $(MAKEFILE_LIST))))..)
PROJECT = firmware PROJECT = firmware
include $(PROJECT_ROOT)/make/base.mk include $(PROJECT_ROOT)/make/base.mk
include $(PROJECT_ROOT)/make/freertos-heap.mk
include $(PROJECT_ROOT)/assets/assets.mk include $(PROJECT_ROOT)/assets/assets.mk
include $(PROJECT_ROOT)/core/core.mk include $(PROJECT_ROOT)/core/core.mk
include $(PROJECT_ROOT)/applications/applications.mk include $(PROJECT_ROOT)/applications/applications.mk

View File

@ -69,7 +69,8 @@
#define configTICK_RATE_HZ ((TickType_t)1024) #define configTICK_RATE_HZ ((TickType_t)1024)
#define configMAX_PRIORITIES ( 56 ) #define configMAX_PRIORITIES ( 56 )
#define configMINIMAL_STACK_SIZE ((uint16_t)128) #define configMINIMAL_STACK_SIZE ((uint16_t)128)
#define configTOTAL_HEAP_SIZE ((size_t)131072) /* Heap size determined automatically by linker */
// #define configTOTAL_HEAP_SIZE ((size_t)0)
#define configMAX_TASK_NAME_LEN ( 16 ) #define configMAX_TASK_NAME_LEN ( 16 )
#define configGENERATE_RUN_TIME_STATS 0 #define configGENERATE_RUN_TIME_STATS 0
#define configUSE_TRACE_FACILITY 1 #define configUSE_TRACE_FACILITY 1

View File

@ -161,9 +161,9 @@ SECTIONS
._user_heap_stack : ._user_heap_stack :
{ {
. = ALIGN(8); . = ALIGN(8);
PROVIDE ( end = . ); __heap_start__ = .;
PROVIDE ( _end = . ); . = ORIGIN(RAM1) + LENGTH(RAM1) - _Min_Stack_Size;
. = . + _Min_Heap_Size; __heap_end__ = .;
. = . + _Min_Stack_Size; . = . + _Min_Stack_Size;
. = ALIGN(8); . = ALIGN(8);
} >RAM1 } >RAM1

View File

@ -161,9 +161,9 @@ SECTIONS
._user_heap_stack : ._user_heap_stack :
{ {
. = ALIGN(8); . = ALIGN(8);
PROVIDE ( end = . ); __heap_start__ = .;
PROVIDE ( _end = . ); . = ORIGIN(RAM1) + LENGTH(RAM1) - _Min_Stack_Size;
. = . + _Min_Heap_Size; __heap_end__ = .;
. = . + _Min_Stack_Size; . = . + _Min_Stack_Size;
. = ALIGN(8); . = ALIGN(8);
} >RAM1 } >RAM1

1
make/freertos-heap.mk Normal file
View File

@ -0,0 +1 @@
LDFLAGS += -Wl,--wrap,_malloc_r -Wl,--wrap,_free_r -Wl,--wrap,_calloc_r -Wl,--wrap,_realloc_r

View File

@ -27,4 +27,4 @@ endif
CFLAGS += -fdata-sections -ffunction-sections -fno-math-errno -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)" CFLAGS += -fdata-sections -ffunction-sections -fno-math-errno -fstack-usage -MMD -MP -MF"$(@:%.o=%.d)"
CPPFLAGS += -fno-threadsafe-statics -fno-use-cxa-atexit -fno-exceptions -fno-rtti CPPFLAGS += -fno-threadsafe-statics -fno-use-cxa-atexit -fno-exceptions -fno-rtti
LDFLAGS += -Wl,-Map=$(OBJ_DIR)/$(PROJECT).map,--cref -Wl,--gc-sections -Wl,--undefined=uxTopUsedPriority -u _printf_float LDFLAGS += -Wl,-Map=$(OBJ_DIR)/$(PROJECT).map,--cref -Wl,--gc-sections -Wl,--undefined=uxTopUsedPriority -u _printf_float