From 47a3cd8f73780bad3eff5135f0eb58e8c98af91d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 9 Aug 2012 16:48:00 +0200 Subject: score: Work area initialization API change The work areas (RTEMS work space and C program heap) will be initialized now in a separate step and are no longer part of rtems_initialize_data_structures(). Initialization is performed with tables of Heap_Area entries. This allows usage of scattered memory areas present on various small scale micro-controllers. The sbrk() support API changes also. The bsp_sbrk_init() must now deal with a minimum size for the first memory chunk to take the configured work space size into account. --- .../libcsupport/src/rtems_heap_extend_via_sbrk.c | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 cpukit/libcsupport/src/rtems_heap_extend_via_sbrk.c (limited to 'cpukit/libcsupport/src/rtems_heap_extend_via_sbrk.c') diff --git a/cpukit/libcsupport/src/rtems_heap_extend_via_sbrk.c b/cpukit/libcsupport/src/rtems_heap_extend_via_sbrk.c new file mode 100644 index 0000000000..831626b3d5 --- /dev/null +++ b/cpukit/libcsupport/src/rtems_heap_extend_via_sbrk.c @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Obere Lagerstr. 30 + * 82178 Puchheim + * Germany + * + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + */ + +#if HAVE_CONFIG_H + #include "config.h" +#endif + +#include + +#include + +#include "malloc_p.h" + +ptrdiff_t RTEMS_Malloc_Sbrk_amount; + +void *rtems_heap_extend_via_sbrk( + Heap_Control *heap, + size_t alloc_size +) +{ + ptrdiff_t sbrk_amount = RTEMS_Malloc_Sbrk_amount; + ptrdiff_t sbrk_size = (ptrdiff_t) alloc_size; + ptrdiff_t misaligned = sbrk_size % sbrk_amount; + void *return_this = NULL; + + if ( misaligned != 0 ) { + sbrk_size += sbrk_amount - misaligned; + } + + if ( sbrk_size > 0 && sbrk_amount > 0 ) { + void *area_begin = sbrk( sbrk_size ); + + if ( area_begin != (void *) -1 ) { + bool ok = _Protected_heap_Extend( heap, area_begin, sbrk_size ); + + if ( ok ) { + MSBUMP( space_available, sbrk_size ); + + return_this = _Protected_heap_Allocate( heap, alloc_size ); + } else { + sbrk( -sbrk_size ); + } + } + } + + return return_this; +} -- cgit v1.2.3