source: atk2-sc3_fl850f1l/library/histogram.c@ 117

Last change on this file since 117 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 7.2 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2006-2015 by Center for Embedded Computing Systems
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
9 * Copyright (C) 2011-2013 by Spansion LLC, USA
10 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
11 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
12 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
13 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
14 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
15 * Copyright (C) 2011-2015 by Witz Corporation
16 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
17 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
18 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
19 *
20 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25 * スコード中に含まれていること.
26 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29 * の無保証規定を掲載すること.
30 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32 * と.
33 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36 * 報告すること.
37 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41 * 免責すること.
42 *
43 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
44 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
45 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
46 * 用する者に対して,AUTOSARパートナーになることを求めている.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
49 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
50 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
51 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
52 * の責任を負わない.
53 *
54 * $Id: histogram.c 187 2015-06-25 03:39:04Z t_ishikawa $
55 */
56
57/*
58 * 実行時間分布集計モジュール
59 */
60
61#include "histogram.h"
62#include "target_timer.h"
63#include "target_test.h"
64
65/*
66 * 実行時間分布計測の数
67 */
68#ifndef TNUM_HIST
69#define TNUM_HIST 10
70#endif /* TNUM_HIST */
71
72/*
73 * ターゲット依存部で設定変更するためのマクロ
74 */
75#ifndef HISTTIM /* 実行時間計測用の時刻のデータ型 */
76#define HISTTIM SystemTimeUsType
77#endif /* HISTTIM */
78
79#ifndef HIST_GET_TIM /* 実行時間計測用の現在時刻の取得 */
80#ifndef TOPPERS_SUPPORT_GET_UTM
81#error get_utm is not supported
82#endif /* TOPPERS_SUPPORT_GET_UTM */
83#define HIST_GET_TIM(p_time) ((void) get_utm(p_time))
84#endif /* HIST_GET_TIM */
85
86#ifndef HIST_CONV_TIM /* 時刻の差から実行時間への変換 */
87#define HIST_CONV_TIM(time) ((uint32) (time))
88#endif /* HIST_CONV_TIM */
89
90#ifndef HIST_BM_HOOK /* 実行時間計測直前に行うべき処理 */
91#define HIST_BM_HOOK()
92#endif /* HIST_BM_HOOK */
93
94LOCAL_INLINE void
95get_utm(HISTTIM *p_time)
96{
97#ifndef GET_UTIM
98 *p_time = (HISTTIM) get_tim_utime();
99#else /* GET_UTIM */
100 *p_time = (HISTTIM) GET_UTIM();
101#endif /* GET_UTIM */
102
103}
104
105/*
106 * 実行時間分布計測管理ブロック
107 */
108typedef struct histogram_control_block {
109 HISTTIM begin_time; /* 計測開始時刻 */
110 uint32 maxval; /* 分布を記録する最大時間 */
111 uint32 *histarea; /* 分布を記録するメモリ領域 */
112 uint32 over; /* 最大時間を超えた度数 */
113 uint32 under; /* 時間の逆転が疑われる度数 */
114 boolean initialized; /* 初期化済みかどうかのフラグ */
115} HISTCB;
116
117/*
118 * 実行時間分布計測管理ブロックのエリア
119 */
120HISTCB histcb_table[TNUM_HIST];
121
122/*
123 * 実行時間分布計測IDの最小値と最大値
124 */
125#define TMIN_HISTID 1
126#define TMAX_HISTID ((TMIN_HISTID + TNUM_HIST) - 1)
127
128/*
129 * 実行時間分布計測の初期化
130 */
131boolean
132init_hist(ObjectIDType histid, uint32 maxval, uint32 *histarea)
133{
134 HISTCB *p_histcb;
135 uint32 i;
136 boolean ret = TRUE;
137
138 /* 不正な分布計測IDの場合FALSEを返す */
139 if ((histid < TMIN_HISTID) || (histid > TMAX_HISTID)) {
140 ret = FALSE;
141 }
142 else {
143 p_histcb = &(histcb_table[histid - TMIN_HISTID]);
144
145 for (i = 0U; i <= maxval; i++) {
146 histarea[i] = 0U;
147 }
148 p_histcb->maxval = maxval;
149 p_histcb->histarea = histarea;
150 p_histcb->over = 0U;
151 p_histcb->under = 0U;
152 p_histcb->initialized = TRUE;
153 }
154 return(ret);
155}
156
157/*
158 * 実行時間計測の開始
159 */
160boolean
161begin_measure(ObjectIDType histid)
162{
163 HISTCB *p_histcb;
164 boolean ret = TRUE;
165
166 /* 不正な分布計測IDの場合FALSEを返す */
167 if ((histid < TMIN_HISTID) || (histid > TMAX_HISTID)) {
168 ret = FALSE;
169 }
170 else {
171 p_histcb = &(histcb_table[histid - TMIN_HISTID]);
172
173 /* 初期化していない場合FALSEを返す */
174 if (p_histcb->initialized == FALSE) {
175 ret = FALSE;
176 }
177 else {
178 HIST_BM_HOOK();
179 HIST_GET_TIM(&(p_histcb->begin_time));
180 }
181 }
182 return(ret);
183}
184
185/*
186 * 実行時間計測の終了
187 */
188boolean
189end_measure(ObjectIDType histid)
190{
191 HISTCB *p_histcb;
192 HISTTIM end_time;
193 uint32 val;
194 boolean ret = TRUE;
195
196 HIST_GET_TIM(&end_time);
197
198 /* 不正な分布計測IDの場合FALSEを返す */
199 if ((histid < TMIN_HISTID) || (histid > TMAX_HISTID)) {
200 ret = FALSE;
201 }
202 else {
203 p_histcb = &(histcb_table[histid - TMIN_HISTID]);
204
205 /* 初期化していない場合FALSEを返す */
206 if (p_histcb->initialized == FALSE) {
207 ret = FALSE;
208 }
209 else {
210 val = HIST_CONV_TIM(end_time - p_histcb->begin_time);
211 if (val <= p_histcb->maxval) {
212 p_histcb->histarea[val]++;
213 }
214 else if (val <= ((uint32) 0x7fffffff)) {
215 p_histcb->over++;
216 }
217 else {
218 p_histcb->under++;
219 }
220 }
221 }
222 return(ret);
223}
224
225/*
226 * 実行時間分布計測の表示
227 */
228boolean
229print_hist(ObjectIDType histid)
230{
231 HISTCB *p_histcb;
232 uint32 i;
233 boolean ret = TRUE;
234
235 /* 不正な分布計測IDの場合FALSEを返す */
236 if ((histid < TMIN_HISTID) || (histid > TMAX_HISTID)) {
237 ret = FALSE;
238 }
239 else {
240 p_histcb = &(histcb_table[histid - TMIN_HISTID]);
241
242 /* 初期化していない場合FALSEを返す */
243 if (p_histcb->initialized == FALSE) {
244 ret = FALSE;
245 }
246 else {
247 for (i = 0U; i <= p_histcb->maxval; i++) {
248 if (p_histcb->histarea[i] > 0U) {
249#ifndef MEASURE_100_NANO
250 syslog_2(LOG_NOTICE, "%d : %d", i, p_histcb->histarea[i]);
251#else
252 syslog_3(LOG_NOTICE, "%d.%d : %d", i / 10, i % 10, p_histcb->histarea[i]);
253#endif /* MEASURE_100_NANO */
254 }
255 }
256 if (p_histcb->over > 0U) {
257 syslog_2(LOG_NOTICE, "> %d : %d", p_histcb->maxval, p_histcb->over);
258 }
259 if (p_histcb->under > 0U) {
260 syslog_1(LOG_NOTICE, "> 0x7fffffff : %d", p_histcb->under);
261 }
262 }
263 }
264
265 return(ret);
266}
Note: See TracBrowser for help on using the repository browser.