forked from Imagelibrary/rtems
unnecessarily uses any variables defined by the BSP. On this sweep, use of BSP_Configuration and Cpu_table was eliminated. A significant part of this modification was the addition of macros to access fields in the RTEMS configuration structures. This is necessary to strengthen the division between the BSP independent parts of RTEMS and the BSPs themselves. This started after comments and analysis by Ralf Corsepius <corsepiu@faw.uni-ulm.de>.
141 lines
3.5 KiB
C
141 lines
3.5 KiB
C
/*
|
|
* CPU Usage Reporter
|
|
*
|
|
* COPYRIGHT (c) 1989-1998. 1996.
|
|
* On-Line Applications Research Corporation (OAR).
|
|
* Copyright assigned to U.S. Government, 1994.
|
|
*
|
|
* The license and distribution terms for this file may be
|
|
* found in the file LICENSE in this distribution or at
|
|
* http://www.OARcorp.com/rtems/license.html.
|
|
*
|
|
* $Id$
|
|
*
|
|
*/
|
|
|
|
#include <rtems.h>
|
|
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <rtems/cpuuse.h>
|
|
|
|
unsigned32 CPU_usage_Ticks_at_last_reset;
|
|
|
|
/*PAGE
|
|
*
|
|
* CPU_usage_Dump
|
|
*/
|
|
|
|
void CPU_usage_Dump( void )
|
|
{
|
|
unsigned32 i;
|
|
unsigned32 class_index;
|
|
Thread_Control *the_thread;
|
|
Objects_Information *information;
|
|
unsigned32 u32_name;
|
|
char name[5];
|
|
unsigned32 total_units = 0;
|
|
|
|
for ( class_index = OBJECTS_CLASSES_FIRST ;
|
|
class_index <= OBJECTS_CLASSES_LAST ;
|
|
class_index++ ) {
|
|
information = _Objects_Information_table[ class_index ];
|
|
if ( information && information->is_thread ) {
|
|
for ( i=1 ; i <= information->maximum ; i++ ) {
|
|
the_thread = (Thread_Control *)information->local_table[ i ];
|
|
|
|
if ( the_thread )
|
|
total_units += the_thread->ticks_executed;
|
|
}
|
|
}
|
|
}
|
|
|
|
printf("CPU Usage by thread\n");
|
|
#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
|
|
printf( " ID NAME TICKS PERCENT\n" );
|
|
#else
|
|
printf( " ID NAME TICKS\n" );
|
|
#endif
|
|
|
|
for ( class_index = OBJECTS_CLASSES_FIRST ;
|
|
class_index <= OBJECTS_CLASSES_LAST ;
|
|
class_index++ ) {
|
|
information = _Objects_Information_table[ class_index ];
|
|
if ( information && information->is_thread ) {
|
|
for ( i=1 ; i <= information->maximum ; i++ ) {
|
|
the_thread = (Thread_Control *)information->local_table[ i ];
|
|
|
|
if ( !the_thread )
|
|
continue;
|
|
|
|
u32_name = *(unsigned32 *)the_thread->Object.name;
|
|
|
|
name[ 0 ] = (u32_name >> 24) & 0xff;
|
|
name[ 1 ] = (u32_name >> 16) & 0xff;
|
|
name[ 2 ] = (u32_name >> 8) & 0xff;
|
|
name[ 3 ] = (u32_name >> 0) & 0xff;
|
|
name[ 4 ] = '\0';
|
|
|
|
#if defined(unix) || ( CPU_HARDWARE_FP == TRUE )
|
|
printf( "0x%08x %4s %8d %5.3f\n",
|
|
the_thread->Object.id,
|
|
name,
|
|
the_thread->ticks_executed,
|
|
(total_units) ?
|
|
(double)the_thread->ticks_executed / (double)total_units :
|
|
(double)total_units
|
|
);
|
|
#else
|
|
printf( "0x%08x %4s %8d\n",
|
|
the_thread->Object.id,
|
|
name,
|
|
the_thread->ticks_executed
|
|
);
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
|
|
printf(
|
|
"\nTicks since last reset = %d\n",
|
|
_Watchdog_Ticks_since_boot - CPU_usage_Ticks_at_last_reset
|
|
);
|
|
printf( "\nTotal Units = %d\n", total_units );
|
|
}
|
|
|
|
/*PAGE
|
|
*
|
|
* CPU_usage_Reset
|
|
*/
|
|
|
|
void CPU_usage_Reset( void )
|
|
{
|
|
unsigned32 i;
|
|
unsigned32 class_index;
|
|
Thread_Control *the_thread;
|
|
Objects_Information *information;
|
|
|
|
CPU_usage_Ticks_at_last_reset = _Watchdog_Ticks_since_boot;
|
|
|
|
for ( class_index = OBJECTS_CLASSES_FIRST ;
|
|
class_index <= OBJECTS_CLASSES_LAST ;
|
|
class_index++ ) {
|
|
information = _Objects_Information_table[ class_index ];
|
|
if ( information && information->is_thread ) {
|
|
for ( i=1 ; i <= information->maximum ; i++ ) {
|
|
the_thread = (Thread_Control *)information->local_table[ i ];
|
|
|
|
if ( !the_thread )
|
|
continue;
|
|
|
|
the_thread->ticks_executed = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|