Index: /perf/README.txt
===================================================================
--- /perf/README.txt	(revision 18)
+++ /perf/README.txt	(revision 18)
@@ -0,0 +1,120 @@
+==========================================================================
+                     TOPPERSカーネル性能評価プログラム
+                                       Last Modified: 2012 Apr 26 16:01:41
+==========================================================================
+○目的
+
+本プログラム目的は，各種のTOPPERSカーネルの性能評価を行うことである．
+
+○ファイル
+./README.txt
+./asp
+  ./perf : ASP用の性能評価プログラム
+   ./perf.cfg
+   ./perf.h
+   ./perf.c
+  ./patch  : FMP用のパッチ
+./fmp
+  ./perf : FMP用の性能評価プログラム
+   ./perf.cfg
+   ./perf.h
+   ./perf.c
+  ./patch : fmp用のパッチ
+  
+○方針
+・可能な限り依存部の変更で計測可能とする．
+・計測はパフォーマンスカウンタで行う．パフォーマンスカウンタは，
+  プロセッサ付属のパフォーマンスカウンタであっても，
+  プロセッサ外部のタイマでもよい．精度はnsecを推奨．
+・1個の計測プログラムで行う．
+
+
+○計測項目 
+  [FMP]はFMPカーネルのみ該当する
+・起動時間
+  ・起動時からsta_kerまで．
+  ・target_mprc_initialize()の実行時間 [FMP]
+  ・target_initialize()の実行時間．
+  ・オブジェクト初期化の時間
+  ・初期化ルーチン実行から最初のタスクの実行まで．
+
+・act_tsk()の実行時間
+  ・ディスパッチなし
+  ・ディスパッチあり
+  ・ディスパッチあり（他コア）[FMP]
+
+・割り込み応答時間
+  ・タイマー割り込みが入ってから，割込みハンドラが実行されるまでの時間．
+
+
+○マクロ
+・計測時には以下のマクロを有効とする．
+  ・TOPPERS_ENA_PERF
+
+
+○依存部で用意する関数
+以下の型及び関数を xxx_kernel.h に定義する．
+
+・PERFCNT :  性能計測用のカウンタのデータ型
+
+・void x_init_pcc(void)                : パフォーマンスカウンタの初期化
+・void x_get_pcc(PERFCNT *p_count)     : パフォーマンスカウンタの読み込み
+・void x_rst_pcc(void)                 : パフォーマンスカウンタのリセット
+・ulont_t x_cnv_usec(PERFCNT *p_count) : パフォーマンスカウンタ値からnsecへの変換
+
+FMPカーネルでは，コアをまだいた計測を行うため，上記のパフォーマンスカウンタは全コアから
+アクセス可能な物を用いること．
+
+また，ヒストグラムライブラリ用のマクロを定義する．
+#define HIST_GET_TIME(p_time) ((void) x_get_pcc(p_time));
+#define HIST_CONV_TIM(time)   (x_cnv_usec(time))
+#define HIST_BM_HOOK()        ((void) x_rst_pcc())
+
+
+
+○依存部の変更箇所
+・性能評価時以外は影響を及ぼさないように，TOPPERS_ENA_PERF が有効な場合のみ，
+  有効なようにifdefを入れることを推奨する．
+
+●起動時間計測
+
+ASP
+1.起動直後のパフォーマンスカウンタの初期化とリセット
+  ・スタートアップルーチンの先頭ないし，hardware_init_hook で実施する．
+2.target_initialize()もしくは相当処理の先頭で，パフォーマンスカウンタのカウント値を
+  取得してperf_boot_time[0]に保存してカウント値をリセットする
+3.target_initialize()もしくは相当処理の終端で，パフォーマンスカウンタのカウント値を
+  取得してperf_boot_time[1]に保存してカウント値をリセットする
+
+FMP
+FMPでは，1,2の間に，target_mprc_initialize()の先頭の時間を計測する．
+計測はそれぞれマスタプロセッサで実施する．
+
+1.起動直後のパフォーマンスカウンタの初期化とリセット
+2.target_mprc_initialize()の先頭でのパフォーマンスカウンタのカウント値を
+  取得してperf_boot_time[0]に保存してカウント値をリセットする
+3.target_initialize()もしくは相当処理の先頭で，パフォーマンスカウンタのカウント値を
+  取得してperf_boot_time[1]に保存してカウント値をリセットする
+4.target_initialize()もしくは相当処理の終端で，パフォーマンスカウンタのカウント値を
+  取得してperf_boot_time[2]に保存してカウント値をリセットする
+
+
+●割込み応答時間計測
+ASP
+・システムティックの割込みハンドラの先頭で perf_int_latency() を呼び出す．
+
+FMP
+・上記をマスタプロセッサのみから呼び出す．
+
+
+○ビルド用のMakefile
+・CDEFS
+ -DTOPPERS_ENA_PERF を追加する．
+・APPL_COBJS
+ histogram.o test_lib.o を追加する．
+
+
+○ARM依存部のみの定義
+・TOPPERS_ARM_PCC_DIV64 : パフォーマンスカウンタを64分周で駆動
+
+以上．
Index: /perf/asp/perf/perf.c
===================================================================
--- /perf/asp/perf/perf.c	(revision 18)
+++ /perf/asp/perf/perf.c	(revision 18)
@@ -0,0 +1,263 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ *  Copyright (C) 2012 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ *
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ *
+ *  @(#) $Id: sample1.h 1716 2010-01-31 11:39:18Z ertl-hiro $
+ */
+
+#include <kernel.h>
+#include <t_syslog.h>
+#include <t_stdlib.h>
+#include "syssvc/serial.h"
+#include "syssvc/syslog.h"
+#include "kernel_cfg.h"
+#include "perf.h"
+#include "histogram.h"
+#include "target_timer.h"
+#include "test_lib.h"
+
+/*
+ *  サービスコールのエラーのログ出力
+ */
+Inline void
+svc_perror(const char *file, int_t line, const char *expr, ER ercd)
+{
+	if (ercd < 0) {
+		t_perror(LOG_ERROR, file, line, expr, ercd);
+	}
+}
+
+#define	SVC_PERROR(expr)	svc_perror(__FILE__, __LINE__, #expr, (expr))
+
+/*
+ *  起動時間測定用変数
+ */
+PERFCNT perf_boot_time[4];
+
+/*
+ *  起動時間計測用初期化ルーチン
+ */
+void
+perf_boot_time_inithdr(intptr_t exinf)
+{
+	x_get_pcc(&perf_boot_time[2]);
+	x_rst_pcc();
+}
+
+/*
+ *  起動時間計測用タスク
+ */
+void
+perf_boot_time_task(intptr_t exinf)
+{
+	x_get_pcc(&perf_boot_time[3]);
+	x_rst_pcc();
+}
+
+/*
+ *  計測回数と実行時間分布を記録する最大時間
+ */
+#define NO_MEASURE	10000U			/* 計測回数 */
+#define MAX_TIME	10000U			/* 実行時間分布を記録する最大時間 */
+
+/*
+ *  実行時間分布を記録するメモリ領域
+ */
+static uint_t	histarea1[MAX_TIME + 1];
+static uint_t	histarea2[MAX_TIME + 1];
+
+/*
+ *  act_tsk ディスパッチなし測定用関数
+ */
+void
+task_act_tsk_nodsp_low(intptr_t exinf)
+{
+
+}
+
+void
+task_act_tsk_nodsp_high(intptr_t exinf)
+{
+	uint_t	i;
+
+	for (i = 0; i < NO_MEASURE; i++) {
+		begin_measure(1);
+		act_tsk(TASK_ACT_TSK_NODSP_LOW);
+		end_measure(1);
+		ter_tsk(TASK_ACT_TSK_NODSP_LOW);
+	}
+	wup_tsk(MAIN_TASK);
+}
+
+/*
+ *  act_tsk ディスパッチあり測定用関数
+ */
+
+void
+task_act_tsk_dsp_low(intptr_t exinf)
+{
+	uint_t	i;
+
+	for (i = 0; i < NO_MEASURE; i++) {
+		begin_measure(2);
+		act_tsk(TASK_ACT_TSK_DSP_HIGH);
+		end_measure(2);
+	}
+	wup_tsk(MAIN_TASK);
+}
+
+void
+task_act_tsk_dsp_high(intptr_t exinf)
+{
+
+}
+
+bool_t start_eval_int;
+bool_t end_eval_int;
+uint_t eval_int_hist[MAX_TIME + 1];
+int    perf_int_latency_count;
+
+/*
+ *  割込み応答時間計測
+ */
+void
+perf_int_latency(void)
+{
+	uint_t timer_count;
+	if (start_eval_int == true) {
+		timer_count = target_timer_get_current();
+		if (TO_USEC(timer_count) < MAX_TIME){
+			eval_int_hist[TO_USEC(timer_count)]++;
+		}
+		else {
+			eval_int_hist[MAX_TIME]++;
+		}
+		 perf_int_latency_count++;
+		if( perf_int_latency_count == NO_MEASURE) {
+			perf_int_latency_count = 0;
+			start_eval_int = false;
+			end_eval_int = true;
+			iwup_tsk(MAIN_TASK);
+		}
+	}
+	
+}
+
+void
+print_perf_int_latency(void)
+{
+	uint32_t i;
+	int out_count = 0;
+
+	for(i = 0; i < (MAX_TIME + 1); i++) {
+		if (eval_int_hist[i] != 0) {
+			syslog_2(LOG_NOTICE, "%d us, %d", i, eval_int_hist[i]);
+			out_count++;
+		}
+	}
+}
+/*
+ *  メインタスク
+ */
+void main_task(intptr_t exinf)
+{
+	ulong_t t0,t1,t2,t3;
+	uint32_t i;
+
+	/*
+	 *  BSSの初期化を使用しない場合があるため，ここで初期化．
+	 */
+	for (i = 0; i <= MAX_TIME; i++) {
+		histarea1[i] = 0;
+		histarea2[i] = 0;
+		eval_int_hist[i] =0;
+	}
+
+	syslog_1(LOG_NOTICE, "Performance evaluation program start. Please wait about %d sec.", NO_MEASURE/1000);
+	syslog_flush();
+
+	/*
+	 *  act_tsk ディスパッチなしの測定
+	 */
+	init_hist(1, MAX_TIME, histarea1);
+	act_tsk(TASK_ACT_TSK_NODSP_HIGH);
+	slp_tsk();
+	ter_tsk(TASK_ACT_TSK_NODSP_HIGH);
+
+	/*
+	 *  act_tsk ディスパッチありの測定
+	 */
+	init_hist(2, MAX_TIME, histarea2);
+	act_tsk(TASK_ACT_TSK_DSP_LOW);
+	slp_tsk();
+	ter_tsk(TASK_ACT_TSK_DSP_LOW);
+
+	/*
+	 *  割込み応答時間の測定
+	 */
+	perf_int_latency_count = 0;
+	start_eval_int = true;
+	slp_tsk();
+
+	/*
+	 *  計測結果の出力
+	 */
+	t0 = x_cnv_nsec(perf_boot_time[0]);
+	t1 = x_cnv_nsec(perf_boot_time[1]);
+	t2 = x_cnv_nsec(perf_boot_time[2]);
+	t3 = x_cnv_nsec(perf_boot_time[3]);
+	syslog_0(LOG_NOTICE, "Boot time.");
+	syslog_1(LOG_NOTICE, "Total time              %ld ns", t0+t1+t2+t3);
+	syslog_1(LOG_NOTICE, "Boot to sta_ker         %ld ns", t0);
+	syslog_1(LOG_NOTICE, "target init             %ld ns", t1);
+	syslog_1(LOG_NOTICE, "OS Obj init to inithdr  %ld ns", t2);
+	syslog_1(LOG_NOTICE, "inithdr to inittask     %ld ns", t3);
+	syslog_flush();
+
+	syslog_0(LOG_NOTICE, "act_tsk without dispatch[ns].");
+	print_hist(1);
+
+	syslog_0(LOG_NOTICE, "act_tsk with dispatch[ns].");
+	print_hist(2);
+
+	syslog_0(LOG_NOTICE, "Interrupt Latency.");
+	print_perf_int_latency();
+
+	syslog_0(LOG_NOTICE, "Performance measurement end.");
+	syslog_flush();
+
+	ext_ker();
+	assert(0);
+}
Index: /perf/asp/perf/perf.cfg
===================================================================
--- /perf/asp/perf/perf.cfg	(revision 18)
+++ /perf/asp/perf/perf.cfg	(revision 18)
@@ -0,0 +1,21 @@
+/*
+ *  @(#) $Id: sample1.cfg 718 2008-01-01 12:30:48Z hiro $
+ */
+
+#include "perf.h"
+
+CRE_TSK(TASK1, { TA_ACT, 1, perf_boot_time_task, 1, STACK_SIZE, NULL });
+ATT_INI({ TA_NULL, 0, perf_boot_time_inithdr });
+
+
+CRE_TSK(TASK_ACT_TSK_NODSP_LOW, { TA_NULL, 1, task_act_tsk_nodsp_low, LOW_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK_ACT_TSK_NODSP_HIGH, { TA_NULL, 1, task_act_tsk_nodsp_high, MID_PRIORITY, STACK_SIZE, NULL });
+
+CRE_TSK(TASK_ACT_TSK_DSP_LOW, { TA_NULL, 1, task_act_tsk_dsp_low, LOW_PRIORITY, STACK_SIZE, NULL });
+CRE_TSK(TASK_ACT_TSK_DSP_HIGH, { TA_NULL, 1, task_act_tsk_dsp_high, MID_PRIORITY, STACK_SIZE, NULL });
+
+CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
+
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/serial.cfg");
Index: /perf/asp/perf/perf.h
===================================================================
--- /perf/asp/perf/perf.h	(revision 18)
+++ /perf/asp/perf/perf.h	(revision 18)
@@ -0,0 +1,74 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ *  Copyright (C) 2012 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ *
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ *
+ *  @(#) $Id: sample1.h 1716 2010-01-31 11:39:18Z ertl-hiro $
+ */
+
+/*
+ *  ターゲット依存の定義
+ */
+#include "target_test.h"
+
+/*
+ *  各タスクの優先度の定義
+ */
+#define MAIN_PRIORITY	5		/* メインタスクの優先度 */
+#define HIGH_PRIORITY	9		/* 並列に実行されるタスクの優先度 */
+#define MID_PRIORITY	10
+#define LOW_PRIORITY	11
+
+/*
+ *  ターゲットに依存する可能性のある定数の定義
+ */
+#ifndef STACK_SIZE
+#define	STACK_SIZE		4096		/* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
+
+/*
+ *  関数のプロトタイプ宣言
+ */
+#ifndef TOPPERS_MACRO_ONLY
+
+extern void perf_boot_time_inithdr(intptr_t exinf);
+extern void perf_boot_time_task(intptr_t exinf);
+extern void main_task(intptr_t exinf);
+extern void task_act_tsk_nodsp_low(intptr_t exinf);
+extern void task_act_tsk_nodsp_high(intptr_t exinf);
+extern void task_act_tsk_dsp_low(intptr_t exinf);
+extern void task_act_tsk_dsp_high(intptr_t exinf);
+
+
+#endif /* TOPPERS_MACRO_ONLY */
Index: /perf/fmp/perf/perf.c
===================================================================
--- /perf/fmp/perf/perf.c	(revision 18)
+++ /perf/fmp/perf/perf.c	(revision 18)
@@ -0,0 +1,302 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ *  Copyright (C) 2012 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ *
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ *
+ *  @(#) $Id: sample1.h 1716 2010-01-31 11:39:18Z ertl-hiro $
+ */
+
+#include <kernel.h>
+#include <t_syslog.h>
+#include <t_stdlib.h>
+#include "syssvc/serial.h"
+#include "syssvc/syslog.h"
+#include "kernel_cfg.h"
+#include "perf.h"
+#include "histogram.h"
+#include "target_timer.h"
+#include "test_lib.h"
+
+/*
+ *  サービスコールのエラーのログ出力
+ */
+Inline void
+svc_perror(const char *file, int_t line, const char *expr, ER ercd)
+{
+	if (ercd < 0) {
+		t_perror(LOG_ERROR, file, line, expr, ercd);
+	}
+}
+
+#define	SVC_PERROR(expr)	svc_perror(__FILE__, __LINE__, #expr, (expr))
+
+/*
+ *  起動時間測定用変数
+ */
+PERFCNT perf_boot_time[5];
+
+/*
+ *  起動時間計測用初期化ルーチン
+ */
+void
+perf_boot_time_inithdr(intptr_t exinf)
+{
+	x_get_pcc(&perf_boot_time[3]);
+	x_rst_pcc();
+}
+
+/*
+ *  起動時間計測用タスク
+ */
+void
+perf_boot_time_task(intptr_t exinf)
+{
+	x_get_pcc(&perf_boot_time[4]);
+	x_rst_pcc();
+}
+
+/*
+ *  計測回数と実行時間分布を記録する最大時間
+ */
+#define NO_MEASURE	10000U			/* 計測回数 */
+#define MAX_TIME	10000U			/* 実行時間分布を記録する最大時間 */
+
+/*
+ *  実行時間分布を記録するメモリ領域
+ */
+static uint_t	histarea1[MAX_TIME + 1];
+static uint_t	histarea2[MAX_TIME + 1];
+static uint_t	histarea3[MAX_TIME + 1];
+
+/*
+ *  act_tsk ディスパッチなし測定用関数
+ */
+void
+task_act_tsk_nodsp_low(intptr_t exinf)
+{
+
+}
+
+void
+task_act_tsk_nodsp_high(intptr_t exinf)
+{
+	uint_t	i;
+	for (i = 0; i < NO_MEASURE; i++) {
+		begin_measure(1);
+		act_tsk(TASK_ACT_TSK_NODSP_LOW);
+		end_measure(1);
+		ter_tsk(TASK_ACT_TSK_NODSP_LOW);
+	}
+	wup_tsk(MAIN_TASK);
+}
+
+/*
+ *  act_tsk ディスパッチあり測定用関数
+ */
+
+void
+task_act_tsk_dsp_low(intptr_t exinf)
+{
+	uint_t	i;
+
+	for (i = 0; i < NO_MEASURE; i++) {
+		begin_measure(2);
+		act_tsk(TASK_ACT_TSK_DSP_HIGH);
+		end_measure(2);
+	}
+	wup_tsk(MAIN_TASK);
+}
+
+void
+task_act_tsk_dsp_high(intptr_t exinf)
+{
+
+}
+
+
+/*
+ *  act_tsk 他コアのタスク起動測定用関数
+ */
+
+void
+task_act_tsk_dsp_core_1(intptr_t exinf)
+{
+	uint_t	i;
+
+	for (i = 0; i < NO_MEASURE; i++) {
+		begin_measure(3);
+		act_tsk(TASK_ACT_TSK_DSP_CORE_2);
+		slp_tsk();
+	}
+	wup_tsk(MAIN_TASK);
+}
+
+void
+task_act_tsk_dsp_core_2(intptr_t exinf)
+{
+	end_measure(3);
+	wup_tsk(TASK_ACT_TSK_DSP_CORE_1);
+}
+
+bool_t start_eval_int;
+bool_t end_eval_int;
+uint_t eval_int_hist[MAX_TIME + 1];
+int    perf_int_latency_count;
+
+/*
+ *  割込み応答時間計測
+ */
+void
+perf_int_latency(void)
+{
+	uint_t timer_count;
+	if (start_eval_int == true) {
+		timer_count = target_timer_get_current();
+		if (TO_USEC(timer_count) < MAX_TIME){
+			eval_int_hist[TO_USEC(timer_count)]++;
+		}
+		else {
+			eval_int_hist[MAX_TIME]++;
+		}
+		 perf_int_latency_count++;
+		if( perf_int_latency_count == NO_MEASURE) {
+			perf_int_latency_count = 0;
+			start_eval_int = false;
+			end_eval_int = true;
+			iwup_tsk(MAIN_TASK);
+		}
+	}
+	
+}
+
+void
+print_perf_int_latency(void)
+{
+	uint32_t i;
+	int out_count = 0;
+
+	for(i = 0; i < (MAX_TIME + 1); i++) {
+		if (eval_int_hist[i] != 0) {
+			syslog_2(LOG_NOTICE, "%d us, %d", i, eval_int_hist[i]);
+			out_count++;
+		}
+	}
+}
+/*
+ *  メインタスク
+ */
+void main_task(intptr_t exinf)
+{
+	ulong_t t0,t1,t2,t3,t4;
+	uint32_t i;
+
+	/*
+	 *  BSSの初期化を使用しない場合があるため，ここで初期化．
+	 */
+	for (i = 0; i <= MAX_TIME; i++) {
+		histarea1[i] = 0;
+		histarea2[i] = 0;
+		histarea3[i] = 0;
+		eval_int_hist[i] =0;
+	}
+
+	syslog_1(LOG_NOTICE, "Performance evaluation program start. Please wait about %d sec.", NO_MEASURE/1000);
+	syslog_flush();
+
+	/*
+	 *  act_tsk ディスパッチなしの測定
+	 */
+	init_hist(1, MAX_TIME, histarea1);
+	act_tsk(TASK_ACT_TSK_NODSP_HIGH);
+	slp_tsk();
+	ter_tsk(TASK_ACT_TSK_NODSP_HIGH);
+
+	/*
+	 *  act_tsk ディスパッチありの測定
+	 */
+	init_hist(2, MAX_TIME, histarea2);
+	act_tsk(TASK_ACT_TSK_DSP_LOW);
+	slp_tsk();
+	ter_tsk(TASK_ACT_TSK_DSP_LOW);
+
+	/*
+	 *  act_tsk ディスパッチあり(他コア)の測定
+	 */
+	init_hist(3, MAX_TIME, histarea2);
+	act_tsk(TASK_ACT_TSK_DSP_CORE_1);
+	slp_tsk();
+	ter_tsk(TASK_ACT_TSK_DSP_CORE_1);
+
+	/*
+	 *  割込み応答時間の測定
+	 */
+	perf_int_latency_count = 0;
+	start_eval_int = true;
+	slp_tsk();
+
+	/*
+	 *  計測結果の出力
+	 */
+	t0 = x_cnv_nsec(perf_boot_time[0]);
+	t1 = x_cnv_nsec(perf_boot_time[1]);
+	t2 = x_cnv_nsec(perf_boot_time[2]);
+	t3 = x_cnv_nsec(perf_boot_time[3]);
+	t4 = x_cnv_nsec(perf_boot_time[4]);
+	syslog_0(LOG_NOTICE, "Boot time.");
+	syslog_1(LOG_NOTICE, "Total time              %ld ns", t0+t1+t2+t3+t4);
+	syslog_1(LOG_NOTICE, "Boot to mprc_init       %ld ns", t0);
+	syslog_1(LOG_NOTICE, "mprc_init               %ld ns", t1);
+	syslog_1(LOG_NOTICE, "target init             %ld ns", t2);
+	syslog_1(LOG_NOTICE, "OS Obj init to inithdr  %ld ns", t3);
+	syslog_1(LOG_NOTICE, "inithdr to inittask     %ld ns", t4);
+	syslog_flush();
+
+	syslog_0(LOG_NOTICE, "act_tsk without dispatch[ns].");
+	print_hist(1);
+
+	syslog_0(LOG_NOTICE, "act_tsk with dispatch[ns].");
+	print_hist(2);
+
+	syslog_0(LOG_NOTICE, "act_tsk with dispatch(cross core)[ns].");
+	print_hist(3);
+
+	syslog_0(LOG_NOTICE, "Interrupt Latency.");
+	print_perf_int_latency();
+
+	syslog_0(LOG_NOTICE, "Performance measurement end.");
+	syslog_flush();
+
+	ext_ker();
+	assert(0);
+}
Index: /perf/fmp/perf/perf.cfg
===================================================================
--- /perf/fmp/perf/perf.cfg	(revision 18)
+++ /perf/fmp/perf/perf.cfg	(revision 18)
@@ -0,0 +1,31 @@
+/*
+ *  @(#) $Id: sample1.cfg 718 2008-01-01 12:30:48Z hiro $
+ */
+
+#include "perf.h"
+
+ATT_INI({ TA_NULL, 0, perf_boot_time_inithdr });
+
+CLASS(TCL_1){
+	CRE_TSK(TASK1, { TA_ACT, 1, perf_boot_time_task, 1, STACK_SIZE, NULL });
+
+	CRE_TSK(TASK_ACT_TSK_NODSP_LOW, { TA_NULL, 1, task_act_tsk_nodsp_low, LOW_PRIORITY, STACK_SIZE, NULL });
+	CRE_TSK(TASK_ACT_TSK_NODSP_HIGH, { TA_NULL, 1, task_act_tsk_nodsp_high, MID_PRIORITY, STACK_SIZE, NULL });
+
+	CRE_TSK(TASK_ACT_TSK_DSP_LOW, { TA_NULL, 1, task_act_tsk_dsp_low, LOW_PRIORITY, STACK_SIZE, NULL });
+	CRE_TSK(TASK_ACT_TSK_DSP_HIGH, { TA_NULL, 1, task_act_tsk_dsp_high, MID_PRIORITY, STACK_SIZE, NULL });
+
+	CRE_TSK(MAIN_TASK, { TA_ACT, 0, main_task, MAIN_PRIORITY, STACK_SIZE, NULL });
+
+	CRE_TSK(TASK_ACT_TSK_DSP_CORE_1, { TA_NULL, 1, task_act_tsk_dsp_core_1, MID_PRIORITY, STACK_SIZE, NULL });
+}
+
+CLASS(TCL_2){
+	CRE_TSK(TASK_ACT_TSK_DSP_CORE_2, { TA_NULL, 1, task_act_tsk_dsp_core_2, MID_PRIORITY, STACK_SIZE, NULL });
+}
+
+
+INCLUDE("target_timer.cfg");
+INCLUDE("syssvc/syslog.cfg");
+INCLUDE("syssvc/serial.cfg");
+INCLUDE("target_ipi.cfg");
Index: /perf/fmp/perf/perf.h
===================================================================
--- /perf/fmp/perf/perf.h	(revision 18)
+++ /perf/fmp/perf/perf.h	(revision 18)
@@ -0,0 +1,77 @@
+/*
+ *  TOPPERS Software
+ *      Toyohashi Open Platform for Embedded Real-Time Systems
+ *
+ *  Copyright (C) 2012 by Embedded and Real-Time Systems Laboratory
+ *              Graduate School of Information Science, Nagoya Univ., JAPAN
+ *
+ *  上記著作権者は，以下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェ
+ *  ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
+ *  変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
+ *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
+ *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
+ *      スコード中に含まれていること．
+ *  (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
+ *      用できる形で再配布する場合には，再配布に伴うドキュメント（利用
+ *      者マニュアルなど）に，上記の著作権表示，この利用条件および下記
+ *      の無保証規定を掲載すること．
+ *  (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
+ *      用できない形で再配布する場合には，次のいずれかの条件を満たすこ
+ *      と．
+ *    (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
+ *        作権表示，この利用条件および下記の無保証規定を掲載すること．
+ *    (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
+ *        報告すること．
+ *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
+ *      害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
+ *      また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
+ *      由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
+ *      免責すること．
+ * 
+ *  本ソフトウェアは，無保証で提供されているものである．上記著作権者お
+ *  よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
+ *  に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
+ *  アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
+ *  の責任を負わない．
+ *
+ *  @(#) $Id: sample1.h 1716 2010-01-31 11:39:18Z ertl-hiro $
+ */
+
+/*
+ *  ターゲット依存の定義
+ */
+#include "target_test.h"
+
+/*
+ *  各タスクの優先度の定義
+ */
+
+#define MAIN_PRIORITY	5		/* メインタスクの優先度 */
+#define HIGH_PRIORITY	9		/* 並列に実行されるタスクの優先度 */
+#define MID_PRIORITY	10
+#define LOW_PRIORITY	11
+
+/*
+ *  ターゲットに依存する可能性のある定数の定義
+ */
+#ifndef STACK_SIZE
+#define	STACK_SIZE		4096		/* タスクのスタックサイズ */
+#endif /* STACK_SIZE */
+
+/*
+ *  関数のプロトタイプ宣言
+ */
+#ifndef TOPPERS_MACRO_ONLY
+
+extern void perf_boot_time_inithdr(intptr_t exinf);
+extern void perf_boot_time_task(intptr_t exinf);
+extern void main_task(intptr_t exinf);
+extern void task_act_tsk_nodsp_low(intptr_t exinf);
+extern void task_act_tsk_nodsp_high(intptr_t exinf);
+extern void task_act_tsk_dsp_low(intptr_t exinf);
+extern void task_act_tsk_dsp_high(intptr_t exinf);
+extern void task_act_tsk_dsp_core_1(intptr_t exinf);
+extern void task_act_tsk_dsp_core_2(intptr_t exinf);
+
+
+#endif /* TOPPERS_MACRO_ONLY */
