histogram.c

説明を見る。
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.

ホームページ制作