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); }
void rtems_rate_monotonic_report_statistics_with_plugin( void *context, rtems_printk_plugin_t print ) { rtems_status_code status; rtems_id id; rtems_rate_monotonic_period_statistics the_stats; rtems_rate_monotonic_period_status the_status; char name[5]; if ( !print ) return; (*print)( context, "Period information by period\n" ); (*print)( context, "--- CPU times are in seconds ---\n" ); (*print)( context, "--- Wall times are in seconds ---\n" ); /* Layout by columns -- in memory of Hollerith :) 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ ID OWNER COUNT MISSED X ididididid NNNN ccccc mmmmmm X Uncomment the following if you are tinkering with the formatting. Be sure to test the various cases. (*print)( context,"\ 1234567890123456789012345678901234567890123456789012345678901234567890123456789\ \n"); */ (*print)( context, " ID OWNER COUNT MISSED " " CPU TIME WALL TIME\n" " " " MIN/MAX/AVG MIN/MAX/AVG\n" ); /* * Cycle through all possible ids and try to report on each one. If it * is a period that is inactive, we just get an error back. No big deal. */ for ( id=_Rate_monotonic_Information.minimum_id ; id <= _Rate_monotonic_Information.maximum_id ; id++ ) { status = rtems_rate_monotonic_get_statistics( id, &the_stats ); if ( status != RTEMS_SUCCESSFUL ) continue; /* If the above passed, so should this but check it anyway */ #if defined(RTEMS_DEBUG) status = rtems_rate_monotonic_get_status( id, &the_status ); if ( status != RTEMS_SUCCESSFUL ) continue; #else (void) rtems_rate_monotonic_get_status( id, &the_status ); #endif rtems_object_get_name( the_status.owner, sizeof(name), name ); /* * Print part of report line that is not dependent on granularity */ (*print)( context, "0x%08" PRIx32 " %4s %5" PRId32 " %6" PRId32 " ", id, name, the_stats.count, the_stats.missed_count ); /* * If the count is zero, don't print statistics */ if (the_stats.count == 0) { (*print)( context, "\n" ); continue; } /* * print CPU Usage part of statistics */ { struct timespec cpu_average; struct timespec *min_cpu = &the_stats.min_cpu_time; struct timespec *max_cpu = &the_stats.max_cpu_time; struct timespec *total_cpu = &the_stats.total_cpu_time; _Timespec_Divide_by_integer( total_cpu, the_stats.count, &cpu_average ); (*print)( context, "%" PRId32 "." NANOSECONDS_FMT "/" /* min cpu time */ "%" PRId32 "." NANOSECONDS_FMT "/" /* max cpu time */ "%" PRId32 "." NANOSECONDS_FMT " ", /* avg cpu time */ _Timespec_Get_seconds( min_cpu ), _Timespec_Get_nanoseconds( min_cpu ) / NANOSECONDS_DIVIDER, _Timespec_Get_seconds( max_cpu ), _Timespec_Get_nanoseconds( max_cpu ) / NANOSECONDS_DIVIDER, _Timespec_Get_seconds( &cpu_average ), _Timespec_Get_nanoseconds( &cpu_average ) / NANOSECONDS_DIVIDER ); } /* * print wall time part of statistics */ { struct timespec wall_average; struct timespec *min_wall = &the_stats.min_wall_time; struct timespec *max_wall = &the_stats.max_wall_time; struct timespec *total_wall = &the_stats.total_wall_time; _Timespec_Divide_by_integer(total_wall, the_stats.count, &wall_average); (*print)( context, "%" PRId32 "." NANOSECONDS_FMT "/" /* min wall time */ "%" PRId32 "." NANOSECONDS_FMT "/" /* max wall time */ "%" PRId32 "." NANOSECONDS_FMT "\n", /* avg wall time */ _Timespec_Get_seconds( min_wall ), _Timespec_Get_nanoseconds( min_wall ) / NANOSECONDS_DIVIDER, _Timespec_Get_seconds( max_wall ), _Timespec_Get_nanoseconds( max_wall ) / NANOSECONDS_DIVIDER, _Timespec_Get_seconds( &wall_average ), _Timespec_Get_nanoseconds( &wall_average ) / NANOSECONDS_DIVIDER ); } } }
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" ); }