File indexing completed on 2025-05-11 08:24:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
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
0152
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
0224
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
0284
0285 #endif