diff options
Diffstat (limited to 'cpukit/libmisc/cpuuse')
-rw-r--r-- | cpukit/libmisc/cpuuse/cpuuse.c | 129 |
1 files changed, 89 insertions, 40 deletions
diff --git a/cpukit/libmisc/cpuuse/cpuuse.c b/cpukit/libmisc/cpuuse/cpuuse.c index 9e9be38db8..cf1b6f2b4d 100644 --- a/cpukit/libmisc/cpuuse/cpuuse.c +++ b/cpukit/libmisc/cpuuse/cpuuse.c @@ -26,7 +26,18 @@ #include <rtems/cpuuse.h> #include <rtems/bspIo.h> -uint32_t CPU_usage_Ticks_at_last_reset; +#if defined(RTEMS_ENABLE_NANOSECOND_RATE_MONOTONIC_STATISTICS) || \ + defined(RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS) + #include <rtems/score/timespec.h> + + /* We print to 1/10's of milliseconds */ + #define NANOSECONDS_DIVIDER 100000 + #define PERCENT_FMT "%04" PRId32 +#endif + +#ifndef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + uint32_t CPU_usage_Ticks_at_last_reset; +#endif /*PAGE * @@ -41,27 +52,38 @@ void rtems_cpu_usage_report( void ) Objects_Information *information; char name[5]; uint32_t ival, fval; - uint32_t total_units = 0; - - for ( api_index = 1 ; - api_index <= OBJECTS_APIS_LAST ; - api_index++ ) { - if ( !_Objects_Information_table[ api_index ] ) - continue; - information = _Objects_Information_table[ api_index ][ 1 ]; - if ( information ) { - for ( i=1 ; i <= information->maximum ; i++ ) { - the_thread = (Thread_Control *)information->local_table[ i ]; - - if ( the_thread ) - total_units += the_thread->ticks_executed; + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + struct timespec uptime; + #else + uint32_t total_units = 0; + #endif + + /* + * When not using nanosecond CPU usage resolution, we have to count + * the number of "ticks" we gave credit for to give the user a rough + * guideline as to what each number means proportionally. + */ + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + _TOD_Get_uptime( &uptime ); + #else + for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; api_index++ ) { + if ( !_Objects_Information_table[ api_index ] ) + continue; + information = _Objects_Information_table[ api_index ][ 1 ]; + if ( information ) { + for ( i=1 ; i <= information->maximum ; i++ ) { + the_thread = (Thread_Control *)information->local_table[ i ]; + + if ( the_thread ) + total_units += the_thread->ticks_executed; + } } } - } - + #endif + printk( "CPU Usage by thread\n" - " ID NAME TICKS PERCENT\n" - ); + " ID NAME TICKS PERCENT\n" + ); for ( api_index = 1 ; api_index <= OBJECTS_APIS_LAST ; @@ -77,36 +99,61 @@ void rtems_cpu_usage_report( void ) continue; rtems_object_get_name( the_thread->Object.id, sizeof(name), name ); - - ival = total_units ? - the_thread->ticks_executed * 10000 / total_units : 0; - fval = ival % 100; - ival /= 100; - printk( - "0x%08" PRIx32 " %4s %8" PRId32 " %3" PRId32 - ".%02" PRId32"\n", - the_thread->Object.id, - name, - the_thread->ticks_executed, - ival, - fval - ); + + printk( "0x%08" PRIx32 " %4s ", the_thread->Object.id, name ); + + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + _Timespec_Divide( &the_thread->cpu_time_used, &uptime, &ival, &fval ); + + printk( + "%" PRId32 ".%06d" /* cpu time used */ + " %3" PRId32 ".%02" PRId32 "\n", /* percentage */ + the_thread->cpu_time_used.tv_sec, + the_thread->cpu_time_used.tv_nsec / + TOD_NANOSECONDS_PER_MICROSECOND, + ival, + fval + ); + #else + ival = (total_units) ? + the_thread->ticks_executed * 10000 / total_units : 0; + fval = ival % 100; + ival /= 100; + printk( + "%8" PRId32 " %3" PRId32 ".%02" PRId32"\n", + the_thread->ticks_executed, + ival, + fval + ); + #endif } } } - printk( - "\nTicks since last reset = %" PRId32 "\n", - _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset - ); - printk( "\nTotal Units = %" PRId32 "\n", total_units ); + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + printk( "Uptime %d.%06d seconds\n\n", + uptime.tv_sec, + uptime.tv_nsec / TOD_NANOSECONDS_PER_MICROSECOND + ); + #else + printk( + "Ticks since last reset = %" PRId32 "\n", + _Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset + ); + printk( "Total Units = %" PRId32 "\n\n", total_units ); + #endif } static void CPU_usage_Per_thread_handler( Thread_Control *the_thread ) { - the_thread->ticks_executed = 0; + #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + the_thread->cpu_time_used.tv_sec = 0; + the_thread->cpu_time_used.tv_nsec = 0; + #else + the_thread->ticks_executed = 0; + #endif } /* @@ -114,7 +161,9 @@ static void CPU_usage_Per_thread_handler( */ void rtems_cpu_usage_reset( void ) { - CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot; + #ifndef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS + CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot; + #endif rtems_iterate_over_all_threads(CPU_usage_Per_thread_handler); } |