use STM32F4 CCM memory for the stack and the heap
My changes in linker script and syscalls.c to solve this problem:
xxx.ld
/* Highest address of the user mode stack */
_estack = 0x10004000; /* pointer to stack, stack grows down and at address 0x10000000 we have hard fault exception*/
_Min_Stack_Size = 0x3F80; /* required amount of stack */
_Min_Stack_Ptr = _estack - _Min_Stack_Size; /* used to control out of bounds*/
_Max_Heap_Ptr = 0x20020000;
_Min_Heap_Size = 0; /* required amount of heap used only for error cheking*/
/* Memories definition */
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
CCRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
ROM (rx) : ORIGIN = 0x8000000, LENGTH = 1024K
}
bottom of xxxx.ld:
._user_heap_stack :
{
. = ALIGN(8);
PROVIDE ( end = . );
PROVIDE ( _end = . );
. = . + _Min_Heap_Size;
. = ALIGN(8);
} >RAM
._user_heap_stack_ccm :
{
. = ALIGN(8);
. = . + _Min_Stack_Size;
. = ALIGN(8);
} >CCRAM
and syscalls.c:
caddr_t _sbrk(int incr)
{
extern char end asm(“end”);
extern char _Max_Heap_Ptr asm(“_Max_Heap_Ptr”);
static char *heap_end;
char *prev_heap_end;
if (heap_end == 0)
heap_end = &end;
prev_heap_end = heap_end;
// please check
char * addresToCheck =0;
if (heap_end + incr > &_Max_Heap_Ptr)
{
//Heap collision
while(1) {};
// comment one of this (up or two down lines)
//errno = ENOMEM;
//return (caddr_t) -1;
}
heap_end += incr;
return (caddr_t) prev_heap_end;
}