Loading...
 

SW4STM32 and SW4Linux fully supports the STM32MP1 asymmetric multicore Cortex/A7+M4 MPUs

   With System Workbench for Linux, Embedded Linux on the STM32MP1 family of MPUs from ST was never as simple to build and maintain, even for newcomers in the Linux world. And, if you install System Workbench for Linux in System Workbench for STM32 you can seamlessly develop and debug asymmetric applications running partly on Linux, partly on the Cortex-M4.
You can get more information from the ac6-tools website and download (registration required) various documents highlighting:

System Workbench for STM32


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;
}