source: perf/fmp/perf/perf.c@ 20

Last change on this file since 20 was 20, checked in by ertl-honda, 10 years ago

バグ修正.

  • Property svn:executable set to *
File size: 6.8 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2012 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * @(#) $Id: sample1.h 1716 2010-01-31 11:39:18Z ertl-hiro $
38 */
39
40#include <kernel.h>
41#include <t_syslog.h>
42#include <t_stdlib.h>
43#include "syssvc/serial.h"
44#include "syssvc/syslog.h"
45#include "kernel_cfg.h"
46#include "perf.h"
47#include "histogram.h"
48#include "target_timer.h"
49#include "test_lib.h"
50
51/*
52 * サービスコールのエラーのログ出力
53 */
54Inline void
55svc_perror(const char *file, int_t line, const char *expr, ER ercd)
56{
57 if (ercd < 0) {
58 t_perror(LOG_ERROR, file, line, expr, ercd);
59 }
60}
61
62#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
63
64/*
65 * 起動時間測定用変数
66 */
67PERFCNT perf_boot_time[5];
68
69/*
70 * 起動時間計測用初期化ルーチン
71 */
72void
73perf_boot_time_inithdr(intptr_t exinf)
74{
75 x_get_pcc(&perf_boot_time[3]);
76 x_rst_pcc();
77}
78
79/*
80 * 起動時間計測用タスク
81 */
82void
83perf_boot_time_task(intptr_t exinf)
84{
85 x_get_pcc(&perf_boot_time[4]);
86 x_rst_pcc();
87}
88
89/*
90 * 計測回数と実行時間分布を記録する最大時間
91 */
92#define NO_MEASURE 10000U /* 計測回数 */
93#define MAX_TIME 10000U /* 実行時間分布を記録する最大時間 */
94
95/*
96 * 実行時間分布を記録するメモリ領域
97 */
98static uint_t histarea1[MAX_TIME + 1];
99static uint_t histarea2[MAX_TIME + 1];
100static uint_t histarea3[MAX_TIME + 1];
101
102/*
103 * act_tsk ディスパッチなし測定用関数
104 */
105void
106task_act_tsk_nodsp_low(intptr_t exinf)
107{
108
109}
110
111void
112task_act_tsk_nodsp_high(intptr_t exinf)
113{
114 uint_t i;
115 for (i = 0; i < NO_MEASURE; i++) {
116 begin_measure(1);
117 act_tsk(TASK_ACT_TSK_NODSP_LOW);
118 end_measure(1);
119 ter_tsk(TASK_ACT_TSK_NODSP_LOW);
120 }
121 wup_tsk(MAIN_TASK);
122}
123
124/*
125 * act_tsk ディスパッチあり測定用関数
126 */
127
128void
129task_act_tsk_dsp_low(intptr_t exinf)
130{
131 uint_t i;
132
133 for (i = 0; i < NO_MEASURE; i++) {
134 begin_measure(2);
135 act_tsk(TASK_ACT_TSK_DSP_HIGH);
136 end_measure(2);
137 }
138 wup_tsk(MAIN_TASK);
139}
140
141void
142task_act_tsk_dsp_high(intptr_t exinf)
143{
144
145}
146
147
148/*
149 * act_tsk 他コアのタスク起動測定用関数
150 */
151
152void
153task_act_tsk_dsp_core_1(intptr_t exinf)
154{
155 uint_t i;
156
157 for (i = 0; i < NO_MEASURE; i++) {
158 begin_measure(3);
159 act_tsk(TASK_ACT_TSK_DSP_CORE_2);
160 slp_tsk();
161 dly_tsk(1);
162 }
163 wup_tsk(MAIN_TASK);
164}
165
166void
167task_act_tsk_dsp_core_2(intptr_t exinf)
168{
169 end_measure(3);
170 wup_tsk(TASK_ACT_TSK_DSP_CORE_1);
171}
172
173bool_t start_eval_int;
174bool_t end_eval_int;
175uint_t eval_int_hist[MAX_TIME + 1];
176int perf_int_latency_count;
177
178/*
179 * 割込み応答時間計測
180 */
181void
182perf_int_latency(void)
183{
184 uint_t timer_count;
185 if (start_eval_int == true) {
186 timer_count = target_timer_get_current();
187 if (TO_USEC(timer_count) < MAX_TIME){
188 eval_int_hist[TO_USEC(timer_count)]++;
189 }
190 else {
191 eval_int_hist[MAX_TIME]++;
192 }
193 perf_int_latency_count++;
194 if( perf_int_latency_count == NO_MEASURE) {
195 perf_int_latency_count = 0;
196 start_eval_int = false;
197 end_eval_int = true;
198 iwup_tsk(MAIN_TASK);
199 }
200 }
201
202}
203
204void
205print_perf_int_latency(void)
206{
207 uint32_t i;
208 int out_count = 0;
209
210 for(i = 0; i < (MAX_TIME + 1); i++) {
211 if (eval_int_hist[i] != 0) {
212 syslog_2(LOG_NOTICE, "%d us, %d", i, eval_int_hist[i]);
213 out_count++;
214 }
215 }
216}
217/*
218 * メインタスク
219 */
220void main_task(intptr_t exinf)
221{
222 ulong_t t0,t1,t2,t3,t4;
223 uint32_t i;
224
225 /*
226 * BSSの初期化を使用しない場合があるため,ここで初期化.
227 */
228 for (i = 0; i <= MAX_TIME; i++) {
229 histarea1[i] = 0;
230 histarea2[i] = 0;
231 histarea3[i] = 0;
232 eval_int_hist[i] =0;
233 }
234
235 syslog_1(LOG_NOTICE, "Performance evaluation program start. Please wait about %d sec.", NO_MEASURE/1000);
236 syslog_flush();
237
238 /*
239 * act_tsk ディスパッチなしの測定
240 */
241 init_hist(1, MAX_TIME, histarea1);
242 act_tsk(TASK_ACT_TSK_NODSP_HIGH);
243 slp_tsk();
244 ter_tsk(TASK_ACT_TSK_NODSP_HIGH);
245
246 /*
247 * act_tsk ディスパッチありの測定
248 */
249 init_hist(2, MAX_TIME, histarea2);
250 act_tsk(TASK_ACT_TSK_DSP_LOW);
251 slp_tsk();
252 ter_tsk(TASK_ACT_TSK_DSP_LOW);
253
254 /*
255 * act_tsk ディスパッチあり(他コア)の測定
256 */
257 init_hist(3, MAX_TIME, histarea3);
258 act_tsk(TASK_ACT_TSK_DSP_CORE_1);
259 slp_tsk();
260 ter_tsk(TASK_ACT_TSK_DSP_CORE_1);
261
262 /*
263 * 割込み応答時間の測定
264 */
265 perf_int_latency_count = 0;
266 start_eval_int = true;
267 slp_tsk();
268
269 /*
270 * 計測結果の出力
271 */
272 t0 = x_cnv_nsec(perf_boot_time[0]);
273 t1 = x_cnv_nsec(perf_boot_time[1]);
274 t2 = x_cnv_nsec(perf_boot_time[2]);
275 t3 = x_cnv_nsec(perf_boot_time[3]);
276 t4 = x_cnv_nsec(perf_boot_time[4]);
277 syslog_0(LOG_NOTICE, "Boot time.");
278 syslog_1(LOG_NOTICE, "Total time %ld ns", t0+t1+t2+t3+t4);
279 syslog_1(LOG_NOTICE, "Boot to mprc_init %ld ns", t0);
280 syslog_1(LOG_NOTICE, "mprc_init %ld ns", t1);
281 syslog_1(LOG_NOTICE, "target init %ld ns", t2);
282 syslog_1(LOG_NOTICE, "OS Obj init to inithdr %ld ns", t3);
283 syslog_1(LOG_NOTICE, "inithdr to inittask %ld ns", t4);
284 syslog_flush();
285
286 syslog_0(LOG_NOTICE, "act_tsk without dispatch[ns].");
287 print_hist(1);
288
289 syslog_0(LOG_NOTICE, "act_tsk with dispatch[ns].");
290 print_hist(2);
291
292 syslog_0(LOG_NOTICE, "act_tsk with dispatch(cross core)[ns].");
293 print_hist(3);
294
295 syslog_0(LOG_NOTICE, "Interrupt Latency.");
296 print_perf_int_latency();
297
298 syslog_0(LOG_NOTICE, "Performance measurement end.");
299 syslog_flush();
300
301 ext_ker();
302 assert(0);
303}
Note: See TracBrowser for help on using the repository browser.