mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #48 from adamgreen/gccRetargetSbrk
gcc: Provide _sbrk implementation compatible with RTXpull/62/head
commit
45565cb055
|
@ -425,3 +425,30 @@ extern "C" void __iar_argc_argv() {
|
||||||
mbed_main();
|
mbed_main();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Provide implementation of _sbrk (low-level dynamic memory allocation
|
||||||
|
// routine) for GCC_ARM which compares new heap pointer with MSP instead of
|
||||||
|
// SP. This make it compatible with RTX RTOS thread stacks.
|
||||||
|
#if defined(TOOLCHAIN_GCC_ARM)
|
||||||
|
// Linker defined symbol used by _sbrk to indicate where heap should start.
|
||||||
|
extern "C" int __end__;
|
||||||
|
|
||||||
|
// Turn off the errno macro and use actual global variable instead.
|
||||||
|
#undef errno
|
||||||
|
extern "C" int errno;
|
||||||
|
|
||||||
|
// Dynamic memory allocation related syscall.
|
||||||
|
extern "C" caddr_t _sbrk(int incr) {
|
||||||
|
static unsigned char* heap = (unsigned char*)&__end__;
|
||||||
|
unsigned char* prev_heap = heap;
|
||||||
|
unsigned char* new_heap = heap + incr;
|
||||||
|
|
||||||
|
if (new_heap >= (unsigned char*)__get_MSP()) {
|
||||||
|
errno = ENOMEM;
|
||||||
|
return (caddr_t)-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
heap = new_heap;
|
||||||
|
return (caddr_t) prev_heap;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue