⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtmonuse.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/* *  $Id: rtmonuse.c,v 1.3.8.3 2003/12/11 14:20:46 joel Exp $ */#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <rtems.h>#include <stdlib.h>#include <stdio.h>#include <assert.h>#include <ctype.h>#include <rtems/rtmonuse.h>typedef struct {  rtems_id     id;  unsigned32   count;  unsigned32   missed_count;  unsigned32   min_cpu_time;  unsigned32   max_cpu_time;  unsigned32   total_cpu_time;  unsigned32   min_wall_time;  unsigned32   max_wall_time;  unsigned32   total_wall_time;}  Period_usage_t;Period_usage_t *Period_usage_Information;/*PAGE * *  Period_usage_Initialize */void Period_usage_Initialize( void ){  int             maximum;  maximum = _Configuration_Table->RTEMS_api_configuration->maximum_periods;   Period_usage_Information = malloc( sizeof(Period_usage_t) * (maximum+1) );  Period_usage_Reset();}/*PAGE * *  Period_usage_Reset */void Period_usage_Reset( void ){  unsigned32      i;  Period_usage_t *the_usage;  for ( i=0 ;        i<_Configuration_Table->RTEMS_api_configuration->maximum_periods ;        i++ ) {    the_usage = &Period_usage_Information[ i ];     the_usage->count           = 0;    the_usage->missed_count    = 0;    the_usage->min_cpu_time    = 0xFFFFFFFF;    the_usage->max_cpu_time    = 0;    the_usage->total_cpu_time  = 0;    the_usage->min_wall_time   = 0xFFFFFFFF;    the_usage->max_wall_time   = 0;    the_usage->total_wall_time = 0;   }}/*PAGE * *  Period_usage_Update */void Period_usage_Update(   rtems_id     id){  rtems_rate_monotonic_period_status rm_status;  rtems_status_code                  status;  Period_usage_t                    *the_usage;  assert( Period_usage_Information );  status = rtems_rate_monotonic_get_status( id, &rm_status );  assert( status == RTEMS_SUCCESSFUL );  the_usage = &Period_usage_Information[ rtems_get_index( id ) ];  the_usage->id = id;  the_usage->count++;  if ( rm_status.state == RATE_MONOTONIC_EXPIRED )    the_usage->missed_count++;  the_usage->total_cpu_time  += rm_status.ticks_executed_since_last_period;  the_usage->total_wall_time += rm_status.ticks_since_last_period;  /*   *  Update CPU time   */  if ( rm_status.ticks_executed_since_last_period < the_usage->min_cpu_time )    the_usage->min_cpu_time = rm_status.ticks_executed_since_last_period;  if ( rm_status.ticks_executed_since_last_period > the_usage->max_cpu_time )    the_usage->max_cpu_time = rm_status.ticks_executed_since_last_period;  /*   *  Update Wall time   */  if ( rm_status.ticks_since_last_period < the_usage->min_wall_time )    the_usage->min_wall_time = rm_status.ticks_since_last_period;  if ( rm_status.ticks_since_last_period > the_usage->max_wall_time )    the_usage->max_wall_time = rm_status.ticks_since_last_period;}/*PAGE * *  Period_usage_Dump */void Period_usage_Dump( void ){  unsigned32              i;  Period_usage_t         *the_usage;  Rate_monotonic_Control *the_period;  unsigned32              u32_name;  char                   *cname;  char                    name[5];  unsigned32              api_index;  Objects_Information    *information;   if ( !Period_usage_Information ) {    printf( "Period statistics library is not initialized\n" );    return;  }  printf( "Period information by period\n" );   printf( "   ID      OWNER   PERIODS  MISSED    CPU TIME    WALL TIME\n" );  /*   *  RTEMS does not use an index of zero for object ids.   */  for ( i=1 ;        i<=_Configuration_Table->RTEMS_api_configuration->maximum_periods ;        i++ ) {    the_usage = &Period_usage_Information[ i ];    if ( the_usage->count == 0 )      continue;    the_period =      (Rate_monotonic_Control *)_Rate_monotonic_Information.local_table[ i ];    name[ 0 ] = ' ';    name[ 1 ] = ' ';    name[ 2 ] = ' ';    name[ 3 ] = ' ';    name[ 4 ] = '\0';    if ( the_period->owner ) {      api_index = _Objects_Get_API(the_period->owner->Object.id);      information = _Objects_Information_table[ api_index ][ 1 ];      if ( information->is_string ) {        cname = the_period->owner->Object.name;        name[ 0 ] = cname[0];        name[ 1 ] = cname[1];        name[ 2 ] = cname[2];        name[ 3 ] = cname[3];        name[ 4 ] = '\0';      } else {        u32_name = (unsigned32)the_period->owner->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 ( !isprint(name[0]) ) name[0] = '*';    if ( !isprint(name[1]) ) name[1] = '*';    if ( !isprint(name[2]) ) name[2] = '*';    if ( !isprint(name[3]) ) name[3] = '*';    printf(      "0x%08x  %4s   %6d   %3d       %d/%d/%5.2f    %d/%d/%3.2f\n",      the_usage->id,      name,      the_usage->count,      the_usage->missed_count,      the_usage->min_cpu_time,      the_usage->max_cpu_time,      (double) the_usage->total_cpu_time / (double) the_usage->count,      the_usage->min_wall_time,      the_usage->max_wall_time,      (double) the_usage->total_wall_time / (double) the_usage->count    );  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -