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

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

性能評価プログラムのコミット.

File size: 6.0 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[4];
68
69/*
70 * 起動時間計測用初期化ルーチン
71 */
72void
73perf_boot_time_inithdr(intptr_t exinf)
74{
75 x_get_pcc(&perf_boot_time[2]);
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[3]);
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];
100
101/*
102 * act_tsk ディスパッチなし測定用関数
103 */
104void
105task_act_tsk_nodsp_low(intptr_t exinf)
106{
107
108}
109
110void
111task_act_tsk_nodsp_high(intptr_t exinf)
112{
113 uint_t i;
114
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
147bool_t start_eval_int;
148bool_t end_eval_int;
149uint_t eval_int_hist[MAX_TIME + 1];
150int perf_int_latency_count;
151
152/*
153 * 割込み応答時間計測
154 */
155void
156perf_int_latency(void)
157{
158 uint_t timer_count;
159 if (start_eval_int == true) {
160 timer_count = target_timer_get_current();
161 if (TO_USEC(timer_count) < MAX_TIME){
162 eval_int_hist[TO_USEC(timer_count)]++;
163 }
164 else {
165 eval_int_hist[MAX_TIME]++;
166 }
167 perf_int_latency_count++;
168 if( perf_int_latency_count == NO_MEASURE) {
169 perf_int_latency_count = 0;
170 start_eval_int = false;
171 end_eval_int = true;
172 iwup_tsk(MAIN_TASK);
173 }
174 }
175
176}
177
178void
179print_perf_int_latency(void)
180{
181 uint32_t i;
182 int out_count = 0;
183
184 for(i = 0; i < (MAX_TIME + 1); i++) {
185 if (eval_int_hist[i] != 0) {
186 syslog_2(LOG_NOTICE, "%d us, %d", i, eval_int_hist[i]);
187 out_count++;
188 }
189 }
190}
191/*
192 * メインタスク
193 */
194void main_task(intptr_t exinf)
195{
196 ulong_t t0,t1,t2,t3;
197 uint32_t i;
198
199 /*
200 * BSSの初期化を使用しない場合があるため,ここで初期化.
201 */
202 for (i = 0; i <= MAX_TIME; i++) {
203 histarea1[i] = 0;
204 histarea2[i] = 0;
205 eval_int_hist[i] =0;
206 }
207
208 syslog_1(LOG_NOTICE, "Performance evaluation program start. Please wait about %d sec.", NO_MEASURE/1000);
209 syslog_flush();
210
211 /*
212 * act_tsk ディスパッチなしの測定
213 */
214 init_hist(1, MAX_TIME, histarea1);
215 act_tsk(TASK_ACT_TSK_NODSP_HIGH);
216 slp_tsk();
217 ter_tsk(TASK_ACT_TSK_NODSP_HIGH);
218
219 /*
220 * act_tsk ディスパッチありの測定
221 */
222 init_hist(2, MAX_TIME, histarea2);
223 act_tsk(TASK_ACT_TSK_DSP_LOW);
224 slp_tsk();
225 ter_tsk(TASK_ACT_TSK_DSP_LOW);
226
227 /*
228 * 割込み応答時間の測定
229 */
230 perf_int_latency_count = 0;
231 start_eval_int = true;
232 slp_tsk();
233
234 /*
235 * 計測結果の出力
236 */
237 t0 = x_cnv_nsec(perf_boot_time[0]);
238 t1 = x_cnv_nsec(perf_boot_time[1]);
239 t2 = x_cnv_nsec(perf_boot_time[2]);
240 t3 = x_cnv_nsec(perf_boot_time[3]);
241 syslog_0(LOG_NOTICE, "Boot time.");
242 syslog_1(LOG_NOTICE, "Total time %ld ns", t0+t1+t2+t3);
243 syslog_1(LOG_NOTICE, "Boot to sta_ker %ld ns", t0);
244 syslog_1(LOG_NOTICE, "target init %ld ns", t1);
245 syslog_1(LOG_NOTICE, "OS Obj init to inithdr %ld ns", t2);
246 syslog_1(LOG_NOTICE, "inithdr to inittask %ld ns", t3);
247 syslog_flush();
248
249 syslog_0(LOG_NOTICE, "act_tsk without dispatch[ns].");
250 print_hist(1);
251
252 syslog_0(LOG_NOTICE, "act_tsk with dispatch[ns].");
253 print_hist(2);
254
255 syslog_0(LOG_NOTICE, "Interrupt Latency.");
256 print_perf_int_latency();
257
258 syslog_0(LOG_NOTICE, "Performance measurement end.");
259 syslog_flush();
260
261 ext_ker();
262 assert(0);
263}
Note: See TracBrowser for help on using the repository browser.