Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic
Fork of mbed-src by
Diff: common/retarget.cpp
- Revision:
- 20:4263a77256ae
- Parent:
- 13:0645d8841f51
- Child:
- 23:8d50de55f208
diff -r 398f4c622e1b -r 4263a77256ae common/retarget.cpp --- a/common/retarget.cpp Mon Aug 19 18:17:02 2013 +0300 +++ b/common/retarget.cpp Tue Sep 10 15:14:19 2013 +0300 @@ -163,7 +163,9 @@ } else { FilePath path(name); - if (path.isFile()) { + if (!path.exists()) + return -1; + else if (path.isFile()) { res = path.file(); } else { FileSystemLike *fs = path.fileSystem(); @@ -425,3 +427,30 @@ mbed_main(); } #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