Decouple the C Program Heap initialization

Before this patch RTEMS_Malloc_Initialize() had a fixed dependency on
_Workspace_Area.  Introduce _Workspace_Malloc_initializer to have this
dependency only if CONFIGURE_UNIFIED_WORK_AREAS is defined by the
application configuration.
This commit is contained in:
Sebastian Huber
2020-10-01 19:05:33 +02:00
parent 71689a0775
commit f2185d1099
9 changed files with 218 additions and 46 deletions
+3
View File
@@ -176,6 +176,7 @@ librtemscpu_a_SOURCES += libcsupport/src/mallocdirtydefault.c
librtemscpu_a_SOURCES += libcsupport/src/mallocextenddefault.c
librtemscpu_a_SOURCES += libcsupport/src/mallocfreespace.c
librtemscpu_a_SOURCES += libcsupport/src/mallocgetheapptr.c
librtemscpu_a_SOURCES += libcsupport/src/mallocheap.c
librtemscpu_a_SOURCES += libcsupport/src/mallocinfo.c
librtemscpu_a_SOURCES += libcsupport/src/malloc_initialize.c
librtemscpu_a_SOURCES += libcsupport/src/_malloc_r.c
@@ -1025,6 +1026,8 @@ librtemscpu_a_SOURCES += score/src/interr.c
librtemscpu_a_SOURCES += score/src/isr.c
librtemscpu_a_SOURCES += score/src/wkspace.c
librtemscpu_a_SOURCES += score/src/wkspaceisunifieddefault.c
librtemscpu_a_SOURCES += score/src/wkspacemallocinitdefault.c
librtemscpu_a_SOURCES += score/src/wkspacemallocinitunified.c
librtemscpu_a_SOURCES += score/src/wkstringduplicate.c
librtemscpu_a_SOURCES += score/src/iobase64.c
librtemscpu_a_SOURCES += score/src/ioprintf.c
+3
View File
@@ -126,6 +126,9 @@ const uintptr_t _Workspace_Size = CONFIGURE_EXECUTIVE_RAM_SIZE;
#ifdef CONFIGURE_UNIFIED_WORK_AREAS
const bool _Workspace_Is_unified = true;
struct Heap_Control *( * const _Workspace_Malloc_initializer )( void ) =
_Workspace_Malloc_initialize_unified;
#endif
uint32_t rtems_minimum_stack_size = CONFIGURE_MINIMUM_TASK_STACK_SIZE;
+1 -1
View File
@@ -43,7 +43,7 @@ extern "C" {
*/
extern Heap_Control *RTEMS_Malloc_Heap;
void RTEMS_Malloc_Initialize(
Heap_Control *RTEMS_Malloc_Initialize(
const Memory_Information *mem,
Heap_Initialization_or_extend_handler extend
);
+26
View File
@@ -43,6 +43,8 @@
extern "C" {
#endif
struct Heap_Control;
/**
* @addtogroup RTEMSScoreWorkspace
*
@@ -65,6 +67,30 @@ extern const uintptr_t _Workspace_Size;
*/
extern const bool _Workspace_Is_unified;
/**
* @brief Initializes the C Program Heap separated from the RTEMS Workspace.
*
* @return Returns the heap control used for the C Program Heap.
*/
struct Heap_Control *_Workspace_Malloc_initialize_separate( void );
/**
* @brief Initializes the C Program Heap so that it is unified with the RTEMS
* Workspace.
*
* @return Returns the heap control used for the C Program Heap.
*/
struct Heap_Control *_Workspace_Malloc_initialize_unified( void );
/**
* @brief This constant provides the C Program Heap initialization handler.
*
* This constant is defined by the application configuration option
* #CONFIGURE_UNIFIED_WORK_AREAS via <rtems/confdefs.h> or a default
* configuration.
*/
extern struct Heap_Control *( * const _Workspace_Malloc_initializer )( void );
/** @} */
#ifdef __cplusplus
+35 -45
View File
@@ -19,73 +19,63 @@
#include <rtems/malloc.h>
#include <rtems/score/wkspace.h>
#include <rtems/sysinit.h>
#include "malloc_p.h"
Heap_Control *RTEMS_Malloc_Heap;
static void _Malloc_Initialize( void )
{
RTEMS_Malloc_Initialize( _Memory_Get(), _Heap_Extend );
}
RTEMS_SYSINIT_ITEM(
_Malloc_Initialize,
RTEMS_SYSINIT_MALLOC,
RTEMS_SYSINIT_ORDER_MIDDLE
);
#ifdef RTEMS_NEWLIB
static Heap_Control _Malloc_Heap;
void RTEMS_Malloc_Initialize(
Heap_Control *RTEMS_Malloc_Initialize(
const Memory_Information *mem,
Heap_Initialization_or_extend_handler extend
)
{
if ( rtems_configuration_get_unified_work_area() ) {
RTEMS_Malloc_Heap = &_Workspace_Area;
} else {
Heap_Control *heap;
Heap_Initialization_or_extend_handler init_or_extend;
uintptr_t page_size;
size_t i;
Heap_Control *heap;
Heap_Initialization_or_extend_handler init_or_extend;
uintptr_t page_size;
size_t i;
heap = &_Malloc_Heap;
RTEMS_Malloc_Heap = heap;
init_or_extend = _Heap_Initialize;
page_size = CPU_HEAP_ALIGNMENT;
heap = &_Malloc_Heap;
RTEMS_Malloc_Heap = heap;
init_or_extend = _Heap_Initialize;
page_size = CPU_HEAP_ALIGNMENT;
for (i = 0; i < _Memory_Get_count( mem ); ++i) {
Memory_Area *area;
uintptr_t space_available;
for (i = 0; i < _Memory_Get_count( mem ); ++i) {
Memory_Area *area;
uintptr_t space_available;
area = _Memory_Get_area( mem, i );
space_available = ( *init_or_extend )(
heap,
_Memory_Get_free_begin( area ),
_Memory_Get_free_size( area ),
page_size
);
area = _Memory_Get_area( mem, i );
space_available = ( *init_or_extend )(
heap,
_Memory_Get_free_begin( area ),
_Memory_Get_free_size( area ),
page_size
);
if ( space_available > 0 ) {
_Memory_Consume( area, _Memory_Get_free_size( area ) );
init_or_extend = extend;
}
}
if ( init_or_extend == _Heap_Initialize ) {
_Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
if ( space_available > 0 ) {
_Memory_Consume( area, _Memory_Get_free_size( area ) );
init_or_extend = extend;
}
}
if ( init_or_extend == _Heap_Initialize ) {
_Internal_error( INTERNAL_ERROR_NO_MEMORY_FOR_HEAP );
}
return heap;
}
#else
void RTEMS_Malloc_Initialize(
Heap_Control *RTEMS_Malloc_Initialize(
const Memory_Information *mem,
Heap_Initialization_or_extend_handler extend
)
{
/* FIXME: Dummy function */
return NULL;
}
#endif
Heap_Control *_Workspace_Malloc_initialize_separate( void )
{
return RTEMS_Malloc_Initialize( _Memory_Get(), _Heap_Extend );
}
+56
View File
@@ -0,0 +1,56 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup MallocSupport
*
* @brief This source file provides the C Program Heap control along with the
* system initialization handler.
*/
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/malloc.h>
#include <rtems/sysinit.h>
#include <rtems/score/wkspacedata.h>
Heap_Control *RTEMS_Malloc_Heap;
static void _Malloc_Initialize( void )
{
RTEMS_Malloc_Heap = ( *_Workspace_Malloc_initializer )();
}
RTEMS_SYSINIT_ITEM(
_Malloc_Initialize,
RTEMS_SYSINIT_MALLOC,
RTEMS_SYSINIT_ORDER_MIDDLE
);
@@ -0,0 +1,44 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreWorkspace
*
* @brief This source file provides the default definition of
* _Workspace_Malloc_initializer.
*/
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/wkspacedata.h>
struct Heap_Control *( * const _Workspace_Malloc_initializer )( void ) =
_Workspace_Malloc_initialize_separate;
@@ -0,0 +1,47 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreWorkspace
*
* @brief This source file provides the implementation of
* _Workspace_Malloc_initialize_unified().
*/
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/score/wkspacedata.h>
#include <rtems/score/wkspace.h>
Heap_Control *_Workspace_Malloc_initialize_unified( void )
{
return &_Workspace_Area;
}
+3
View File
@@ -669,6 +669,7 @@ source:
- cpukit/libcsupport/src/mallocextenddefault.c
- cpukit/libcsupport/src/mallocfreespace.c
- cpukit/libcsupport/src/mallocgetheapptr.c
- cpukit/libcsupport/src/mallocheap.c
- cpukit/libcsupport/src/mallocinfo.c
- cpukit/libcsupport/src/malloc_initialize.c
- cpukit/libcsupport/src/_malloc_r.c
@@ -1575,6 +1576,8 @@ source:
- cpukit/score/src/watchdogtimeslicedefault.c
- cpukit/score/src/wkspace.c
- cpukit/score/src/wkspaceisunifieddefault.c
- cpukit/score/src/wkspacemallocinitdefault.c
- cpukit/score/src/wkspacemallocinitunified.c
- cpukit/score/src/wkstringduplicate.c
target: rtemscpu
type: build