summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/arm/lpc17xx/startup.s2
-rw-r--r--os/src/sbrk.c8
2 files changed, 7 insertions, 3 deletions
diff --git a/arch/arm/lpc17xx/startup.s b/arch/arm/lpc17xx/startup.s
index b195a18..734e468 100644
--- a/arch/arm/lpc17xx/startup.s
+++ b/arch/arm/lpc17xx/startup.s
@@ -20,8 +20,10 @@
.section ".stack", "w"
.align 3
.globl __cs3_stack_mem
+ .globl __stack_mem
.globl __cs3_stack_size
__cs3_stack_mem:
+__stack_start:
.if Stack_Size
.space Stack_Size
.endif
diff --git a/os/src/sbrk.c b/os/src/sbrk.c
index 221c809..4208b2e 100644
--- a/os/src/sbrk.c
+++ b/os/src/sbrk.c
@@ -8,13 +8,15 @@
// Mostly stolen from mbed-freertos
-extern unsigned int __heap_start, __heap_end;
+extern uintptr_t __heap_start, __heap_end;
+extern uintptr_t __stack_start __attribute__((weak));
/* 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;
+ void *stack_min = (void *)(__stack_start ? __stack_start : __heap_end);
taskENTER_CRITICAL();
{
@@ -27,10 +29,10 @@ PRIVILEGED_FUNCTION void *_sbrk_r(struct _reent *ptr, ptrdiff_t incr)
prev_heap_end = heap_end;
/* Align to always be on 8-byte boundaries */
- next_heap_end = (void *)((((unsigned int)heap_end + incr) + 7) & ~7);
+ next_heap_end = (void *)((((uintptr_t)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 *)&__heap_end)
+ if (next_heap_end > stack_min)
{
ptr->_errno = ENOMEM;
ret = NULL;