Skip to content

Commit 45565cb

Browse files
committed
Merge pull request #48 from adamgreen/gccRetargetSbrk
gcc: Provide _sbrk implementation compatible with RTX
2 parents 42e27e7 + 9e6d168 commit 45565cb

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

libraries/mbed/common/retarget.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,3 +425,30 @@ extern "C" void __iar_argc_argv() {
425425
mbed_main();
426426
}
427427
#endif
428+
429+
// Provide implementation of _sbrk (low-level dynamic memory allocation
430+
// routine) for GCC_ARM which compares new heap pointer with MSP instead of
431+
// SP. This make it compatible with RTX RTOS thread stacks.
432+
#if defined(TOOLCHAIN_GCC_ARM)
433+
// Linker defined symbol used by _sbrk to indicate where heap should start.
434+
extern "C" int __end__;
435+
436+
// Turn off the errno macro and use actual global variable instead.
437+
#undef errno
438+
extern "C" int errno;
439+
440+
// Dynamic memory allocation related syscall.
441+
extern "C" caddr_t _sbrk(int incr) {
442+
static unsigned char* heap = (unsigned char*)&__end__;
443+
unsigned char* prev_heap = heap;
444+
unsigned char* new_heap = heap + incr;
445+
446+
if (new_heap >= (unsigned char*)__get_MSP()) {
447+
errno = ENOMEM;
448+
return (caddr_t)-1;
449+
}
450+
451+
heap = new_heap;
452+
return (caddr_t) prev_heap;
453+
}
454+
#endif

0 commit comments

Comments
 (0)