score: Add _Stack_Allocator_do_initialize()

Do the stack allocator initialization and sanity check only if a
user-provided stack allocator was configured.  This avoids a dependency
of _Thread_Handler_initialization() on the stack allocator.

Update #3959.
This commit is contained in:
Sebastian Huber
2020-04-09 15:17:46 +02:00
parent 159db41166
commit d8172209b3
7 changed files with 78 additions and 21 deletions

View File

@@ -932,6 +932,7 @@ librtemscpu_a_SOURCES += score/src/schedulercbssetparameters.c
librtemscpu_a_SOURCES += score/src/schedulercbsreleasejob.c
librtemscpu_a_SOURCES += score/src/schedulercbsunblock.c
librtemscpu_a_SOURCES += score/src/stackallocator.c
librtemscpu_a_SOURCES += score/src/stackallocatorinit.c
librtemscpu_a_SOURCES += score/src/pheapallocate.c
librtemscpu_a_SOURCES += score/src/pheapextend.c
librtemscpu_a_SOURCES += score/src/pheapfree.c

View File

@@ -150,6 +150,12 @@ const uintptr_t _Stack_Space_size = _CONFIGURE_STACK_SPACE_SIZE;
const Stack_Allocator_free _Stack_Allocator_free =
CONFIGURE_TASK_STACK_DEALLOCATOR;
RTEMS_SYSINIT_ITEM(
_Stack_Allocator_do_initialize,
RTEMS_SYSINIT_DIRTY_MEMORY,
RTEMS_SYSINIT_ORDER_MIDDLE
);
#elif defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
|| defined(CONFIGURE_TASK_STACK_DEALLOCATOR)
#error "CONFIGURE_TASK_STACK_ALLOCATOR and CONFIGURE_TASK_STACK_DEALLOCATOR must be both defined or both undefined"

View File

@@ -123,6 +123,13 @@ extern const Stack_Allocator_allocate _Stack_Allocator_allocate;
*/
extern const Stack_Allocator_free _Stack_Allocator_free;
/**
* @brief Do the stack allocator initialization during system initialize.
*
* This function is used to initialize application provided stack allocators.
*/
void _Stack_Allocator_do_initialize( void );
/** @} */
#ifdef __cplusplus

View File

@@ -41,6 +41,7 @@ extern "C" {
#define RTEMS_SYSINIT_INITIAL_EXTENSIONS 000500
#define RTEMS_SYSINIT_MP_EARLY 000600
#define RTEMS_SYSINIT_DATA_STRUCTURES 000700
#define RTEMS_SYSINIT_STACK_ALLOCATOR 000780
#define RTEMS_SYSINIT_MP 000800
#define RTEMS_SYSINIT_USER_EXTENSIONS 000900
#define RTEMS_SYSINIT_CLASSIC_TASKS 000a00

View File

@@ -34,8 +34,6 @@
const bool _Stack_Allocator_avoids_workspace = false;
const Stack_Allocator_initialize _Stack_Allocator_initialize = NULL;
const Stack_Allocator_allocate _Stack_Allocator_allocate = _Workspace_Allocate;
const Stack_Allocator_free _Stack_Allocator_free = _Workspace_Free;

View File

@@ -0,0 +1,60 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/**
* @file
*
* @ingroup RTEMSScoreStack
*
* @brief Stack Allocator Initialization
*/
/*
* 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/stack.h>
#include <rtems/score/interr.h>
#include <rtems/config.h>
void _Stack_Allocator_do_initialize( void )
{
rtems_stack_allocate_init_hook init_hook;
if (
rtems_configuration_get_stack_allocate_hook() == NULL
|| rtems_configuration_get_stack_free_hook() == NULL
) {
_Internal_error( INTERNAL_ERROR_BAD_STACK_HOOK );
}
init_hook = rtems_configuration_get_stack_allocate_init_hook();
if ( init_hook != NULL ) {
(*init_hook )( rtems_configuration_get_stack_space_size() );
}
}

View File

@@ -20,10 +20,8 @@
#include <rtems/score/threadimpl.h>
#include <rtems/score/freechainimpl.h>
#include <rtems/score/interr.h>
#include <rtems/score/objectimpl.h>
#include <rtems/score/scheduler.h>
#include <rtems/score/wkspace.h>
#define THREAD_OFFSET_ASSERT( field ) \
RTEMS_STATIC_ASSERT( \
@@ -59,23 +57,9 @@ void _Thread_Initialize_information( Thread_Information *information )
void _Thread_Handler_initialization(void)
{
rtems_stack_allocate_init_hook stack_allocate_init_hook =
rtems_configuration_get_stack_allocate_init_hook();
#if defined(RTEMS_MULTIPROCESSING)
uint32_t maximum_proxies =
_MPCI_Configuration.maximum_proxies;
#endif
if ( rtems_configuration_get_stack_allocate_hook() == NULL ||
rtems_configuration_get_stack_free_hook() == NULL)
_Internal_error( INTERNAL_ERROR_BAD_STACK_HOOK );
if ( stack_allocate_init_hook != NULL )
(*stack_allocate_init_hook)( rtems_configuration_get_stack_space_size() );
#if defined(RTEMS_MULTIPROCESSING)
_Thread_MP_Handler_initialization( maximum_proxies );
#endif
#if defined(RTEMS_MULTIPROCESSING)
_Thread_MP_Handler_initialization( _MPCI_Configuration.maximum_proxies );
#endif
/*
* Initialize the internal class of threads. We need an IDLE thread