File indexing completed on 2025-05-11 08:24:53
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 #include <bsp.h>
0038 #include <rtems/bspIo.h>
0039 #include <rtems/chain.h>
0040 #include <rtems/test-info.h>
0041 #include <rtems/testopts.h>
0042
0043 #include <rtems/test.h>
0044 #include <rtems/test-scheduler.h>
0045
0046 #include "ts-config.h"
0047 #include "tx-support.h"
0048
0049 #if !defined( MAX_TLS_SIZE )
0050 #define MAX_TLS_SIZE TEST_MAXIMUM_TLS_SIZE
0051 #endif
0052
0053 #define MAX_TASKS ( TEST_MAXIMUM_TASKS - 1 )
0054
0055 #define TASK_ATTRIBUTES RTEMS_FLOATING_POINT
0056
0057 #define TASK_STORAGE_SIZE \
0058 RTEMS_TASK_STORAGE_SIZE( \
0059 MAX_TLS_SIZE + TEST_MINIMUM_STACK_SIZE + \
0060 CPU_STACK_ALIGNMENT - CPU_HEAP_ALIGNMENT, \
0061 TASK_ATTRIBUTES \
0062 )
0063
0064 static char buffer[ 512 ];
0065
0066 static const T_action actions[] = {
0067 T_report_hash_sha256,
0068 T_memory_action,
0069 T_check_task_context,
0070 T_check_rtems_barriers,
0071 T_check_rtems_extensions,
0072 T_check_rtems_message_queues,
0073 T_check_rtems_partitions,
0074 T_check_rtems_periods,
0075 T_check_rtems_semaphores,
0076 T_check_rtems_tasks,
0077 T_check_rtems_timers
0078 };
0079
0080 static const T_config test_config = {
0081 .name = rtems_test_name,
0082 .buf = buffer,
0083 .buf_size = sizeof( buffer ),
0084 .putchar = rtems_put_char,
0085 .verbosity = RTEMS_TEST_VERBOSITY,
0086 #if defined(CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER)
0087 .now = T_now_clock,
0088 #else
0089 .now = T_now_tick,
0090 #endif
0091 .allocate = T_memory_allocate,
0092 .deallocate = T_memory_deallocate,
0093 .action_count = T_ARRAY_SIZE( actions ),
0094 .actions = actions
0095 };
0096
0097 static rtems_chain_control free_task_storage =
0098 RTEMS_CHAIN_INITIALIZER_EMPTY( free_task_storage );
0099
0100 static union {
0101 RTEMS_ALIGNED( RTEMS_TASK_STORAGE_ALIGNMENT ) char
0102 storage[ TASK_STORAGE_SIZE ];
0103 rtems_chain_node node;
0104 } task_storage[ MAX_TASKS ];
0105
0106 rtems_task_argument test_runner_argument;
0107
0108 rtems_task_priority test_runner_initial_priority;
0109
0110 rtems_mode test_runner_initial_modes;
0111
0112 static void Runner( rtems_task_argument arg )
0113 {
0114 int exit_code;
0115
0116 test_runner_argument = arg;
0117
0118 (void) rtems_task_mode(
0119 RTEMS_ASR,
0120 RTEMS_ASR_MASK,
0121 &test_runner_initial_modes
0122 );
0123
0124 (void) rtems_task_set_priority(
0125 RTEMS_SELF,
0126 PRIO_DEFAULT,
0127 &test_runner_initial_priority
0128 );
0129
0130 rtems_chain_initialize(
0131 &free_task_storage,
0132 task_storage,
0133 RTEMS_ARRAY_SIZE( task_storage ),
0134 sizeof( task_storage[ 0 ] )
0135 );
0136
0137 rtems_test_begin( rtems_test_name, TEST_STATE );
0138 T_register();
0139 exit_code = T_main( &test_config );
0140
0141 if ( exit_code == 0 ) {
0142 rtems_test_end( rtems_test_name );
0143 }
0144
0145 rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, (uint32_t) exit_code );
0146 }
0147
0148 void *test_task_stack_allocate( size_t size )
0149 {
0150 if ( size > sizeof( task_storage[ 0 ] ) ) {
0151 return NULL;
0152 }
0153
0154 T_quiet_ge_sz( size, TEST_MINIMUM_STACK_SIZE );
0155
0156 return rtems_chain_get_unprotected( &free_task_storage );
0157 }
0158
0159 void test_task_stack_deallocate( void *stack )
0160 {
0161 rtems_chain_append_unprotected(
0162 &free_task_storage,
0163 (rtems_chain_node *) stack
0164 );
0165 }
0166
0167 #if !defined( CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER )
0168 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0169 #endif
0170
0171 #define CONFIGURE_MINIMUM_TASK_STACK_SIZE TEST_MINIMUM_STACK_SIZE
0172
0173 #define CONFIGURE_INTERRUPT_STACK_SIZE TEST_INTERRUPT_STACK_SIZE
0174
0175 #define CONFIGURE_MAXIMUM_BARRIERS TEST_MAXIMUM_BARRIERS
0176
0177 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES TEST_MAXIMUM_MESSAGE_QUEUES
0178
0179 #define CONFIGURE_MAXIMUM_PARTITIONS TEST_MAXIMUM_PARTITIONS
0180
0181 #define CONFIGURE_MAXIMUM_PERIODS TEST_MAXIMUM_PERIODS
0182
0183 #define CONFIGURE_MAXIMUM_SEMAPHORES TEST_MAXIMUM_SEMAPHORES
0184
0185 #define CONFIGURE_MAXIMUM_TASKS TEST_MAXIMUM_TASKS
0186
0187 #define CONFIGURE_MINIMUM_TASKS_WITH_USER_PROVIDED_STORAGE \
0188 CONFIGURE_MAXIMUM_TASKS
0189
0190 #define CONFIGURE_MAXIMUM_TIMERS TEST_MAXIMUM_TIMERS
0191
0192 #define CONFIGURE_MAXIMUM_USER_EXTENSIONS TEST_MAXIMUM_USER_EXTENSIONS
0193
0194 #define CONFIGURE_MICROSECONDS_PER_TICK TEST_MICROSECONDS_PER_TICK
0195
0196 #define CONFIGURE_TICKS_PER_TIMESLICE TEST_TICKS_PER_TIMESLICE
0197
0198 #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 0
0199
0200 #define CONFIGURE_DISABLE_NEWLIB_REENTRANCY
0201
0202 #define CONFIGURE_APPLICATION_DISABLE_FILESYSTEM
0203
0204 #define CONFIGURE_MAXIMUM_THREAD_LOCAL_STORAGE_SIZE MAX_TLS_SIZE
0205
0206 #define CONFIGURE_TASK_STACK_ALLOCATOR_AVOIDS_WORK_SPACE
0207
0208 #define CONFIGURE_TASK_STACK_ALLOCATOR test_task_stack_allocate
0209
0210 #define CONFIGURE_TASK_STACK_DEALLOCATOR test_task_stack_deallocate
0211
0212 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0213
0214 #define CONFIGURE_INIT_TASK_ARGUMENTS TEST_RUNNER_ARGUMENT
0215
0216 #define CONFIGURE_INIT_TASK_ATTRIBUTES ( RTEMS_SYSTEM_TASK | TASK_ATTRIBUTES )
0217
0218 #define CONFIGURE_INIT_TASK_CONSTRUCT_STORAGE_SIZE TASK_STORAGE_SIZE
0219
0220 #define CONFIGURE_INIT_TASK_ENTRY_POINT Runner
0221
0222 #define CONFIGURE_INIT_TASK_INITIAL_MODES TEST_RUNNER_INITIAL_MODES
0223
0224 #define CONFIGURE_INIT_TASK_NAME TEST_RUNNER_NAME
0225
0226 #define CONFIGURE_INIT_TASK_PRIORITY 0
0227
0228 #if !defined( CONFIGURE_INITIAL_EXTENSIONS )
0229 #define CONFIGURE_INITIAL_EXTENSIONS { .fatal = FatalInitialExtension }
0230 #endif
0231
0232 #if defined( RTEMS_SMP ) && \
0233 ( CONFIGURE_MAXIMUM_PROCESSORS == 4 || CONFIGURE_MAXIMUM_PROCESSORS == 5 )
0234
0235 #include <rtems/score/scheduleredfsmp.h>
0236
0237 const Scheduler_Operations
0238 T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
0239 SCHEDULER_EDF_SMP_ENTRY_POINTS,
0240 SCHEDULER_EDF_SMP_ENTRY_POINTS,
0241 SCHEDULER_EDF_SMP_ENTRY_POINTS,
0242 #if CONFIGURE_MAXIMUM_PROCESSORS >= 5
0243 SCHEDULER_EDF_SMP_ENTRY_POINTS,
0244 #endif
0245 SCHEDULER_EDF_SMP_ENTRY_POINTS
0246 };
0247
0248 #undef SCHEDULER_EDF_SMP_ENTRY_POINTS
0249
0250 #define SCHEDULER_EDF_SMP_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
0251
0252 #define CONFIGURE_SCHEDULER_EDF_SMP
0253
0254 #include <rtems/scheduler.h>
0255
0256 RTEMS_SCHEDULER_EDF_SMP( a );
0257
0258 RTEMS_SCHEDULER_EDF_SMP( b );
0259
0260 RTEMS_SCHEDULER_EDF_SMP( c );
0261
0262 RTEMS_SCHEDULER_EDF_SMP( d );
0263
0264 #define CONFIGURE_SCHEDULER_TABLE_ENTRIES \
0265 RTEMS_SCHEDULER_TABLE_EDF_SMP( a, TEST_SCHEDULER_A_NAME ), \
0266 RTEMS_SCHEDULER_TABLE_EDF_SMP( b, TEST_SCHEDULER_B_NAME ), \
0267 RTEMS_SCHEDULER_TABLE_EDF_SMP( c, TEST_SCHEDULER_C_NAME ), \
0268 RTEMS_SCHEDULER_TABLE_EDF_SMP( d, TEST_SCHEDULER_D_NAME )
0269
0270 #if CONFIGURE_MAXIMUM_PROCESSORS == 5
0271 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0272 RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0273 RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0274 RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0275 RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0276 RTEMS_SCHEDULER_ASSIGN_NO_SCHEDULER
0277 #else
0278 #define CONFIGURE_SCHEDULER_ASSIGNMENTS \
0279 RTEMS_SCHEDULER_ASSIGN(0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY), \
0280 RTEMS_SCHEDULER_ASSIGN(1, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0281 RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL), \
0282 RTEMS_SCHEDULER_ASSIGN(2, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_OPTIONAL)
0283 #endif
0284
0285 #elif !defined( CONFIGURE_SCHEDULER_ASSIGNMENTS )
0286
0287 #include <rtems/score/schedulerpriority.h>
0288
0289 #undef CONFIGURE_MAXIMUM_PROCESSORS
0290 #define CONFIGURE_MAXIMUM_PROCESSORS 1
0291
0292 const Scheduler_Operations
0293 T_scheduler_operations[ CONFIGURE_MAXIMUM_PROCESSORS ] = {
0294 SCHEDULER_PRIORITY_ENTRY_POINTS
0295 };
0296
0297 #undef SCHEDULER_PRIORITY_ENTRY_POINTS
0298
0299 #define SCHEDULER_PRIORITY_ENTRY_POINTS T_SCHEDULER_ENTRY_POINTS
0300
0301 #define CONFIGURE_SCHEDULER_PRIORITY
0302
0303 #if defined(CONFIGURE_SCHEDULER_TABLE_ENTRIES)
0304
0305 #include <rtems/scheduler.h>
0306
0307 RTEMS_SCHEDULER_PRIORITY( a, 64 );
0308
0309 #else
0310
0311 #define CONFIGURE_SCHEDULER_NAME TEST_SCHEDULER_A_NAME
0312
0313 #define CONFIGURE_MAXIMUM_PRIORITY 127
0314
0315 #endif
0316
0317 #endif
0318
0319 #define CONFIGURE_IDLE_TASK_STACK_SIZE TEST_IDLE_STACK_SIZE
0320
0321 static char test_idle_stacks[ CONFIGURE_MAXIMUM_PROCESSORS ][
0322 RTEMS_ALIGN_UP(
0323 MAX_TLS_SIZE + TEST_IDLE_STACK_SIZE + CPU_IDLE_TASK_IS_FP * CONTEXT_FP_SIZE,
0324 CPU_INTERRUPT_STACK_ALIGNMENT
0325 )
0326 ]
0327 RTEMS_ALIGNED( CPU_INTERRUPT_STACK_ALIGNMENT )
0328 RTEMS_SECTION( ".rtemsstack.idle" );
0329
0330 void *test_idle_task_stack_allocate( uint32_t cpu_index, size_t *size )
0331 {
0332 if ( *size > sizeof( test_idle_stacks[ 0 ] ) ) {
0333 rtems_fatal( RTEMS_FATAL_SOURCE_APPLICATION, 0xABAD1DEA );
0334 }
0335
0336 return &test_idle_stacks[ cpu_index ][0];
0337 }
0338
0339 #define CONFIGURE_TASK_STACK_ALLOCATOR_FOR_IDLE test_idle_task_stack_allocate
0340
0341 #define CONFIGURE_INIT
0342
0343 #include <rtems/confdefs.h>