File indexing completed on 2025-05-11 08:24:45
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 #ifdef HAVE_CONFIG_H
0030 #include "config.h"
0031 #endif
0032
0033 #include <tmacros.h> /* includes bsp.h, stdio, etc... */
0034
0035 const char rtems_test_name[] = "SP 33";
0036
0037
0038 rtems_task Init (rtems_task_argument ignored);
0039
0040 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
0041
0042 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE
0043
0044 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
0045 #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
0046 #define CONFIGURE_MAXIMUM_TASKS 5
0047 #define CONFIGURE_MAXIMUM_BARRIERS 1
0048
0049 #define CONFIGURE_INIT
0050
0051 rtems_task Waiter(
0052 rtems_task_argument number
0053 );
0054
0055 rtems_id Barrier;
0056
0057 int SuccessfulCase;
0058 int DeletedCase;
0059
0060 rtems_task Waiter(
0061 rtems_task_argument number
0062 )
0063 {
0064 rtems_status_code status;
0065 int waiter = (int) number;
0066
0067 printf( "Waiter %d waiting on barrier\n", waiter );
0068 status = rtems_barrier_wait( Barrier, RTEMS_NO_TIMEOUT );
0069
0070 printf( "Waiter %d back from barrier\n", waiter );
0071
0072 if ( SuccessfulCase == TRUE ) {
0073 directive_failed(status, "rtems_barrier_wait");
0074 } else if ( DeletedCase == TRUE ) {
0075 fatal_directive_status(
0076 status,
0077 RTEMS_OBJECT_WAS_DELETED,
0078 "rtems_barrier_wait did not get deleted"
0079 );
0080 }
0081
0082 rtems_task_exit();
0083 }
0084
0085 #include <rtems/confdefs.h>
0086
0087 rtems_task Init(
0088 rtems_task_argument ignored
0089 )
0090 {
0091 rtems_status_code status;
0092 rtems_name name = rtems_build_name('B','A','R','1');
0093 uint32_t released;
0094 rtems_id testId;
0095 rtems_id Tasks[CONFIGURE_MAXIMUM_TASKS-1];
0096 uint32_t i;
0097
0098 TEST_BEGIN();
0099
0100
0101 puts( "rtems_barrier_delete - bad id - INVALID_ID" );
0102 status = rtems_barrier_delete( 100 );
0103 fatal_directive_status(
0104 status,
0105 RTEMS_INVALID_ID,
0106 "rtems_barrier_delete did not return RTEMS_INVALID_ID"
0107 );
0108
0109 puts( "rtems_barrier_release - bad id - INVALID_ID" );
0110 status = rtems_barrier_release( 100, &released );
0111 fatal_directive_status(
0112 status,
0113 RTEMS_INVALID_ID,
0114 "rtems_barrier_release did not return RTEMS_INVALID_ID"
0115 );
0116
0117 puts( "rtems_barrier_wait - bad id - INVALID_ID" );
0118 status = rtems_barrier_wait( 100, 10 );
0119 fatal_directive_status(
0120 status,
0121 RTEMS_INVALID_ID,
0122 "rtems_barrier_wait did not return RTEMS_INVALID_ID"
0123 );
0124
0125
0126 puts( "Create barrier with automatic release and 0 max waiters" );
0127 status = rtems_barrier_create(
0128 name, RTEMS_BARRIER_AUTOMATIC_RELEASE, 0, &Barrier
0129 );
0130 fatal_directive_status(
0131 status,
0132 RTEMS_INVALID_NUMBER,
0133 "rtems_barrier_create did not return RTEMS_INVALID_NUMBER"
0134 );
0135
0136
0137 puts( "rtems_barrier_create - bad name - INVALID_NAME" );
0138 status = rtems_barrier_create(
0139 0, RTEMS_BARRIER_AUTOMATIC_RELEASE, 1, &Barrier);
0140 fatal_directive_status(
0141 status,
0142 RTEMS_INVALID_NAME,
0143 "rtems_barrier_create did not return RTEMS_INVALID_NAME"
0144 );
0145
0146
0147 puts( "rtems_barrier_create - NULL barrier ID - INVALID_ADDRESS" );
0148 status = rtems_barrier_create(name, RTEMS_BARRIER_AUTOMATIC_RELEASE, 1, NULL);
0149 fatal_directive_status(
0150 status,
0151 RTEMS_INVALID_ADDRESS,
0152 "rtems_barrier_create did not return RTEMS_INVALID_ADDRESS"
0153 );
0154
0155
0156 puts( "rtems_barrier_create - OK" );
0157 status = rtems_barrier_create( name, RTEMS_DEFAULT_ATTRIBUTES, 0, &Barrier );
0158 directive_failed(status, "rtems_barrier_create");
0159
0160
0161 puts( "rtems_barrier_create - too many" );
0162 status = rtems_barrier_create( name, RTEMS_DEFAULT_ATTRIBUTES, 0, &Barrier );
0163 fatal_directive_status(
0164 status,
0165 RTEMS_TOO_MANY,
0166 "rtems_barrier_create did not return RTEMS_TOO_MANY"
0167 );
0168
0169 puts( "Check barrier ident" );
0170 status = rtems_barrier_ident( name, &testId );
0171 directive_failed(status, "rtems_barrier_ident");
0172 if ( testId != Barrier ) {
0173 printf( "ERROR -- rtems_barrier_create -- did not get Id expected\n" );
0174 exit( 0 );
0175 }
0176
0177 puts( "Wait on barrier w/timeout and TIMEOUT" );
0178 status = rtems_barrier_wait( Barrier, 25 );
0179 fatal_directive_status(
0180 status,
0181 RTEMS_TIMEOUT,
0182 "rtems_barrier_wait did not timeout"
0183 );
0184
0185
0186 puts( "rtems_barrier_release - NULL return count - INVALID_ADDRESS" );
0187 status = rtems_barrier_release( Barrier, NULL );
0188 fatal_directive_status(
0189 status,
0190 RTEMS_INVALID_ADDRESS,
0191 "rtems_barrier_release bad return pointer"
0192 );
0193
0194
0195 status = rtems_barrier_release( Barrier, &released );
0196 directive_failed(status, "rtems_barrier_release");
0197 if ( released != 0 ) {
0198 printf(
0199 "ERROR -- rtems_barrier_release -- released != 0, = %" PRIu32,
0200 released
0201 );
0202 rtems_test_exit(0);
0203 }
0204
0205
0206 SuccessfulCase = TRUE;
0207 DeletedCase = FALSE;
0208 puts( "\n*** Testing manual release of barrier ***" );
0209 for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0210 status = rtems_task_create(
0211 rtems_build_name('W','A','I','T'),
0212 1,
0213 RTEMS_MINIMUM_STACK_SIZE,
0214 RTEMS_DEFAULT_MODES,
0215 RTEMS_DEFAULT_ATTRIBUTES,
0216 &Tasks[ i ]
0217 );
0218 directive_failed( status, "rtems_task_create of Waiter" );
0219
0220 status = rtems_task_start( Tasks[ i ], Waiter, i );
0221 directive_failed( status, "rtems_task_start of Waiter" );
0222 }
0223
0224 puts( "Delay to let Waiters block" );
0225 status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0226 directive_failed(status, "rtems_task_wake_after");
0227
0228
0229 puts( "Releasing tasks" );
0230 status = rtems_barrier_release( Barrier, &released );
0231 directive_failed(status, "rtems_barrier_release");
0232 if ( released != (CONFIGURE_MAXIMUM_TASKS-1) ) {
0233 printf(
0234 "ERROR -- rtems_barrier_release -- released != %d, = %" PRIu32,
0235 (CONFIGURE_MAXIMUM_TASKS-1),
0236 released
0237 );
0238 rtems_test_exit(0);
0239 }
0240
0241 puts( "Delay to let Waiters print a message" );
0242 status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0243 directive_failed(status, "rtems_task_wake_after");
0244
0245
0246 SuccessfulCase = FALSE;
0247 DeletedCase = TRUE;
0248 puts( "\n*** Testing Deletion of barrier ***" );
0249 for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0250 status = rtems_task_create(
0251 rtems_build_name('W','A','I','T'),
0252 1,
0253 RTEMS_MINIMUM_STACK_SIZE,
0254 RTEMS_DEFAULT_MODES,
0255 RTEMS_DEFAULT_ATTRIBUTES,
0256 &Tasks[ i ]
0257 );
0258 directive_failed( status, "rtems_task_create of Waiter" );
0259
0260 status = rtems_task_start( Tasks[ i ], Waiter, i );
0261 directive_failed( status, "rtems_task_start of Waiter" );
0262 }
0263
0264 puts( "Delay to let Waiters block" );
0265 status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0266 directive_failed(status, "rtems_task_wake_after");
0267
0268 puts( "rtems_barrier_delete - OK" );
0269 status = rtems_barrier_delete( Barrier );
0270 directive_failed(status, "rtems_barrier_delete");
0271
0272 puts( "Delay to let Waiters print a message" );
0273 status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0274 directive_failed(status, "rtems_task_wake_after");
0275
0276
0277 puts( "rtems_barrier_create - OK" );
0278 status = rtems_barrier_create(
0279 name, RTEMS_BARRIER_AUTOMATIC_RELEASE, CONFIGURE_MAXIMUM_TASKS-1, &Barrier
0280 );
0281 directive_failed(status, "rtems_barrier_create");
0282
0283
0284 SuccessfulCase = TRUE;
0285 DeletedCase = FALSE;
0286 puts( "\n*** Testing automatic release of barrier ***" );
0287 for (i=0 ; i<(CONFIGURE_MAXIMUM_TASKS-1) ; i++) {
0288 status = rtems_task_create(
0289 rtems_build_name('W','A','I','T'),
0290 1,
0291 RTEMS_MINIMUM_STACK_SIZE,
0292 RTEMS_DEFAULT_MODES,
0293 RTEMS_DEFAULT_ATTRIBUTES,
0294 &Tasks[ i ]
0295 );
0296 directive_failed( status, "rtems_task_create of Waiter" );
0297
0298 status = rtems_task_start( Tasks[ i ], Waiter, i );
0299 directive_failed( status, "rtems_task_start of Waiter" );
0300 }
0301
0302 puts( "Delay to let task wait on barrier" );
0303 status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() );
0304 directive_failed(status, "rtems_task_wake_after");
0305
0306
0307 TEST_END();
0308 rtems_test_exit(0);
0309 }