summaryrefslogtreecommitdiffstats
path: root/cpukit/libmisc/cpuuse/cpuusagereport.c
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-21 20:28:02 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2007-05-21 20:28:02 +0000
commite49e84c9abd9a67d92fd12ab18794ed1d809f70c (patch)
tree0dbb7794e3e764fb09123b94d7d2e1d913b60e38 /cpukit/libmisc/cpuuse/cpuusagereport.c
parent2007-05-21 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-e49e84c9abd9a67d92fd12ab18794ed1d809f70c.tar.bz2
2007-05-21 Joel Sherrill <joel.sherrill@oarcorp.com>
* libmisc/Makefile.am, libmisc/cpuuse/README: Split remaining CPU Usage functionality into multiple files to eliminate unnecessary cohesion. Update README. * libmisc/cpuuse/cpuusagereport.c, libmisc/cpuuse/cpuusagereset.c: New files. * libmisc/cpuuse/cpuuse.c: Removed.
Diffstat (limited to 'cpukit/libmisc/cpuuse/cpuusagereport.c')
-rw-r--r--cpukit/libmisc/cpuuse/cpuusagereport.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/cpukit/libmisc/cpuuse/cpuusagereport.c b/cpukit/libmisc/cpuuse/cpuusagereport.c
new file mode 100644
index 0000000000..89f264db40
--- /dev/null
+++ b/cpukit/libmisc/cpuuse/cpuusagereport.c
@@ -0,0 +1,149 @@
+/*
+ * CPU Usage Reporter
+ *
+ * COPYRIGHT (c) 1989-2007
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <rtems.h>
+
+#include <assert.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+#include <rtems/cpuuse.h>
+#include <rtems/bspIo.h>
+
+#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
+ *
+ * rtems_cpu_usage_report
+ */
+
+void rtems_cpu_usage_report( void )
+{
+ uint32_t i;
+ uint32_t api_index;
+ Thread_Control *the_thread;
+ Objects_Information *information;
+ char name[5];
+ uint32_t ival, fval;
+ #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"
+ #ifdef RTEMS_ENABLE_NANOSECOND_CPU_USAGE_STATISTICS
+ " ID NAME SECONDS PERCENT\n"
+ #else
+ " ID NAME TICKS PERCENT\n"
+ #endif
+ );
+
+ 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 )
+ continue;
+
+ rtems_object_get_name( the_thread->Object.id, sizeof(name), name );
+
+ 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
+ }
+ }
+ }
+
+ #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
+}