Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:12

0001 /* SPDX-License-Identifier: BSD-2-Clause */
0002 
0003 /**
0004  * @file
0005  *
0006  * @ingroup RTEMSImplApplConfig
0007  *
0008  * @brief This header file evaluates configuration options related to the
0009  *   thread configuration.
0010  */
0011 
0012 /*
0013  * Copyright (C) 2020 embedded brains GmbH & Co. KG
0014  *
0015  * Redistribution and use in source and binary forms, with or without
0016  * modification, are permitted provided that the following conditions
0017  * are met:
0018  * 1. Redistributions of source code must retain the above copyright
0019  *    notice, this list of conditions and the following disclaimer.
0020  * 2. Redistributions in binary form must reproduce the above copyright
0021  *    notice, this list of conditions and the following disclaimer in the
0022  *    documentation and/or other materials provided with the distribution.
0023  *
0024  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0025  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0026  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0027  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
0028  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0029  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0030  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0031  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0032  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0033  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0034  * POSSIBILITY OF SUCH DAMAGE.
0035  */
0036 
0037 #ifndef _RTEMS_CONFDEFS_THREADS_H
0038 #define _RTEMS_CONFDEFS_THREADS_H
0039 
0040 #ifndef __CONFIGURATION_TEMPLATE_h
0041 #error "Do not include this file directly, use <rtems/confdefs.h> instead"
0042 #endif
0043 
0044 #ifdef CONFIGURE_INIT
0045 
0046 #include <rtems/confdefs/bdbuf.h>
0047 #include <rtems/confdefs/extensions.h>
0048 #include <rtems/confdefs/percpu.h>
0049 #include <rtems/confdefs/scheduler.h>
0050 #include <rtems/confdefs/unlimited.h>
0051 #include <rtems/score/thread.h>
0052 #include <rtems/rtems/tasksdata.h>
0053 
0054 #ifdef RTEMS_POSIX_API
0055   #include <rtems/posix/threadsup.h>
0056 #endif
0057 
0058 #ifndef CONFIGURE_MAXIMUM_TASKS
0059   #define CONFIGURE_MAXIMUM_TASKS 0
0060 #endif
0061 
0062 #define _CONFIGURE_TASKS ( CONFIGURE_MAXIMUM_TASKS + _CONFIGURE_LIBBLOCK_TASKS )
0063 
0064 #ifndef CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE
0065   #define CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE 0
0066 #endif
0067 
0068 #if CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE > CONFIGURE_MAXIMUM_TASKS
0069   #error "CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE shall be less than or equal to CONFIGURE_MAXIMUM_TASKS"
0070 #endif
0071 
0072 #ifndef CONFIGURE_MAXIMUM_POSIX_THREADS
0073   #define CONFIGURE_MAXIMUM_POSIX_THREADS 0
0074 #endif
0075 
0076 #if CONFIGURE_MAXIMUM_POSIX_THREADS > 0
0077   #include <rtems/posix/pthread.h>
0078 #endif
0079 
0080 #if !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION) \
0081   && CONFIGURE_MAXIMUM_TASKS == 0 \
0082   && CONFIGURE_MAXIMUM_POSIX_THREADS == 0
0083   #error "You must define one of CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION, CONFIGURE_MAXIMUM_TASKS, and CONFIGURE_MAXIMUM_POSIX_THREADS"
0084 #endif
0085 
0086 #if !defined(CONFIGURE_RTEMS_INIT_TASKS_TABLE) \
0087   && !defined(CONFIGURE_POSIX_INIT_THREAD_TABLE) \
0088   && !defined(CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION)
0089   #error "You must define one of CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION, CONFIGURE_RTEMS_INIT_TASKS_TABLE, and CONFIGURE_POSIX_INIT_THREAD_TABLE"
0090 #endif
0091 
0092 #ifndef CONFIGURE_MAXIMUM_THREAD_NAME_SIZE
0093   #define CONFIGURE_MAXIMUM_THREAD_NAME_SIZE THREAD_DEFAULT_MAXIMUM_NAME_SIZE
0094 #endif
0095 
0096 #ifndef CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE
0097   #define CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE 0
0098 #endif
0099 
0100 #ifdef __cplusplus
0101 extern "C" {
0102 #endif
0103 
0104 typedef union {
0105   Scheduler_Node Base;
0106   #ifdef CONFIGURE_SCHEDULER_CBS
0107     Scheduler_CBS_Node CBS;
0108   #endif
0109   #ifdef CONFIGURE_SCHEDULER_EDF
0110     Scheduler_EDF_Node EDF;
0111   #endif
0112   #ifdef CONFIGURE_SCHEDULER_EDF_SMP
0113     Scheduler_EDF_SMP_Node EDF_SMP;
0114   #endif
0115   #ifdef CONFIGURE_SCHEDULER_PRIORITY
0116     Scheduler_priority_Node Priority;
0117   #endif
0118   #ifdef CONFIGURE_SCHEDULER_SIMPLE_SMP
0119     Scheduler_SMP_Node Simple_SMP;
0120   #endif
0121   #ifdef CONFIGURE_SCHEDULER_PRIORITY_SMP
0122     Scheduler_priority_SMP_Node Priority_SMP;
0123   #endif
0124   #ifdef CONFIGURE_SCHEDULER_PRIORITY_AFFINITY_SMP
0125     Scheduler_priority_affinity_SMP_Node Priority_affinity_SMP;
0126   #endif
0127   #ifdef CONFIGURE_SCHEDULER_STRONG_APA
0128     Scheduler_strong_APA_Node Strong_APA;
0129   #endif
0130   #ifdef CONFIGURE_SCHEDULER_USER_PER_THREAD
0131     CONFIGURE_SCHEDULER_USER_PER_THREAD User;
0132   #endif
0133 } Configuration_Scheduler_node;
0134 
0135 #ifdef RTEMS_SMP
0136   const size_t _Scheduler_Node_size = sizeof( Configuration_Scheduler_node );
0137 #endif
0138 
0139 const size_t _Thread_Maximum_name_size = CONFIGURE_MAXIMUM_THREAD_NAME_SIZE;
0140 
0141 RTEMS_STATIC_ASSERT(
0142   CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE % RTEMS_TASK_STORAGE_ALIGNMENT == 0,
0143   CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE
0144 );
0145 
0146 const size_t _Thread_Maximum_TLS_size =
0147   CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE;
0148 
0149 struct Thread_Configured_control {
0150 /*
0151  * This was added to address the following warning.
0152  * warning: invalid use of structure with flexible array member
0153  */
0154 #pragma GCC diagnostic push
0155 #pragma GCC diagnostic ignored "-Wpedantic"
0156   Thread_Control Control;
0157 #pragma GCC diagnostic pop
0158 
0159   #if CONFIGURE_MAXIMUM_USER_EXTENSIONS > 0
0160     void *extensions[ CONFIGURE_MAXIMUM_USER_EXTENSIONS + 1 ];
0161   #endif
0162   Configuration_Scheduler_node Scheduler_nodes[ _CONFIGURE_SCHEDULER_COUNT ];
0163   RTEMS_API_Control API_RTEMS;
0164   #ifdef RTEMS_POSIX_API
0165     POSIX_API_Control API_POSIX;
0166   #endif
0167   #if CONFIGURE_MAXIMUM_THREAD_NAME_SIZE > 1
0168     char name[ CONFIGURE_MAXIMUM_THREAD_NAME_SIZE ];
0169   #endif
0170   #if defined(_CONFIGURE_ENABLE_NEWLIB_REENTRANCY) && \
0171     !defined(_REENT_THREAD_LOCAL)
0172     struct _reent Newlib;
0173   #endif
0174 };
0175 
0176 const Thread_Control_add_on _Thread_Control_add_ons[] = {
0177   {
0178     offsetof( Thread_Configured_control, Control.Scheduler.nodes ),
0179     offsetof( Thread_Configured_control, Scheduler_nodes )
0180   }, {
0181     offsetof(
0182       Thread_Configured_control,
0183       Control.API_Extensions[ THREAD_API_RTEMS ]
0184     ),
0185     offsetof( Thread_Configured_control, API_RTEMS )
0186   }
0187   #if defined(_CONFIGURE_ENABLE_NEWLIB_REENTRANCY) && \
0188     !defined(_REENT_THREAD_LOCAL)
0189     , {
0190       offsetof(
0191         Thread_Configured_control,
0192         Control.libc_reent
0193       ),
0194       offsetof( Thread_Configured_control, Newlib )
0195     }
0196   #endif
0197   #if CONFIGURE_MAXIMUM_THREAD_NAME_SIZE > 1
0198     , {
0199       offsetof(
0200         Thread_Configured_control,
0201         Control.Join_queue.Queue.name
0202       ),
0203       offsetof( Thread_Configured_control, name )
0204     }
0205   #endif
0206   #ifdef RTEMS_POSIX_API
0207     , {
0208       offsetof(
0209         Thread_Configured_control,
0210         Control.API_Extensions[ THREAD_API_POSIX ]
0211       ),
0212       offsetof( Thread_Configured_control, API_POSIX )
0213     }
0214   #endif
0215 };
0216 
0217 const size_t _Thread_Control_add_on_count =
0218   RTEMS_ARRAY_SIZE( _Thread_Control_add_ons );
0219 
0220 #ifdef RTEMS_SMP
0221   struct Thread_queue_Configured_heads {
0222 /*
0223  * This was put in to address the following warning.
0224  * warning: invalid use of structure with flexible array member
0225  */
0226 #pragma GCC diagnostic push
0227 #pragma GCC diagnostic ignored "-Wpedantic"
0228     Thread_queue_Heads Heads;
0229 #pragma GCC diagnostic pop
0230       Thread_queue_Priority_queue Priority[ _CONFIGURE_SCHEDULER_COUNT ];
0231   };
0232 
0233   const size_t _Thread_queue_Heads_size =
0234     sizeof( Thread_queue_Configured_heads );
0235 #endif
0236 
0237 const size_t _Thread_Initial_thread_count =
0238 #if !defined(CONFIGURE_IDLE_TASK_STORAGE_SIZE) && \
0239   !defined(CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE)
0240   _CONFIGURE_MAXIMUM_PROCESSORS +
0241 #endif
0242   rtems_resource_maximum_per_allocation( _CONFIGURE_TASKS ) +
0243   rtems_resource_maximum_per_allocation( CONFIGURE_MAXIMUM_POSIX_THREADS );
0244 
0245 #if defined(RTEMS_MULTIPROCESSING) && defined(CONFIGURE_MP_APPLICATION)
0246   #define _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT 1
0247 #else
0248   #define _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT 0
0249 #endif
0250 
0251 THREAD_INFORMATION_DEFINE(
0252   _Thread,
0253   OBJECTS_INTERNAL_API,
0254   OBJECTS_INTERNAL_THREADS,
0255   _CONFIGURE_MAXIMUM_PROCESSORS + _CONFIGURE_MPCI_RECEIVE_SERVER_COUNT
0256 );
0257 
0258 #if _CONFIGURE_TASKS > 0
0259   THREAD_INFORMATION_DEFINE(
0260     _RTEMS_tasks,
0261     OBJECTS_CLASSIC_API,
0262     OBJECTS_RTEMS_TASKS,
0263     _CONFIGURE_TASKS
0264   );
0265 #endif
0266 
0267 #if CONFIGURE_MAXIMUM_POSIX_THREADS > 0
0268   const size_t _POSIX_Threads_Minimum_stack_size =
0269     CONFIGURE_MINIMUM_POSIX_THREAD_STACK_SIZE;
0270 
0271   THREAD_INFORMATION_DEFINE(
0272     _POSIX_Threads,
0273     OBJECTS_POSIX_API,
0274     OBJECTS_POSIX_THREADS,
0275     CONFIGURE_MAXIMUM_POSIX_THREADS
0276   );
0277 #endif
0278 
0279 #ifdef __cplusplus
0280 }
0281 #endif
0282 
0283 #endif /* CONFIGURE_INIT */
0284 
0285 #endif /* _RTEMS_CONFDEFS_THREADS_H */