[RTEMS 5 v2] Add support for IDLE Thread stack allocator

Joel Sherrill joel at rtems.org
Thu Oct 7 15:31:57 UTC 2021


On Wed, Oct 6, 2021 at 12:19 AM Sebastian Huber
<sebastian.huber at embedded-brains.de> wrote:
>
> [..]
> > +
> > +/*
> > + * If the application wants to provide an IDLE threads stack allocator, it
> > + * must also provide a custom allocator/deallocator for user thread stacks.
> > + */
> > +#elif (!defined(CONFIGURE_TASK_STACK_ALLOCATOR) \
> > +  && !defined(CONFIGURE_TASK_STACK_DEALLOCATOR)) \
> > +  && defined(CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE)
> > +  #error "CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE can only be provided if both CONFIGURE_TASK_STACK_ALLOCATOR and CONFIGURE_TASK_STACK_DEALLOCATOR are provided"
> >   #endif
>
> Is this really a hard error? The allocators are independent.

Yeah it is technically possible but I didn't see the real-life use case.
It will require another test but I can toss it in and touch the docs.

>
> >
> >   #ifdef CONFIGURE_DIRTY_MEMORY
> > diff --git a/cpukit/include/rtems/config.h b/cpukit/include/rtems/config.h
> > index e82c7abf11..a826581658 100644
> > --- a/cpukit/include/rtems/config.h
> > +++ b/cpukit/include/rtems/config.h
> > @@ -129,6 +129,9 @@ uint32_t rtems_configuration_get_maximum_extensions( void );
> >   #define rtems_configuration_get_stack_free_hook() \
> >     (_Stack_Allocator_free)
> >
> > +#define rtems_configuration_get_stack_allocate_for_idle_hook() \
> > +  (_Stack_Allocator_allocate_for_idle)
> > +
> >    /**
> >     * This macro assists in accessing the field which indicates whether
> >     * RTEMS is responsible for zeroing the Executive Workspace.
> > diff --git a/cpukit/include/rtems/score/stack.h b/cpukit/include/rtems/score/stack.h
> > index df1df74867..6b20d4b977 100644
> > --- a/cpukit/include/rtems/score/stack.h
> > +++ b/cpukit/include/rtems/score/stack.h
> > @@ -23,6 +23,7 @@
> >   #define _RTEMS_SCORE_STACK_H
> >
> >   #include <rtems/score/basedefs.h>
> > +#include <rtems/score/percpu.h>
>
> Please do not include this header in an header visible to the API.

Switching back to uint32_t will address that.

> >
> >   #ifdef __cplusplus
> >   extern "C" {
> > @@ -81,6 +82,23 @@ typedef void *( *Stack_Allocator_allocate )( size_t stack_size );
> >    */
> >   typedef void ( *Stack_Allocator_free )( void *addr );
> >
> > +/**
> > + * @brief Stack allocator allocate for idle handler.
> > + *
> > + * The allocate for idle handler is optional even when the user thread stack
> > + * allocator and deallocator are configured.
> > + *
> > + * @param cpu Information for the CPU for the IDLE thread using this stack
> > + * @param stack_size The size of the stack area to allocate in bytes.
> > + *
> > + * @retval NULL Not enough memory.
> > + * @retval other Pointer to begin of stack area.
> > + */
> > +typedef void *( *Stack_Allocator_allocate_for_idle )(
> > +  Per_CPU_Control *cpu,
>
> Please use
>
> uint32_t cpu_index
>
> instead.

Yeah. That eliminates percpu.h also.

>
> > +  size_t           stack_size
> > +);
> > +
> >   /**
> >    * @brief The minimum stack size.
> >    *
> > @@ -124,6 +142,30 @@ extern const Stack_Allocator_allocate _Stack_Allocator_allocate;
> >   extern const Stack_Allocator_free _Stack_Allocator_free;
> >
> >   /** @} */
> > +/**
> > + * @brief The stack allocator allocate stack for idle thread handler.
> > + *
> > + * Application provided via <rtems/confdefs.h>.
> > + */
> > +extern const Stack_Allocator_allocate_for_idle
> > +  _Stack_Allocator_allocate_for_idle;
> > +
> > +/**
> > + * @brief Default stack allocator allocate for idle handler.
> > + *
> > + * The allocate for idle handler is optional even when the user thread stack
> > + * allocator and deallocator are configured.
> > + *
> > + * @param cpu Information for the CPU for the IDLE thread using this stack
> > + * @param stack_size The size of the stack area to allocate in bytes.
> > + *
> > + * @retval NULL Not enough memory.
> > + * @retval other Pointer to begin of stack area.
> > + */
> > +void *_Stack_Allocator_allocate_for_idle_default(
> > +  Per_CPU_Control *cpu,
> > +  size_t           stack_size
> > +);
> >
> >   #ifdef __cplusplus
> >   }
> > diff --git a/cpukit/score/src/stackallocatorforidle.c b/cpukit/score/src/stackallocatorforidle.c
> > new file mode 100644
> > index 0000000000..d33cd4dbf5
> > --- /dev/null
> > +++ b/cpukit/score/src/stackallocatorforidle.c
> > @@ -0,0 +1,36 @@
> > +/*
> > + * SPDX-License-Identifier: BSD-2-Clause
> > + *
> > + * Copyright (C) 2021 OAR Corporation
> > + *
> > + * 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/wkspace.h>
>
> Why the wkspace.h include?

Removed.
>
> > +
> > +const Stack_Allocator_allocate_for_idle _Stack_Allocator_allocate_for_idle =
> > +        _Stack_Allocator_allocate_for_idle_default;
>
> Please move the definition to this file and make
> _Stack_Allocator_allocate_for_idle_default() static.

Sure. Also gets rid of prototype in header.

Next version coming shortly.

> [...]
>
> --
> embedded brains GmbH
> Herr Sebastian HUBER
> Dornierstr. 4
> 82178 Puchheim
> Germany
> email: sebastian.huber at embedded-brains.de
> phone: +49-89-18 94 741 - 16
> fax:   +49-89-18 94 741 - 08
>
> Registergericht: Amtsgericht München
> Registernummer: HRB 157899
> Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler
> Unsere Datenschutzerklärung finden Sie hier:
> https://embedded-brains.de/datenschutzerklaerung/


More information about the devel mailing list