00001 /* 00002 * TOPPERS Software 00003 * Toyohashi Open Platform for Embedded Real-Time Systems 00004 * 00005 * Copyright (C) 2006-2008 by Embedded and Real-Time Systems Laboratory 00006 * Graduate School of Information Science, Nagoya Univ., JAPAN 00007 * 00008 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00009 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00010 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00011 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00012 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00013 * スコード中に含まれていること. 00014 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00015 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00016 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00017 * の無保証規定を掲載すること. 00018 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00019 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00020 * と. 00021 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00022 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00023 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00024 * 報告すること. 00025 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00026 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00027 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00028 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00029 * 免責すること. 00030 * 00031 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00032 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00033 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00034 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00035 * の責任を負わない. 00036 * 00037 * @(#) $Id: histogram.c 896 2008-04-11 11:24:48Z hiro $ 00038 */ 00039 00040 /* 00041 * 実行時間分布集計モジュール 00042 */ 00043 00044 #include <kernel.h> 00045 #include <t_syslog.h> 00046 #include "syssvc/logtask.h" 00047 #include <histogram.h> 00048 00049 /* 00050 * get_utmがサポートされていない場合のエラー処理 00051 */ 00052 #ifndef TOPPERS_SUPPORT_GET_UTM 00053 #error get_utm is not supported. 00054 #endif /* TOPPERS_SUPPORT_GET_UTM */ 00055 00056 /* 00057 * 実行時間分布計測管理ブロック 00058 */ 00059 typedef struct histogram_control_block { 00060 SYSUTM begin_time; /* 計測開始時刻 */ 00061 uint_t maxval; /* 分布を記録する最大時間 */ 00062 uint_t *histarea; /* 分布を記録するメモリ領域 */ 00063 uint_t over; /* 最大時間を超えた度数 */ 00064 } HISTCB; 00065 00066 /* 00067 * 実行時間分布計測管理ブロックのエリア 00068 */ 00069 HISTCB histcb_table[TNUM_HIST]; 00070 00071 /* 00072 * 実行時間分布計測IDの最小値と最大値 00073 */ 00074 #define TMIN_HISTID 1 00075 #define TMAX_HISTID (TMIN_HISTID + TNUM_HIST - 1) 00076 00077 /* 00078 * 実行時間分布計測の初期化 00079 */ 00080 void 00081 init_hist(ID histid, uint_t maxval, uint_t histarea[]) 00082 { 00083 HISTCB *p_histcb; 00084 uint_t i; 00085 00086 assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID); 00087 p_histcb = &(histcb_table[histid - TMIN_HISTID]); 00088 00089 for (i = 0; i < maxval; i++) { 00090 histarea[i] = 0U; 00091 } 00092 p_histcb->maxval = maxval; 00093 p_histcb->histarea = histarea; 00094 p_histcb->over = 0U; 00095 } 00096 00097 /* 00098 * 実行時間計測の開始 00099 */ 00100 void 00101 begin_measure(ID histid) 00102 { 00103 HISTCB *p_histcb; 00104 00105 assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID); 00106 p_histcb = &(histcb_table[histid - TMIN_HISTID]); 00107 00108 get_utm(&(p_histcb->begin_time)); 00109 } 00110 00111 /* 00112 * 実行時間計測の終了 00113 */ 00114 void 00115 end_measure(ID histid) 00116 { 00117 HISTCB *p_histcb; 00118 SYSUTM end_time; 00119 uint_t val; 00120 00121 get_utm(&end_time); 00122 00123 assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID); 00124 p_histcb = &(histcb_table[histid - TMIN_HISTID]); 00125 00126 val = (uint_t)(end_time - p_histcb->begin_time); 00127 if (val <= p_histcb->maxval) { 00128 p_histcb->histarea[val]++; 00129 } 00130 else { 00131 p_histcb->over++; 00132 } 00133 } 00134 00135 /* 00136 * 実行時間分布計測の表示 00137 */ 00138 void 00139 print_hist(ID histid) 00140 { 00141 HISTCB *p_histcb; 00142 uint_t i; 00143 00144 assert(TMIN_HISTID <= histid && histid <= TMAX_HISTID); 00145 p_histcb = &(histcb_table[histid - TMIN_HISTID]); 00146 00147 for (i = 0; i < p_histcb->maxval; i++) { 00148 if (p_histcb->histarea[i] > 0) { 00149 syslog_2(LOG_NOTICE, "%d : %d", i, p_histcb->histarea[i]); 00150 (void) logtask_flush(4U); 00151 } 00152 } 00153 if (p_histcb->over > 0) { 00154 syslog_2(LOG_NOTICE, "> %d : %d", p_histcb->maxval, p_histcb->over); 00155 } 00156 (void) logtask_flush(0U); 00157 }
Copyright © 2008 by Kijineko Inc.