mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-22 08:15:20 +08:00
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:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user