rtems_task Tasks( rtems_task_argument argument ) { rtems_id id; rtems_status_code status; status = rtems_rate_monotonic_create( 1, &id ); directive_failed( status, "rtems_rate_monotonic_create" ); status = rtems_rate_monotonic_period( id, 100 ); directive_failed( status, "rtems_rate_monotonic_period" ); /* * Give up the processor to allow all tasks to actually * create and start their period timer before the benchmark * timer is initialized. */ (void) rtems_task_wake_after( RTEMS_YIELD_PROCESSOR ); Task_count++; if ( Task_count == 1 ) benchmark_timer_initialize(); (void) rtems_rate_monotonic_period( id, 100 ); }
rtems_task Init( rtems_task_argument argument ) { rtems_status_code status; rtems_id period_id; rtems_interval ticks; uint32_t count; puts( "\n\n*** LED BLINKER -- single period ***" ); LED_INIT(); status = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '1' ), &period_id ); ticks = rtems_clock_get_ticks_per_second(); for (count=0; ; count++) { status = rtems_rate_monotonic_period( period_id, ticks ); if ( (count % 2) == 0 ) LED_OFF(); else LED_ON(); } status = rtems_task_delete( RTEMS_SELF ); }
rtems_task Periodic_Task( rtems_task_argument argument ) { rtems_status_code status; rtems_name period_name = rtems_build_name('P','E','R','a'); rtems_id period_id; rtems_interval start; rtems_interval end; puts( "Periodic - Create Period" ); /* create period */ status = rtems_rate_monotonic_create( period_name, &period_id ); directive_failed(status, "rate_monotonic_create"); partial_loop = 0; while (1) { /* start period with initial value */ status = rtems_rate_monotonic_period( period_id, 25 ); directive_failed(status, "rate_monotonic_period"); partial_loop = 0; start = rtems_clock_get_ticks_since_boot(); end = start + 5; while ( end <= rtems_clock_get_ticks_since_boot() ) ; partial_loop = 1; rtems_task_wake_after( 5 ); } puts( "Periodic - Deleting self" ); rtems_task_delete( RTEMS_SELF ); }
/** * Task which controls the speed of the head based on current location * and based on where the head has to go. */ rtems_task Task1(rtems_task_argument ignored) { rtems_status_code status; rtems_id period_id; rtems_interval ticks; status = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '1' ), &period_id ); ticks = get_ticks_for_period(TASK1_PERIOD); /** * init variables - how long the head does not move * done means we are docked */ int standing_cycles_count = 0; int done = 0; while(1) { status = rtems_rate_monotonic_period( period_id, ticks ); if(status == RTEMS_TIMEOUT) { break; // this is the end. the system missed a deadline, which is fatal. } int state = read_punchpress_state(); // error while aquiring the semaphore if (state < STATE_INITIAL){ break; }else if (state == STATE_DONE) { done = 1; break; }else if (state != STATE_NAVIGATING){ // we are capable of navigation only. anything else is ignored continue; } position_t pos; int read_status = read_position_from_queue(&pos, &standing_cycles_count); if (read_status == CONTINUE) continue; standing_cycles_count = 0; newdest = 0; compute_new_speed_and_set(pos); } if (done == 1) { rtems_rate_monotonic_delete(period_id); rtems_task_delete(RTEMS_SELF); /* should not return */ exit(1); } printf("ERROR! DEADLINE MISSED IN TASK CONTROLLING SPEED!\n"); exit(1); }
static bool test_body( void *arg ) { rtems_status_code sc; (void) arg; sc = rtems_rate_monotonic_cancel( Period ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); sc = rtems_rate_monotonic_period( Period, 1 ); rtems_test_assert( sc == RTEMS_SUCCESSFUL ); sc = rtems_rate_monotonic_period( Period, 1 ); rtems_test_assert( sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT ); return case_hit; }
rtems_task Init( rtems_task_argument ignored ) { rtems_status_code sc; rtems_id period1; rtems_id period2; puts( "\n\n*** TEST 60 ***" ); puts( "Init - rtems_rate_monotonic_create - first period" ); sc = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '1' ), &period1 ); directive_failed( sc, "rtems_rate_monotonic_create 1" ); puts( "Init - rtems_rate_monotonic_create - second period" ); sc = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '2' ), &period2 ); directive_failed( sc, "rtems_rate_monotonic_create 1" ); puts( "Init - rtems_rate_monotonic_period - short period" ); sc = rtems_rate_monotonic_period(period1, RTEMS_MILLISECONDS_TO_TICKS(200) ); directive_failed( sc, "rtems_rate_monotonic_period" ); puts( "Init - rtems_rate_monotonic_period - long period initiated" ); sc = rtems_rate_monotonic_period(period2, RTEMS_MILLISECONDS_TO_TICKS(1000) ); directive_failed( sc, "rtems_rate_monotonic_period" ); puts( "Init - rtems_rate_monotonic_period - long period block" ); sc = rtems_rate_monotonic_period(period2, RTEMS_MILLISECONDS_TO_TICKS(1000) ); directive_failed( sc, "rtems_rate_monotonic_period" ); puts( "Init - rtems_rate_monotonic_period - verify long period expired" ); sc = rtems_rate_monotonic_period(period1, RTEMS_PERIOD_STATUS ); fatal_directive_status(sc, RTEMS_TIMEOUT, "rtems_task_period status"); puts( "*** END OF TEST 60 ***" ); rtems_test_exit(0); }
rtems_task tone_task(rtems_task_argument ignored) { rtems_name period_name; rtems_id period; rtems_status_code status; int last_good_cnt, last_bad_cnt; period_name = rtems_build_name ('T', 'N', 'P', 'D'); status = rtems_rate_monotonic_create (period_name, &period); if (status != RTEMS_SUCCESSFUL) { printf ("tone_task: rate_monotonic_create failed with status %d\n", status); return; } last_good_cnt = tone_good_cnt; last_bad_cnt = tone_bad_cnt; while (1) { if (rtems_rate_monotonic_period (period, ticks_per_sec/50) == RTEMS_TIMEOUT) { /* I'd like to do a printf here, but that would make us miss our next timeout, until the end of time... */ tone_task_timeouts++; } if ((last_good_cnt == tone_good_cnt) && (last_bad_cnt == tone_bad_cnt)) { /* Haven't heard anything for 20ms - no tone. */ tone_good = 0; tone_good_cnt = 0; tone_bad_cnt = 0; } last_good_cnt = tone_good_cnt; last_bad_cnt = tone_bad_cnt; } }
rtems_task Init( rtems_task_argument ignored ) { rtems_status_code sc; int resets; TEST_BEGIN(); puts( "Init - Trying to generate period ending while blocking" ); puts( "Init - rtems_rate_monotonic_create - OK" ); sc = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '1' ), &Period ); directive_failed( sc, "rtems_rate_monotonic_create" ); Main_task = rtems_task_self(); interrupt_critical_section_test_support_initialize( test_release_from_isr ); case_hit = false; for (resets=0 ; case_hit == false && resets< 2 ;) { if ( interrupt_critical_section_test_support_delay() ) resets++; sc = rtems_rate_monotonic_period( Period, 1 ); if ( sc == RTEMS_TIMEOUT ) continue; directive_failed( sc, "rtems_monotonic_period"); } if ( case_hit ) { puts( "Init - It appears the case has been hit" ); TEST_END(); } else puts( "Init - Case not hit - ran too long" ); rtems_test_exit(0); }
rtems_task Task_1_through_6( rtems_task_argument argument ) { rtems_id rmid; rtems_id test_rmid; int index; int pass; uint32_t failed; rtems_status_code status; status = rtems_rate_monotonic_create( argument, &rmid ); directive_failed( status, "rtems_rate_monotonic_create" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_create id = 0x%08" PRIxrtems_id "\n", rmid ); status = rtems_rate_monotonic_ident( argument, &test_rmid ); directive_failed( status, "rtems_rate_monotonic_ident" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_ident id = 0x%08" PRIxrtems_id "\n", test_rmid ); if ( rmid != test_rmid ) { printf( "RMID's DO NOT MATCH (0x%" PRIxrtems_id " and 0x%" PRIxrtems_id ")\n", rmid, test_rmid ); rtems_test_exit( 0 ); } put_name( Task_name[ argument ], FALSE ); printf( "- (0x%08" PRIxrtems_id ") period %" PRIu32 "\n", rmid, Periods[ argument ] ); status = rtems_task_wake_after( 2 ); directive_failed( status, "rtems_task_wake_after" ); switch ( argument ) { case 1: case 2: case 3: case 4: while ( FOREVER ) { status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period" ); Count.count[ argument ]++; } break; case 5: pass = 0; failed = 0; status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" ); Get_all_counters(); while ( FOREVER ) { status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" ); Get_all_counters(); for( index = 1 ; index <= 4 ; index++ ) { if ( Temporary_count.count[ index ] != Iterations[ index ] ) { puts_nocr( "FAIL -- " ); put_name ( Task_name[ index ], FALSE ); printf ( " Actual=%" PRIu32 ", Expected=%" PRIu32 "\n", Temporary_count.count[ index ], Iterations[ index ] ); failed += 1; } } if ( failed == 5 ) rtems_test_exit( 0 ); pass += 1; printf( "TA5 - PERIODS CHECK OK (%d)\n", pass ); fflush( stdout ); if ( pass == 10 ) { TEST_END(); rtems_test_exit( 0 ); } } break; case 6: /* test changing periods */ { uint32_t time[TA6_ITERATIONS+1]; rtems_interval period; period = 1*TA6_PERIOD_FACTOR; status = rtems_rate_monotonic_period( rmid, period); directive_failed( status, "rtems_rate_monotonic_period of TA6" ); time[0] = _Watchdog_Ticks_since_boot; /* timestamp */ /*printf("%d - %d\n", period, time[0]);*/ for (index = 1; index <= TA6_ITERATIONS; index++) { period = (index+1)*TA6_PERIOD_FACTOR; status = rtems_rate_monotonic_period( rmid, period); directive_failed( status, "rtems_rate_monotonic_period of TA6" ); time[index] = _Watchdog_Ticks_since_boot; /* timestamp */ /*printf("%d - %d\n", period, time[index]);*/ } for (index = 1; index <= TA6_ITERATIONS; index++) { rtems_interval meas = time[index] - time[index-1]; period = index*TA6_PERIOD_FACTOR; printf( "TA6 - Actual: %" PRIdrtems_interval " Expected: %" PRIdrtems_interval, meas, period ); if (period == meas) printf(" - OK\n"); else printf(" - FAILED\n"); } } rtems_task_suspend(RTEMS_SELF); break; } }
rtems_task Init( rtems_task_argument argument ) { rtems_id id; uint32_t index; rtems_status_code status; Print_Warning(); puts( "\n\n*** TIME TEST 29 ***" ); Period_name = rtems_build_name( 'P', 'R', 'D', ' ' ); benchmark_timer_initialize(); (void) rtems_rate_monotonic_create( Period_name, &id ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_create", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_CREATE ); benchmark_timer_initialize(); (void) rtems_rate_monotonic_period( id, 10 ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_period: initiate period -- returns to caller", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD ); benchmark_timer_initialize(); (void) rtems_rate_monotonic_period( id, RTEMS_PERIOD_STATUS ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_period: obtain status", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_PERIOD ); benchmark_timer_initialize(); (void) rtems_rate_monotonic_cancel( id ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_cancel", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_CANCEL ); benchmark_timer_initialize(); (void) rtems_rate_monotonic_delete( id ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_delete: inactive", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_DELETE ); status = rtems_rate_monotonic_create( Period_name, &id ); directive_failed( status, "rtems_rate_monotonic_create" ); status = rtems_rate_monotonic_period( id, 10 ); directive_failed( status, "rtems_rate_monotonic_period" ); benchmark_timer_initialize(); rtems_rate_monotonic_delete( id ); end_time = benchmark_timer_read(); put_time( "rtems_rate_monotonic_delete: active", end_time, 1, 0, CALLING_OVERHEAD_RATE_MONOTONIC_DELETE ); #define LOOP_TASK_PRIORITY ((RTEMS_MAXIMUM_PRIORITY / 2u) + 1u) for ( index=1 ; index <= OPERATION_COUNT ; index++ ) { status = rtems_task_create( rtems_build_name( 'T', 'E', 'S', 'T' ), LOOP_TASK_PRIORITY, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &id ); directive_failed( status, "rtems_task_create LOOP" ); status = rtems_task_start( id, Tasks, 0 ); directive_failed( status, "rtems_task_start LOOP" ); } #define MIDDLE_PRIORITY (RTEMS_MAXIMUM_PRIORITY - 2u) status = rtems_task_create( rtems_build_name( 'L', 'O', 'W', ' ' ), MIDDLE_PRIORITY, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &id ); directive_failed( status, "rtems_task_create LOW" ); status = rtems_task_start( id, Low_task, 0 ); directive_failed( status, "rtems_task_start LOW" ); Task_count = 0; status = rtems_task_delete( RTEMS_SELF ); directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); }
rtems_task Init( rtems_task_argument argument ) { rtems_id period_id; rtems_name period_name; rtems_rate_monotonic_period_status period_status; rtems_status_code status; rtems_rate_monotonic_period_statistics statistics; int i; period_name = rtems_build_name('P','E','R','1'); puts( "\n\n*** TEST 69 ***" ); /* create period */ status = rtems_rate_monotonic_create( period_name, &period_id ); directive_failed( status, "rate_monotonic_create" ); /* * Check get_status on an inactive period. */ puts( "rtems_rate_monotonic_get_status - verify values of an inactive period" ); status = rtems_rate_monotonic_get_status( period_id, &period_status ); directive_failed( status, "rate_monotonic_get_status" ); /* Check status values. */ rtems_test_assert( period_status.owner == rtems_task_self() ); rtems_test_assert( period_status.state == RATE_MONOTONIC_INACTIVE ); #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ rtems_test_assert( period_status.since_last_period.tv_sec == 0 ); rtems_test_assert( period_status.since_last_period.tv_nsec == 0 ); rtems_test_assert( period_status.executed_since_last_period.tv_sec == 0 ); rtems_test_assert( period_status.executed_since_last_period.tv_nsec == 0 ); #else rtems_test_assert( period_status.since_last_period == 0 ); rtems_test_assert( period_status.executed_since_last_period == 0 ); #endif /* * Check get_status error cases. */ puts( "rtems_rate_monotonic_get_status - check RTEMS_NOT_DEFINED" ); /* Do some work to get a non-zero cpu usage */ rtems_test_spin_for_ticks( 10 ); status = rtems_rate_monotonic_period( period_id, 100 ); directive_failed( status, "rate_monotonic_period" ); /* Do some more work */ rtems_test_spin_for_ticks( 10 ); /* Reset the cpu usage statistics. */ rtems_cpu_usage_reset(); /* Status should be undefined. */ status = rtems_rate_monotonic_get_status( period_id, &period_status ); fatal_directive_status( status, RTEMS_NOT_DEFINED, "rtems_rate_monotonic_get_status after cpu usage reset" ); /* Clean up. */ status = rtems_rate_monotonic_cancel( period_id ); directive_failed( status, "rate_monotonic_cancel" ); /* * Check normal get_status results. */ puts( "rtems_rate_monotonic_get_status - verify values of an active period" ); rtems_test_spin_until_next_tick(); status = rtems_rate_monotonic_period( period_id, 100 ); directive_failed( status, "rate_monotonic_period" ); /* Do some work */ rtems_test_spin_for_ticks( 10 ); /* Block a little */ status = rtems_task_wake_after( 50 ); /* Check the status */ status = rtems_rate_monotonic_get_status( period_id, &period_status ); directive_failed( status, "rate_monotonic_get_status" ); /* Check status values. */ #ifndef __RTEMS_USE_TICKS_FOR_STATISTICS__ /* Note: POSIX mandates struct timespec->tv_nsec to be a "long" */ printf( "wall time should be ~600000000 is %ld\n", period_status.since_last_period.tv_nsec ); printf( "cpu time should be ~100000000 is %ld\n", period_status.executed_since_last_period.tv_nsec ); rtems_test_assert( period_status.since_last_period.tv_sec == 0 ); rtems_test_assert( period_status.since_last_period.tv_nsec >= 600000000 ); rtems_test_assert( period_status.since_last_period.tv_nsec <= 610000000 ); rtems_test_assert( period_status.executed_since_last_period.tv_sec == 0 ); rtems_test_assert( period_status.executed_since_last_period.tv_nsec >= 100000000 ); rtems_test_assert( period_status.executed_since_last_period.tv_nsec <= 110000000 ); #else printf( "wall time should be ~60 is %" PRId32 "\n", (int) period_status.since_last_period ); printf( "cpu time should be ~10 is %" PRId32 "\n", (int) period_status.executed_since_last_period ); rtems_test_assert( period_status.since_last_period >= 60 ); rtems_test_assert( period_status.since_last_period <= 61 ); rtems_test_assert( period_status.executed_since_last_period >= 10 ); rtems_test_assert( period_status.executed_since_last_period <= 12 ); #endif /* ensure the missed periods are properly accounted for */ puts( "rtems_rate_monotonic_cancel - OK" ); status = rtems_rate_monotonic_cancel( period_id ); directive_failed( status, "rate_monotonic_cancel" ); puts( "Testing statistics on missed periods" ); rtems_test_spin_until_next_tick(); status = rtems_rate_monotonic_period( period_id, 50 ); directive_failed( status, "rate_monotonic_period above loop" ); for ( i=1 ; i <= 3 ; i++ ) { status = rtems_task_wake_after( 100 ); directive_failed( status, "rtems_task_wake_after(100)" ); rtems_test_spin_until_next_tick(); status = rtems_rate_monotonic_period( period_id, 50 ); fatal_directive_status( status, RTEMS_TIMEOUT, "rtems_rate_monotonic_period 2-n" ); status = rtems_rate_monotonic_get_statistics( period_id, &statistics ); directive_failed( status, "rate_monotonic_get_statistics" ); if ( statistics.missed_count != i ) { printf( "Expected %d got %" PRIu32 " for missed_count\n", i, statistics.missed_count ); } rtems_test_assert( statistics.missed_count == i ); } puts( "*** END OF TEST 69 ***" ); rtems_test_exit(0); }
rtems_task Task2(rtems_task_argument ignored) { rtems_status_code status; rtems_id period_id; rtems_interval ticks; status = rtems_rate_monotonic_create( rtems_build_name( 'P', 'E', 'R', '2' ), &period_id ); ticks = get_ticks_for_period(50); // the punching will start with the first hole int hole_to_punch = 0; // we are about to punch holes_total_count holes int holes_total_count = 4; int error = 0; int done = 0; while(1) { status = rtems_rate_monotonic_period( period_id, ticks ); if(status == RTEMS_TIMEOUT) { break; // this is the end. the system missed a deadline, which is fatal. } int state = read_punchpress_state(); if (state < STATE_INITIAL) break; switch (state) { case STATE_READY: plan_movement(hole_to_punch, holes_total_count); break; case STATE_PUNCH_READY: punch(hole_to_punch, holes_total_count); break; case STATE_PUNCHING: control_punch(&hole_to_punch); break; case STATE_RETRACT: control_retract(); break; case STATE_NAVIGATING: break; case STATE_DONE: done = 1; break; default: error = 1; break; } if ((error + done) > 0){ break; } } if (error > 0) { printf("ERROR! SOMETHING WENT WRONG (UNEXPECTED STATE OR DEADLINE MISSED) IN TASK CONTROLLING PUNCHING!\n"); exit(1); } outport_byte(OUT_PUNCH_IRQ, 0); rtems_rate_monotonic_delete(period_id); rtems_semaphore_delete(state_semaphore_id); rtems_interrupt_handler_remove(5, isr, NULL); /** * The only way to shutdown the app is to invoke exit() before deleting the "last" task. * Since it is not very nice and it is not used in example apps, just delete the task. **/ rtems_task_delete(RTEMS_SELF); }
rtems_task Task_Periodic( rtems_task_argument argument ) { rtems_id rmid; rtems_status_code status; time_t approved_budget, exec_time, abs_time, remaining_budget; int start, stop, now; rtems_cbs_server_id server_id = 0, tsid; rtems_cbs_parameters params, tparams; params.deadline = Period; params.budget = Execution+1; /* Taks 1 will be attached to a server, task 2 not. */ if ( argument == 1 ) { printf( "Periodic task: Create server and Attach thread\n" ); if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) printf( "ERROR: CREATE SERVER FAILED\n" ); if ( rtems_cbs_attach_thread( server_id, Task_id ) ) printf( "ERROR: ATTACH THREAD FAILED\n" ); printf( "Periodic task: ID and Get parameters\n" ); if ( rtems_cbs_get_server_id( Task_id, &tsid ) ) printf( "ERROR: GET SERVER ID FAILED\n" ); if ( tsid != server_id ) printf( "ERROR: SERVER ID MISMATCH\n" ); if ( rtems_cbs_get_parameters( server_id, &tparams ) ) printf( "ERROR: GET PARAMETERS FAILED\n" ); if ( params.deadline != tparams.deadline || params.budget != tparams.budget ) printf( "ERROR: PARAMETERS MISMATCH\n" ); printf( "Periodic task: Detach thread and Destroy server\n" ); if ( rtems_cbs_detach_thread( server_id, Task_id ) ) printf( "ERROR: DETACH THREAD FAILED\n" ); if ( rtems_cbs_destroy_server( server_id ) ) printf( "ERROR: DESTROY SERVER FAILED\n" ); if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) printf( "ERROR: CREATE SERVER FAILED\n" ); printf( "Periodic task: Remaining budget and Execution time\n" ); if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget ) ) printf( "ERROR: GET REMAINING BUDGET FAILED\n" ); if ( remaining_budget != params.budget ) printf( "ERROR: REMAINING BUDGET MISMATCH\n" ); if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) ) printf( "ERROR: GET EXECUTION TIME FAILED\n" ); printf( "Periodic task: Set parameters\n" ); if ( rtems_cbs_attach_thread( server_id, Task_id ) ) printf( "ERROR: ATTACH THREAD FAILED\n" ); params.deadline = Period * 2; params.budget = Execution * 2 +1; if ( rtems_cbs_set_parameters( server_id, ¶ms ) ) printf( "ERROR: SET PARAMS FAILED\n" ); if ( rtems_cbs_get_parameters( server_id, &tparams ) ) printf( "ERROR: GET PARAMS FAILED\n" ); if ( params.deadline != tparams.deadline || params.budget != tparams.budget ) printf( "ERROR: PARAMS MISMATCH\n" ); params.deadline = Period; params.budget = Execution+1; if ( rtems_cbs_set_parameters( server_id, ¶ms ) ) printf( "ERROR: SET PARAMS FAILED\n" ); if ( rtems_cbs_get_approved_budget( server_id, &approved_budget ) ) printf( "ERROR: GET APPROVED BUDGET FAILED\n" ); printf( "Periodic task: Approved budget\n" ); if ( approved_budget != params.budget ) printf( "ERROR: APPROVED BUDGET MISMATCH\n" ); } status = rtems_rate_monotonic_create( argument, &rmid ); directive_failed( status, "rtems_rate_monotonic_create" ); /* Starting periodic behavior of the task */ printf( "Periodic task: Starting periodic behavior\n" ); status = rtems_task_wake_after( 1 + Phase ); directive_failed( status, "rtems_task_wake_after" ); while ( FOREVER ) { if ( rtems_rate_monotonic_period(rmid, Period) == RTEMS_TIMEOUT ) printf( "P%" PRIdPTR " - Deadline miss\n", argument ); start = rtems_clock_get_ticks_since_boot(); printf( "P%" PRIdPTR "-S ticks:%d\n", argument, start ); if ( start > 4*Period+Phase ) break; /* stop */ /* active computing */ while(FOREVER) { now = rtems_clock_get_ticks_since_boot(); if ( now >= start + Execution ) break; if ( server_id != 0 ) { if ( rtems_cbs_get_execution_time( server_id, &exec_time, &abs_time ) ) printf( "ERROR: GET EXECUTION TIME FAILED\n" ); if ( rtems_cbs_get_remaining_budget( server_id, &remaining_budget) ) printf( "ERROR: GET REMAINING BUDGET FAILED\n" ); if ( (remaining_budget + exec_time) > (Execution + 1) ) { printf( "ERROR: REMAINING BUDGET AND EXECUTION TIME MISMATCH\n" ); rtems_test_exit( 0 ); } } } stop = rtems_clock_get_ticks_since_boot(); printf( "P%" PRIdPTR "-F ticks:%d\n", argument, stop ); } /* delete period and SELF */ status = rtems_rate_monotonic_delete( rmid ); if ( status != RTEMS_SUCCESSFUL ) { printf("rtems_rate_monotonic_delete failed with status of %d.\n", status); rtems_test_exit( 0 ); } printf( "Periodic task: Deleting self\n" ); status = rtems_task_delete( RTEMS_SELF ); directive_failed( status, "rtems_task_delete of RTEMS_SELF" ); }
void Screen10() { rtems_rate_monotonic_period_status period_status; rtems_status_code status; /* * Check create error cases. */ status = rtems_rate_monotonic_create( Period_name[ 1 ], NULL ); fatal_directive_status( status, RTEMS_INVALID_ADDRESS, "rtems_rate_monotonic_create with NULL param" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_ADDRESS" ); status = rtems_rate_monotonic_create( 0, &Junk_id ); fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_rate_monotonic_create with illegal name" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME" ); status = rtems_rate_monotonic_create( Period_name[ 1 ], &Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_create successful" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_create( Period_name[ 1 ], &Junk_id ); fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_rate_monotonic_create of too many" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY" ); /* * Check ident error cases. */ status = rtems_rate_monotonic_ident( 0, &Junk_id ); fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_rate_monotonic_ident with illegal name" ); puts( "TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME" ); /* * Check period error cases. */ status = rtems_rate_monotonic_period( 100, 5 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_period with illegal id" ); puts( "TA1 - rtems_rate_monotonic_period - RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_period( rtems_build_id( 1, 1, 1, 256 ), 5 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_period with illegal id" ); puts( "TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS ); fatal_directive_status( status, RTEMS_NOT_DEFINED, "rtems_rate_monotonic_period status not defined" ); puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 100 ); directive_failed( status, "rtems_rate_monotonic_period successful" ); puts( "TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS ); directive_failed( status, "rtems_rate_monotonic_period status" ); puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL" ); while ( FOREVER ) { status = rtems_rate_monotonic_period(Period_id[ 1 ], RTEMS_PERIOD_STATUS); if ( status == RTEMS_TIMEOUT ) break; directive_failed( status, "rtems_rate_monotonic_period waiting for timeout" ); rtems_task_wake_after( 1 ); } puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT" ); /* * Check get_statistics error cases. */ status = rtems_rate_monotonic_get_statistics( Period_id[ 1 ], NULL ); fatal_directive_status( status, RTEMS_INVALID_ADDRESS, "rtems_rate_monotonic_get_statistics with NULL param" ); puts( "TA1 - rtems_rate_monotonic_get_statistics - RTEMS_INVALID_ADDRESS" ); /* * Check get_status error cases. */ status = rtems_rate_monotonic_get_status( Period_id[ 1 ], NULL ); fatal_directive_status( status, RTEMS_INVALID_ADDRESS, "rtems_rate_monotonic_get_status with NULL param" ); puts( "TA1 - rtems_rate_monotonic_get_status - RTEMS_INVALID_ADDRESS" ); status = rtems_rate_monotonic_get_status( 100, &period_status ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_get_status with illegal id" ); puts( "TA1 - rtems_rate_monotonic_get_status - RTEMS_INVALID_ID" ); /* * Check cancel error cases. */ status = rtems_rate_monotonic_cancel( 100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_cancel with illegal id" ); puts( "TA1 - rtems_rate_monotonic_cancel - RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_cancel( rtems_build_id( 1, 1, 1, 256 ) ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_cancel will illegal id" ); puts( "TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_cancel( Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_cancel" ); puts( "TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 ); directive_failed( status, "rtems_rate_monotonic_period restart" ); status = rtems_task_wake_after( rtems_clock_get_ticks_per_second() ); directive_failed( status, "rtems_task_wake_after" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 ); fatal_directive_status( status, RTEMS_TIMEOUT, "rtems_rate_monotonic_period" ); puts( "TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT" ); status = rtems_task_start( Task_id[ 4 ], Task_4, 0 ); directive_failed( status, "rtems_task_start of TA4" ); puts( "TA1 - yielding to TA4" ); status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR ); /* * Check delete error cases. */ status = rtems_rate_monotonic_delete( 100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_delete with illegal id" ); puts( "TA1 - rtems_rate_monotonic_delete - RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_delete( rtems_build_id( 1, 1, 1, 256 ) ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_delete with illegal id" ); puts( "TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_delete( Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_delete" ); puts( "TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL" ); }
rtems_task Task_Periodic( rtems_task_argument argument ) { rtems_id rmid; rtems_status_code status; time_t approved_budget, exec_time, abs_time, current_budget; int start, stop, now; qres_sid_t server_id, tsid; qres_params_t params, tparams; params.P = Period; params.Q = Execution+1; printf( "Periodic task: Create server and Attach thread\n" ); if ( qres_create_server( ¶ms, &server_id ) ) printf( "ERROR: CREATE SERVER FAILED\n" ); if ( qres_attach_thread( server_id, 0, Task_id ) ) printf( "ERROR: ATTACH THREAD FAILED\n" ); printf( "Periodic task: ID and Get parameters\n" ); if ( qres_get_sid( 0, Task_id, &tsid ) ) printf( "ERROR: GET SERVER ID FAILED\n" ); if ( tsid != server_id ) printf( "ERROR: SERVER ID MISMATCH\n" ); if ( qres_get_params( server_id, &tparams ) ) printf( "ERROR: GET PARAMETERS FAILED\n" ); if ( params.P != tparams.P || params.Q != tparams.Q ) printf( "ERROR: PARAMETERS MISMATCH\n" ); printf( "Periodic task: Detach thread and Destroy server\n" ); if ( qres_detach_thread( server_id, 0, Task_id ) ) printf( "ERROR: DETACH THREAD FAILED\n" ); if ( qres_destroy_server( server_id ) ) printf( "ERROR: DESTROY SERVER FAILED\n" ); if ( qres_create_server( ¶ms, &server_id ) ) printf( "ERROR: CREATE SERVER FAILED\n" ); printf( "Periodic task: Current budget and Execution time\n" ); if ( qres_get_curr_budget( server_id, ¤t_budget ) ) printf( "ERROR: GET REMAINING BUDGET FAILED\n" ); if ( current_budget != params.Q ) printf( "ERROR: REMAINING BUDGET MISMATCH\n" ); if ( qres_get_exec_time( server_id, &exec_time, &abs_time ) ) printf( "ERROR: GET EXECUTION TIME FAILED\n" ); printf( "Periodic task: Set parameters\n" ); if ( qres_attach_thread( server_id, 0, Task_id ) ) printf( "ERROR: ATTACH THREAD FAILED\n" ); params.P = Period * 2; params.Q = Execution * 2 +1; if ( qres_set_params( server_id, ¶ms ) ) printf( "ERROR: SET PARAMS FAILED\n" ); if ( qres_get_params( server_id, &tparams ) ) printf( "ERROR: GET PARAMS FAILED\n" ); if ( params.P != tparams.P || params.Q != tparams.Q ) printf( "ERROR: PARAMS MISMATCH\n" ); params.P = Period; params.Q = Execution+1; if ( qres_set_params( server_id, ¶ms ) ) printf( "ERROR: SET PARAMS FAILED\n" ); if ( qres_get_appr_budget( server_id, &approved_budget ) ) printf( "ERROR: GET APPROVED BUDGET FAILED\n" ); printf( "Periodic task: Approved budget\n" ); if ( approved_budget != params.Q ) printf( "ERROR: APPROVED BUDGET MISMATCH\n" ); status = rtems_rate_monotonic_create( argument, &rmid ); directive_failed( status, "rtems_rate_monotonic_create" ); /* Starting periodic behavior of the task */ printf( "Periodic task: Starting periodic behavior\n" ); status = rtems_task_wake_after( 1 + Phase ); directive_failed( status, "rtems_task_wake_after" ); while ( FOREVER ) { if ( rtems_rate_monotonic_period(rmid, Period) == RTEMS_TIMEOUT ) printf( "P%" PRIdPTR " - Deadline miss\n", argument ); start = rtems_clock_get_ticks_since_boot(); printf( "P%" PRIdPTR "-S ticks:%d\n", argument, start ); if ( start > 4*Period+Phase ) break; /* stop */ /* active computing */ while(FOREVER) { now = rtems_clock_get_ticks_since_boot(); if ( now >= start + Execution ) break; if ( qres_get_exec_time( server_id, &exec_time, &abs_time ) ) printf( "ERROR: GET EXECUTION TIME FAILED\n" ); if ( qres_get_curr_budget( server_id, ¤t_budget) ) printf( "ERROR: GET CURRENT BUDGET FAILED\n" ); if ( (current_budget + exec_time) > (Execution + 1) ) { printf( "ERROR: CURRENT BUDGET AND EXECUTION TIME MISMATCH\n" ); rtems_test_exit( 0 ); } } stop = rtems_clock_get_ticks_since_boot(); printf( "P%" PRIdPTR "-F ticks:%d\n", argument, stop ); } /* delete period and SELF */ status = rtems_rate_monotonic_delete( rmid ); if ( status != RTEMS_SUCCESSFUL ) { printf("rtems_rate_monotonic_delete failed with status of %d.\n", status); rtems_test_exit( 0 ); } if ( qres_cleanup() ) printf( "ERROR: QRES CLEANUP\n" ); fflush(stdout); TEST_END(); rtems_test_exit( 0 ); }
rtems_task Task_1( rtems_task_argument argument ) { rtems_name name RTEMS_GCC_NOWARN_UNUSED; uint32_t index RTEMS_GCC_NOWARN_UNUSED; rtems_id id RTEMS_GCC_NOWARN_UNUSED; rtems_task_priority in_priority RTEMS_GCC_NOWARN_UNUSED; rtems_task_priority out_priority RTEMS_GCC_NOWARN_UNUSED; rtems_mode in_mode RTEMS_GCC_NOWARN_UNUSED; rtems_mode mask RTEMS_GCC_NOWARN_UNUSED; rtems_mode out_mode RTEMS_GCC_NOWARN_UNUSED; rtems_time_of_day time RTEMS_GCC_NOWARN_UNUSED; rtems_interval timeout RTEMS_GCC_NOWARN_UNUSED; rtems_signal_set signals RTEMS_GCC_NOWARN_UNUSED; void *address_1 RTEMS_GCC_NOWARN_UNUSED; rtems_event_set events RTEMS_GCC_NOWARN_UNUSED; long buffer[ 4 ] RTEMS_GCC_NOWARN_UNUSED; uint32_t count RTEMS_GCC_NOWARN_UNUSED; rtems_device_major_number major RTEMS_GCC_NOWARN_UNUSED; rtems_device_minor_number minor RTEMS_GCC_NOWARN_UNUSED; uint32_t io_result RTEMS_GCC_NOWARN_UNUSED; uint32_t error RTEMS_GCC_NOWARN_UNUSED; rtems_clock_get_options options RTEMS_GCC_NOWARN_UNUSED; name = rtems_build_name( 'N', 'A', 'M', 'E' ); in_priority = 250; in_mode = RTEMS_NO_PREEMPT; mask = RTEMS_PREEMPT_MASK; timeout = 100; signals = RTEMS_SIGNAL_1 | RTEMS_SIGNAL_3; major = 10; minor = 0; error = 100; options = 0; /* rtems_shutdown_executive */ benchmark_timer_initialize(); for ( index=1 ; index <= OPERATION_COUNT ; index++ ) (void) rtems_shutdown_executive( error ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_shutdown_executive", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_create( name, in_priority, RTEMS_MINIMUM_STACK_SIZE, RTEMS_DEFAULT_MODES, RTEMS_DEFAULT_ATTRIBUTES, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_ident( name, RTEMS_SEARCH_ALL_NODES, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_start */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_start( id, Task_1, 0 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_start", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_restart */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_restart( id, 0 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_restart", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_suspend */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_suspend( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_suspend", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_resume */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_resume( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_resume", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_set_priority */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_set_priority( id, in_priority, &out_priority ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_set_priority", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_mode */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_mode( in_mode, mask, &out_mode ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_mode", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_wake_when */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_wake_when( time ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_wake_when", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_task_wake_after */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_task_wake_after( timeout ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_task_wake_after", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_interrupt_catch */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_interrupt_catch( Isr_handler, 5, address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_interrupt_catch", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_clock_get */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_clock_get( options, time ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_clock_get", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_clock_set */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_clock_set( time ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_clock_set", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_clock_tick */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_clock_tick(); end_time = benchmark_timer_read(); put_time( "overhead: rtems_clock_tick", end_time, OPERATION_COUNT, overhead, 0 ); rtems_test_pause(); /* rtems_timer_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_create( name, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_ident( name, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_fire_after */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_fire_after( id, timeout, Timer_handler, NULL ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_fire_after", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_fire_when */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_fire_when( id, time, Timer_handler, NULL ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_fire_when", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_reset */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_reset( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_reset", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_timer_cancel */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_timer_cancel( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_timer_cancel", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_semaphore_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_semaphore_create( name, 128, RTEMS_DEFAULT_ATTRIBUTES, RTEMS_NO_PRIORITY, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_semaphore_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_semaphore_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_semaphore_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_semaphore_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_semaphore_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_semaphore_ident( name, RTEMS_SEARCH_ALL_NODES, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_semaphore_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_semaphore_obtain */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_semaphore_obtain( id, RTEMS_DEFAULT_OPTIONS, timeout ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_semaphore_obtain", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_semaphore_release */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_semaphore_release( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_semaphore_release", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_create( name, 128, RTEMS_DEFAULT_ATTRIBUTES, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_ident( name, RTEMS_SEARCH_ALL_NODES, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_send */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_send( id, (long (*)[4])buffer ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_send", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_urgent */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_urgent( id, (long (*)[4])buffer ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_urgent", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_broadcast */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_broadcast( id, (long (*)[4])buffer, &count ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_broadcast", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_receive */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_receive( id, (long (*)[4])buffer, RTEMS_DEFAULT_OPTIONS, timeout ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_receive", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_message_queue_flush */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_message_queue_flush( id, &count ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_message_queue_flush", end_time, OPERATION_COUNT, overhead, 0 ); rtems_test_pause(); /* rtems_event_send */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_event_send( id, events ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_event_send", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_event_receive */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_event_receive( RTEMS_EVENT_16, RTEMS_DEFAULT_OPTIONS, timeout, &events ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_event_receive", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_signal_catch */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_signal_catch( Asr_handler, RTEMS_DEFAULT_MODES ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_signal_catch", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_signal_send */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_signal_send( id, signals ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_signal_send", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_partition_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_partition_create( name, Memory_area, 2048, 128, RTEMS_DEFAULT_ATTRIBUTES, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_partition_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_partition_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_partition_ident( name, RTEMS_SEARCH_ALL_NODES, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_partition_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_partition_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_partition_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_partition_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_partition_get_buffer */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_partition_get_buffer( id, address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_partition_get_buffer", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_partition_return_buffer */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_partition_return_buffer( id, address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_partition_return_buffer", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_region_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_region_create( name, Memory_area, 2048, 128, RTEMS_DEFAULT_ATTRIBUTES, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_region_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_region_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_region_ident( name, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_region_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_region_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_region_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_region_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_region_get_segment */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_region_get_segment( id, 243, RTEMS_DEFAULT_OPTIONS, timeout, &address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_region_get_segment", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_region_return_segment */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_region_return_segment( id, address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_region_return_segment", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_port_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_port_create( name, Internal_port_area, External_port_area, 0xff, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_port_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_port_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_port_ident( name, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_port_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_port_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_port_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_port_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_port_external_to_internal */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_port_external_to_internal( id, &External_port_area[ 7 ], address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_port_external_to_internal", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_port_internal_to_external */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_port_internal_to_external( id, &Internal_port_area[ 7 ], address_1 ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_port_internal_to_external", end_time, OPERATION_COUNT, overhead, 0 ); rtems_test_pause(); /* rtems_io_initialize */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_initialize( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_initialize", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_io_open */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_open( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_open", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_io_close */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_close( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_close", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_io_read */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_read( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_read", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_io_write */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_write( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_write", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_io_control */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_io_control( major, minor, address_1, &io_result ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_io_control", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_fatal_error_occurred */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_fatal_error_occurred( error ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_fatal_error_occurred", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_rate_monotonic_create */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_rate_monotonic_create( name, &id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_rate_monotonic_create", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_rate_monotonic_ident */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_rate_monotonic_ident( name, id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_rate_monotonic_ident", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_rate_monotonic_delete */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_rate_monotonic_delete( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_rate_monotonic_delete", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_rate_monotonic_cancel */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_rate_monotonic_cancel( id ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_rate_monotonic_cancel", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_rate_monotonic_period */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_rate_monotonic_period( id, timeout ); end_time = benchmark_timer_read(); put_time( "overhead: rtems_rate_monotonic_period", end_time, OPERATION_COUNT, overhead, 0 ); /* rtems_multiprocessing_announce */ benchmark_timer_initialize(); for ( index = 1 ; index <= OPERATION_COUNT ; index ++ ) (void) rtems_multiprocessing_announce(); end_time = benchmark_timer_read(); put_time( "overhead: rtems_multiprocessing_announce", end_time, OPERATION_COUNT, overhead, 0 ); TEST_END(); rtems_test_exit( 0 ); }
rtems_task Tasks_Periodic( rtems_task_argument argument ) { rtems_id rmid; rtems_id test_rmid; rtems_status_code status; bool scenario_done = 0; int start, stop, now; rtems_cbs_server_id server_id, tsid; rtems_cbs_parameters params, tparams; params.deadline = Periods[ argument ]; params.budget = Execution[ argument ]+1; if ( argument == 4 ) { if ( rtems_cbs_create_server( ¶ms, &overrun_handler_task_4, &server_id )) printf( "ERROR: CREATE SERVER FAILED\n" ); } else { if ( rtems_cbs_create_server( ¶ms, NULL, &server_id ) ) printf( "ERROR: CREATE SERVER FAILED\n" ); } if ( rtems_cbs_attach_thread( server_id, Task_id[ argument ] ) ) printf( "ERROR: ATTACH THREAD FAILED\n" ); if ( rtems_cbs_get_server_id( Task_id[ argument ], &tsid ) ) printf( "ERROR: GET SERVER ID FAILED\n" ); if ( tsid != server_id ) printf( "ERROR: SERVER ID MISMATCH\n" ); if ( rtems_cbs_get_parameters( server_id, &tparams ) ) printf( "ERROR: GET PARAMETERS FAILED\n" ); if ( params.deadline != tparams.deadline || params.budget != tparams.budget ) printf( "ERROR: PARAMETERS MISMATCH\n" ); status = rtems_rate_monotonic_create( argument, &rmid ); directive_failed( status, "rtems_rate_monotonic_create" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_create id = 0x%08" PRIxrtems_id "\n", rmid ); status = rtems_rate_monotonic_ident( argument, &test_rmid ); directive_failed( status, "rtems_rate_monotonic_ident" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_ident id = 0x%08" PRIxrtems_id "\n", test_rmid ); if ( rmid != test_rmid ) { printf( "RMID's DO NOT MATCH (0x%" PRIxrtems_id " and 0x%" PRIxrtems_id ")\n", rmid, test_rmid ); rtems_test_exit( 0 ); } put_name( Task_name[ argument ], FALSE ); printf( "- (0x%08" PRIxrtems_id ") period %" PRIu32 "\n", rmid, Periods[ argument ] ); status = rtems_task_wake_after( 2 + Phases[argument] ); directive_failed( status, "rtems_task_wake_after" ); while (FOREVER) { if (rtems_rate_monotonic_period(rmid, Periods[argument])==RTEMS_TIMEOUT) printf("P%" PRIdPTR " - Deadline miss\n", argument); start = rtems_clock_get_ticks_since_boot(); printf("P%" PRIdPTR "-S ticks:%d\n", argument, start); if ( start >= 2*HP_LENGTH ) break; /* stop */ /* Specific scenario for task 4: tries to exceed announced budget, the task priority has to be pulled down to background. */ now = rtems_clock_get_ticks_since_boot(); if ( !scenario_done && argument == 4 && now >= 200 ) { Violating_task[ argument ] = 1; scenario_done = 1; } /* Specific scenario for task 3: changes scheduling parameters. */ if ( !scenario_done && argument == 3 && now >= 250 ) { Periods[ argument ] = Periods[ argument ] * 2; Execution[ argument ] = Execution[ argument ] * 2; params.deadline = Periods[ argument ]; params.budget = Execution[ argument ]+1; if ( rtems_cbs_set_parameters( server_id, ¶ms) ) printf( "ERROR: SET PARAMETERS FAILED\n" ); if ( rtems_cbs_get_parameters( server_id, &tparams ) ) printf( "ERROR: GET PARAMETERS FAILED\n" ); if ( params.deadline != tparams.deadline || params.budget != tparams.budget ) printf( "ERROR: PARAMETERS MISMATCH\n" ); scenario_done = 1; } /* Specific scenario for task 2: late unblock after being blocked by itself, the task priority has to be pulled down to background. */ if ( !scenario_done && argument == 2 && now >= 500 ) { Violating_task[ argument ] = 1; scenario_done = 1; } if (argument == 2 && Violating_task[ argument ]) rtems_task_wake_after( 10 ); /* active computing */ while(FOREVER) { now = rtems_clock_get_ticks_since_boot(); if ( argument == 4 && !Violating_task[ argument ] && (now >= start + Execution[argument])) break; if ( argument != 4 && (now >= start + Execution[argument]) ) break; } stop = rtems_clock_get_ticks_since_boot(); printf("P%" PRIdPTR "-F ticks:%d\n", argument, stop); } /* delete period and SELF */ status = rtems_rate_monotonic_delete( rmid ); if ( status != RTEMS_SUCCESSFUL ) { printf("rtems_rate_monotonic_delete failed with status of %d.\n",status); rtems_test_exit( 0 ); } if ( rtems_cbs_cleanup() ) printf( "ERROR: CBS CLEANUP\n" ); fflush(stdout); TEST_END(); rtems_test_exit( 0 ); }
rtems_task Task_1_through_5( rtems_task_argument argument ) { rtems_id rmid; rtems_id test_rmid; uint32_t index; uint32_t pass; uint32_t failed; rtems_status_code status; status = rtems_rate_monotonic_create( argument, &rmid ); directive_failed( status, "rtems_rate_monotonic_create" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_create id = 0x%08" PRIxrtems_id "\n", rmid ); status = rtems_rate_monotonic_ident( argument, &test_rmid ); directive_failed( status, "rtems_rate_monotonic_ident" ); put_name( Task_name[ argument ], FALSE ); printf( "- rtems_rate_monotonic_ident id = 0x%08" PRIxrtems_id "\n", test_rmid ); if ( rmid != test_rmid ) { printf( "RMID's DO NOT MATCH (0x%" PRIxrtems_id " and 0x%" PRIxrtems_id ")\n", rmid, test_rmid ); rtems_test_exit( 0 ); } put_name( Task_name[ argument ], FALSE ); printf( "- (0x%08" PRIxrtems_id ") period %" PRIu32 "\n", rmid, Periods[ argument ] ); status = rtems_task_wake_after( 2 ); directive_failed( status, "rtems_task_wake_after" ); switch ( argument ) { case 1: case 2: case 3: case 4: while ( FOREVER ) { status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period" ); Count.count[ argument ]++; } break; case 5: pass = 0; failed = 0; status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period 1 of TA5" ); Get_all_counters(); while ( FOREVER ) { status = rtems_rate_monotonic_period( rmid, Periods[ argument ] ); directive_failed( status, "rtems_rate_monotonic_period 2 of TA5" ); Get_all_counters(); for( index = 1 ; index <= 4 ; index++ ) { if ( Temporary_count.count[ index ] != Iterations[ index ] ) { puts_nocr( "FAIL -- " ); put_name ( Task_name[ index ], FALSE ); printf ( " Actual=%" PRIu32 ", Expected=%" PRIu32 "\n", Temporary_count.count[ index ], Iterations[ index ] ); failed += 1; } } if ( failed == 5 ) rtems_test_exit( 0 ); pass += 1; printf( "TA5 - PERIODS CHECK OK (%" PRIu32 ")\n", pass ); FLUSH_OUTPUT(); if ( pass == 10 ) { puts( "" ); rtems_rate_monotonic_report_statistics(); rtems_rate_monotonic_reset_statistics( rmid ); puts( "" ); puts( "TA5 - PERIOD STATISTICS RESET" ); puts( "" ); rtems_rate_monotonic_report_statistics(); rtems_rate_monotonic_reset_all_statistics(); puts( "" ); puts( "TA5 - ALL PERIOD STATISTICS RESET" ); puts( "" ); rtems_rate_monotonic_report_statistics(); puts( "" ); puts( "*** END OF RATE MONOTONIC PERIOD STATISTICS TEST ***" ); rtems_test_exit( 0 ); } } break; } }
void Screen10() { rtems_status_code status; status = rtems_rate_monotonic_create( 0, &Junk_id ); fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_rate_monotonic_create with illegal name" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_INVALID_NAME" ); status = rtems_rate_monotonic_create( Period_name[ 1 ], &Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_create successful" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_create( Period_name[ 1 ], &Junk_id ); fatal_directive_status( status, RTEMS_TOO_MANY, "rtems_rate_monotonic_create of too many" ); puts( "TA1 - rtems_rate_monotonic_create - RTEMS_TOO_MANY" ); status = rtems_rate_monotonic_ident( 0, &Junk_id ); fatal_directive_status( status, RTEMS_INVALID_NAME, "rtems_rate_monotonic_ident with illegal name" ); puts( "TA1 - rtems_rate_monotonic_ident - RTEMS_INVALID_NAME" ); status = rtems_rate_monotonic_period( 100, 5 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_period with illegal id" ); puts( "TA1 - rtems_rate_monotonic_period - unknown RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_period( 0x10100, 5 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_period with illegal id" ); puts( "TA1 - rtems_rate_monotonic_period - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS ); fatal_directive_status( status, RTEMS_NOT_DEFINED, "rtems_rate_monotonic_period status not defined" ); puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_NOT_DEFINED" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 100 ); directive_failed( status, "rtems_rate_monotonic_period successful" ); puts( "TA1 - rtems_rate_monotonic_period - 100 ticks - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], RTEMS_PERIOD_STATUS ); directive_failed( status, "rtems_rate_monotonic_period status" ); puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_SUCCESSFUL" ); while ( FOREVER ) { status = rtems_rate_monotonic_period(Period_id[ 1 ], RTEMS_PERIOD_STATUS); if ( status == RTEMS_TIMEOUT ) break; directive_failed( status, "rtems_rate_monotonic_period waiting for timeout" ); } puts( "TA1 - rtems_rate_monotonic_period(RTEMS_PERIOD_STATUS) - RTEMS_TIMEOUT" ); status = rtems_rate_monotonic_cancel( 100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_cancel with illegal id" ); puts( "TA1 - rtems_rate_monotonic_cancel - unknown RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_cancel( 0x10100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_cancel will illegal id" ); puts( "TA1 - rtems_rate_monotonic_cancel - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_cancel( Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_cancel" ); puts( "TA1 - rtems_rate_monotonic_cancel - RTEMS_SUCCESSFUL" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 ); directive_failed( status, "rtems_rate_monotonic_period restart" ); status = rtems_task_wake_after( 1 * TICKS_PER_SECOND ); directive_failed( status, "rtems_task_wake_after" ); status = rtems_rate_monotonic_period( Period_id[ 1 ], 5 ); fatal_directive_status( status, RTEMS_TIMEOUT, "rtems_rate_monotonic_period" ); puts( "TA1 - rtems_rate_monotonic_period - 5 ticks - RTEMS_TIMEOUT" ); status = rtems_task_start( Task_id[ 4 ], Task_4, 0 ); directive_failed( status, "rtems_task_start of TA4" ); puts( "TA1 - yielding to TA4" ); status = rtems_task_wake_after( RTEMS_YIELD_PROCESSOR ); status = rtems_rate_monotonic_delete( 100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_delete with illegal id" ); puts( "TA1 - rtems_rate_monotonic_delete - unknown RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_delete( 0x10100 ); fatal_directive_status( status, RTEMS_INVALID_ID, "rtems_rate_monotonic_delete with illegal id" ); puts( "TA1 - rtems_rate_monotonic_delete - local RTEMS_INVALID_ID" ); status = rtems_rate_monotonic_delete( Period_id[ 1 ] ); directive_failed( status, "rtems_rate_monotonic_delete" ); puts( "TA1 - rtems_rate_monotonic_delete - RTEMS_SUCCESSFUL" ); }