diff options
-rw-r--r-- | arch/arm/lpc17xx/startup.s | 2 | ||||
-rw-r--r-- | os/src/sbrk.c | 8 |
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; |