source: rtems/cpukit/libmisc/rtmonuse/rtmonuse.c @ be2cd08

4.104.114.84.95
Last change on this file since be2cd08 was bfc3533, checked in by Joel Sherrill <joel.sherrill@…>, on 12/01/98 at 13:56:46

Include files now installed as <rtems/*.h>.

  • Property mode set to 100644
File size: 4.3 KB
Line 
1/*
2 *  $Id$
3 */
4
5#include <rtems.h>
6#include <stdlib.h>
7#include <stdio.h>
8#include <assert.h>
9
10#include <rtems/rtmonuse.h>
11
12typedef struct {
13  rtems_id     id;
14  unsigned32   count;
15  unsigned32   missed_count;
16  unsigned32   min_cpu_time;
17  unsigned32   max_cpu_time;
18  unsigned32   total_cpu_time;
19  unsigned32   min_wall_time;
20  unsigned32   max_wall_time;
21  unsigned32   total_wall_time;
22}  Period_usage_t;
23
24Period_usage_t *Period_usage_Information;
25
26/*PAGE
27 *
28 *  Period_usage_Initialize
29 */
30
31void Period_usage_Initialize( void )
32{
33  int             maximum;
34
35  maximum = _Configuration_Table->RTEMS_api_configuration->maximum_periods;
36 
37  Period_usage_Information = malloc( sizeof(Period_usage_t) * (maximum+1) );
38
39  Period_usage_Reset();
40}
41
42/*PAGE
43 *
44 *  Period_usage_Reset
45 */
46
47void Period_usage_Reset( void )
48{
49  unsigned32      i;
50  Period_usage_t *the_usage;
51
52  for ( i=0 ;
53        i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
54        i++ ) {
55    the_usage = &Period_usage_Information[ i ];
56 
57    the_usage->count           = 0;
58    the_usage->missed_count    = 0;
59    the_usage->min_cpu_time    = 0xFFFFFFFF;
60    the_usage->max_cpu_time    = 0;
61    the_usage->total_cpu_time  = 0;
62    the_usage->min_wall_time   = 0xFFFFFFFF;
63    the_usage->max_wall_time   = 0;
64    the_usage->total_wall_time = 0;
65 
66  }
67}
68
69/*PAGE
70 *
71 *  Period_usage_Update
72 */
73
74void Period_usage_Update(
75  rtems_id     id
76)
77{
78  rtems_rate_monotonic_period_status rm_status;
79  rtems_status_code                  status;
80  Period_usage_t                    *the_usage;
81
82  assert( Period_usage_Information );
83
84  status = rtems_rate_monotonic_get_status( id, &rm_status );
85  assert( status == RTEMS_SUCCESSFUL );
86
87  the_usage = &Period_usage_Information[ rtems_get_index( id ) ];
88
89  the_usage->id = id;
90  the_usage->count++;
91  if ( rm_status.state == RATE_MONOTONIC_EXPIRED )
92    the_usage->missed_count++;
93  the_usage->total_cpu_time  += rm_status.ticks_executed_since_last_period;
94  the_usage->total_wall_time += rm_status.ticks_since_last_period;
95
96  /*
97   *  Update CPU time
98   */
99
100  if ( rm_status.ticks_executed_since_last_period < the_usage->min_cpu_time )
101    the_usage->min_cpu_time = rm_status.ticks_executed_since_last_period;
102
103  if ( rm_status.ticks_executed_since_last_period > the_usage->max_cpu_time )
104    the_usage->max_cpu_time = rm_status.ticks_executed_since_last_period;
105
106  /*
107   *  Update Wall time
108   */
109
110  if ( rm_status.ticks_since_last_period < the_usage->min_wall_time )
111    the_usage->min_wall_time = rm_status.ticks_since_last_period;
112
113  if ( rm_status.ticks_since_last_period > the_usage->max_wall_time )
114    the_usage->max_wall_time = rm_status.ticks_since_last_period;
115
116}
117
118/*PAGE
119 *
120 *  Period_usage_Dump
121 */
122
123void Period_usage_Dump( void )
124{
125  unsigned32              i;
126  Period_usage_t         *the_usage;
127  Rate_monotonic_Control *the_period;
128  unsigned32              u32_name;
129  char                    name[5];
130 
131  if ( !Period_usage_Information ) {
132    printf( "Period statistics library is not initialized\n" );
133    return;
134  }
135
136  printf( "Period information by period\n" );
137  printf( "   ID      OWNER   PERIODS  MISSED    CPU TIME    WALL TIME\n" );
138
139  /*
140   *  RTEMS does not use an index of zero for object ids.
141   */
142
143  for ( i=1 ;
144        i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;
145        i++ ) {
146    the_usage = &Period_usage_Information[ i ];
147    if ( the_usage->count == 0 )
148      continue;
149
150    the_period =
151      (Rate_monotonic_Control *)_Rate_monotonic_Information.local_table[ i ];
152
153    if ( the_period->owner )
154      u32_name = *(unsigned32 *)the_period->owner->Object.name;
155    else
156      u32_name = rtems_build_name(' ', ' ', ' ', ' ');
157
158    name[ 0 ] = (u32_name >> 24) & 0xff;
159    name[ 1 ] = (u32_name >> 16) & 0xff;
160    name[ 2 ] = (u32_name >>  8) & 0xff;
161    name[ 3 ] = (u32_name >>  0) & 0xff;
162    name[ 4 ] = '\0';
163
164    printf(
165      "0x%08x  %4s   %6d   %3d       %d/%d/%5.2f    %d/%d/%3.2f\n",
166      the_usage->id,
167      name,
168      the_usage->count,
169      the_usage->missed_count,
170      the_usage->min_cpu_time,
171      the_usage->max_cpu_time,
172      (double) the_usage->total_cpu_time / (double) the_usage->count,
173      the_usage->min_wall_time,
174      the_usage->max_wall_time,
175      (double) the_usage->total_wall_time / (double) the_usage->count
176    );
177  }
178}
Note: See TracBrowser for help on using the repository browser.