diff options
author | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2011-01-24 10:35:19 +0100 |
---|---|---|
committer | Nicolas "Pixel" Noble <pixel@nobis-crew.org> | 2011-01-24 10:35:19 +0100 |
commit | 965df7faefabdd5f571b5eb46d45470223c91e12 (patch) | |
tree | b7502742236c8e65279a4a472c8e82b5e5b289c0 /os/src | |
parent | e46ea682c1aa214ccb59c9871914993c9375e5c2 (diff) |
Adding sbrk, and fixing a couple of other makefile problems.
Diffstat (limited to 'os/src')
-rw-r--r-- | os/src/sbrk.c | 47 |
1 files changed, 47 insertions, 0 deletions
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; +} + |