mbed library sources(for async_print)

Dependents:   AsyncPrint

Fork of mbed-src by mbed official

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