summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorNicolas "Pixel" Noble <pixel@nobis-crew.org>2011-01-24 10:35:19 +0100
committerNicolas "Pixel" Noble <pixel@nobis-crew.org>2011-01-24 10:35:19 +0100
commit965df7faefabdd5f571b5eb46d45470223c91e12 (patch)
treeb7502742236c8e65279a4a472c8e82b5e5b289c0 /os
parente46ea682c1aa214ccb59c9871914993c9375e5c2 (diff)
Adding sbrk, and fixing a couple of other makefile problems.
Diffstat (limited to 'os')
-rw-r--r--os/Makefile3
-rw-r--r--os/src/sbrk.c47
2 files changed, 49 insertions, 1 deletions
diff --git a/os/Makefile b/os/Makefile
index 6f6ce2e..070566d 100644
--- a/os/Makefile
+++ b/os/Makefile
@@ -4,8 +4,9 @@ all: $(TARGET_LIB)
include $(ROOTDIR)/common.mk
include config.mk
+include $(ROOTDIR)/FreeRTOS/config.mk
-TARGET_SRCS = src/init.c
+TARGET_SRCS = src/init.c src/sbrk.c
include $(ROOTDIR)/target-rules.mk
diff --git a/os/src/sbrk.c b/os/src/sbrk.c
new file mode 100644
index 0000000..3c674ba
--- /dev/null
+++ b/os/src/sbrk.c
@@ -0,0 +1,47 @@
+#include <reent.h>
+#include <errno.h>
+#include <stdlib.h>
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "mpu_wrappers.h"
+
+// Mostly stolen from mbed-freertos
+
+extern unsigned int __cs3_heap_start, __cs3_heap_end;
+
+/* Low-level bulk RAM allocator -- used by Newlib's Malloc */
+void *heap_end = NULL;
+PRIVILEGED_FUNCTION void *_sbrk_r(struct _reent *ptr, ptrdiff_t incr)
+{
+ void *prev_heap_end, *next_heap_end, *ret;
+
+ taskENTER_CRITICAL();
+ {
+ /* Initialize on first call */
+ if (heap_end == NULL)
+ {
+ heap_end = (void *)&__cs3_heap_start;
+ }
+
+ prev_heap_end = heap_end;
+
+ /* Align to always be on 8-byte boundaries */
+ next_heap_end = (void *)((((unsigned int)heap_end + incr) + 7) & ~7);
+
+ /* Check if this allocation would exceed the end of the ram - would probably get into the stack first however */
+ if (next_heap_end > (void *)&__cs3_heap_end)
+ {
+ ptr->_errno = ENOMEM;
+ ret = NULL;
+ }
+ else
+ {
+ heap_end = next_heap_end;
+ ret = (void *)prev_heap_end;
+ }
+ }
+ taskEXIT_CRITICAL();
+ return ret;
+}
+