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

Last change on this file since 18 was 18, checked in by ertl-honda, 12 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 }
162 wup_tsk(MAIN_TASK);
163}
164
165void
166task_act_tsk_dsp_core_2(intptr_t exinf)
167{
168 end_measure(3);
169 wup_tsk(TASK_ACT_TSK_DSP_CORE_1);
170}
171
172bool_t start_eval_int;
173bool_t end_eval_int;
174uint_t eval_int_hist[MAX_TIME + 1];
175int perf_int_latency_count;
176
177/*
178 * 割込み応答時間計測
179 */
180void
181perf_int_latency(void)
182{
183 uint_t timer_count;
184 if (start_eval_int == true) {
185 timer_count = target_timer_get_current();
186 if (TO_USEC(timer_count) < MAX_TIME){
187 eval_int_hist[TO_USEC(timer_count)]++;
188 }
189 else {
190 eval_int_hist[MAX_TIME]++;
191 }
192 perf_int_latency_count++;
193 if( perf_int_latency_count == NO_MEASURE) {
194 perf_int_latency_count = 0;
195 start_eval_int = false;
196 end_eval_int = true;
197 iwup_tsk(MAIN_TASK);
198 }
199 }
200
201}
202
203void
204print_perf_int_latency(void)
205{
206 uint32_t i;
207 int out_count = 0;
208
209 for(i = 0; i < (MAX_TIME + 1); i++) {
210 if (eval_int_hist[i] != 0) {
211 syslog_2(LOG_NOTICE, "%d us, %d", i, eval_int_hist[i]);
212 out_count++;
213 }
214 }
215}
216/*
217 * メインタスク
218 */
219void main_task(intptr_t exinf)
220{
221 ulong_t t0,t1,t2,t3,t4;
222 uint32_t i;
223
224 /*
225 * BSSの初期化を使用しない場合があるため,ここで初期化.
226 */
227 for (i = 0; i <= MAX_TIME; i++) {
228 histarea1[i] = 0;
229 histarea2[i] = 0;
230 histarea3[i] = 0;
231 eval_int_hist[i] =0;
232 }
233
234 syslog_1(LOG_NOTICE, "Performance evaluation program start. Please wait about %d sec.", NO_MEASURE/1000);
235 syslog_flush();
236
237 /*
238 * act_tsk ディスパッチなしの測定
239 */
240 init_hist(1, MAX_TIME, histarea1);
241 act_tsk(TASK_ACT_TSK_NODSP_HIGH);
242 slp_tsk();
243 ter_tsk(TASK_ACT_TSK_NODSP_HIGH);
244
245 /*
246 * act_tsk ディスパッチありの測定
247 */
248 init_hist(2, MAX_TIME, histarea2);
249 act_tsk(TASK_ACT_TSK_DSP_LOW);
250 slp_tsk();
251 ter_tsk(TASK_ACT_TSK_DSP_LOW);
252
253 /*
254 * act_tsk ディスパッチあり(他コア)の測定
255 */
256 init_hist(3, MAX_TIME, histarea2);
257 act_tsk(TASK_ACT_TSK_DSP_CORE_1);
258 slp_tsk();
259 ter_tsk(TASK_ACT_TSK_DSP_CORE_1);
260
261 /*
262 * 割込み応答時間の測定
263 */
264 perf_int_latency_count = 0;
265 start_eval_int = true;
266 slp_tsk();
267
268 /*
269 * 計測結果の出力
270 */
271 t0 = x_cnv_nsec(perf_boot_time[0]);
272 t1 = x_cnv_nsec(perf_boot_time[1]);
273 t2 = x_cnv_nsec(perf_boot_time[2]);
274 t3 = x_cnv_nsec(perf_boot_time[3]);
275 t4 = x_cnv_nsec(perf_boot_time[4]);
276 syslog_0(LOG_NOTICE, "Boot time.");
277 syslog_1(LOG_NOTICE, "Total time %ld ns", t0+t1+t2+t3+t4);
278 syslog_1(LOG_NOTICE, "Boot to mprc_init %ld ns", t0);
279 syslog_1(LOG_NOTICE, "mprc_init %ld ns", t1);
280 syslog_1(LOG_NOTICE, "target init %ld ns", t2);
281 syslog_1(LOG_NOTICE, "OS Obj init to inithdr %ld ns", t3);
282 syslog_1(LOG_NOTICE, "inithdr to inittask %ld ns", t4);
283 syslog_flush();
284
285 syslog_0(LOG_NOTICE, "act_tsk without dispatch[ns].");
286 print_hist(1);
287
288 syslog_0(LOG_NOTICE, "act_tsk with dispatch[ns].");
289 print_hist(2);
290
291 syslog_0(LOG_NOTICE, "act_tsk with dispatch(cross core)[ns].");
292 print_hist(3);
293
294 syslog_0(LOG_NOTICE, "Interrupt Latency.");
295 print_perf_int_latency();
296
297 syslog_0(LOG_NOTICE, "Performance measurement end.");
298 syslog_flush();
299
300 ext_ker();
301 assert(0);
302}
Note: See TracBrowser for help on using the repository browser.