00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id$ 00041 */ 00042 00043 /* 00044 * トレースログ機能 00045 */ 00046 00047 #include "kernel_impl.h" 00048 #include "task.h" 00049 #include "time_event.h" 00050 #include <sil.h> 00051 00052 /* 00053 * トレースログバッファとそれにアクセスするためのポインタ 00054 */ 00055 SYSLOG trace_buffer[TCNT_TRACE_BUFFER]; /* トレースログバッファ */ 00056 uint_t trace_count; /* トレースログバッファ中のログの数 */ 00057 uint_t trace_head; /* 先頭のトレースログの格納位置 */ 00058 uint_t trace_tail; /* 次のトレースログの格納位置 */ 00059 MODE trace_mode; /* トレースモード */ 00060 00061 /* 00062 * トレースログ機能の初期化 00063 */ 00064 void 00065 trace_initialize(intptr_t exinf) 00066 { 00067 MODE mode = ((MODE) exinf); 00068 00069 trace_count = 0U; 00070 trace_head = trace_tail = 0U; 00071 trace_mode = mode; 00072 } 00073 00074 /* 00075 * トレースログの開始 00076 */ 00077 ER 00078 trace_sta_log(MODE mode) 00079 { 00080 if ((mode & TRACE_CLEAR) != 0U) { 00081 trace_count = 0U; 00082 trace_head = trace_tail = 0U; 00083 } 00084 trace_mode = mode; 00085 return(E_OK); 00086 } 00087 00088 /* 00089 * トレースログの書込み 00090 */ 00091 ER 00092 trace_wri_log(TRACE *p_trace) 00093 { 00094 SIL_PRE_LOC; 00095 00096 if (trace_mode != TRACE_STOP) { 00097 SIL_LOC_INT(); 00098 00099 /* 00100 * トレース時刻の設定 00101 * 00102 * LOG_WRI_LOG_ENTERから呼ばれた場合にp_trace->logtimを書き換 00103 * えてしまうのは気持ちが悪いが,wri_logの方で上書きするため問 00104 * 題はない. 00105 */ 00106 p_trace->logtim = TRACE_GET_TIM(); 00107 00108 /* 00109 * トレースバッファに記録 00110 */ 00111 trace_buffer[trace_tail] = *p_trace; 00112 trace_tail++; 00113 if (trace_tail >= TCNT_TRACE_BUFFER) { 00114 trace_tail = 0U; 00115 } 00116 if (trace_count < TCNT_TRACE_BUFFER) { 00117 trace_count++; 00118 if (trace_count >= TCNT_TRACE_BUFFER 00119 && (trace_mode & TRACE_AUTOSTOP) != 0U) { 00120 trace_mode = TRACE_STOP; 00121 } 00122 } 00123 else { 00124 trace_head = trace_tail; 00125 } 00126 00127 SIL_UNL_INT(); 00128 } 00129 return(E_OK); 00130 } 00131 00132 /* 00133 * トレースログの読出し 00134 */ 00135 ER 00136 trace_rea_log(TRACE *p_trace) 00137 { 00138 ER_UINT ercd; 00139 SIL_PRE_LOC; 00140 00141 SIL_LOC_INT(); 00142 00143 /* 00144 * トレースログバッファからの取出し 00145 */ 00146 if (trace_count > 0U) { 00147 *p_trace = trace_buffer[trace_head]; 00148 trace_count--; 00149 trace_head++; 00150 if (trace_head >= TCNT_TRACE_BUFFER) { 00151 trace_head = 0U; 00152 } 00153 ercd = E_OK; 00154 } 00155 else { 00156 ercd = E_OBJ; 00157 } 00158 00159 SIL_UNL_INT(); 00160 return(ercd); 00161 } 00162 00163 /* 00164 * トレースログを出力するためのライブラリ関数 00165 */ 00166 00167 void 00168 trace_write_0(uint_t type) 00169 { 00170 TRACE trace; 00171 00172 trace.logtype = type; 00173 (void) trace_wri_log(&trace); 00174 } 00175 00176 void 00177 trace_write_1(uint_t type, intptr_t arg1) 00178 { 00179 TRACE trace; 00180 00181 trace.logtype = type; 00182 trace.loginfo[0] = arg1; 00183 (void) trace_wri_log(&trace); 00184 } 00185 00186 void 00187 trace_write_2(uint_t type, intptr_t arg1, intptr_t arg2) 00188 { 00189 TRACE trace; 00190 00191 trace.logtype = type; 00192 trace.loginfo[0] = arg1; 00193 trace.loginfo[1] = arg2; 00194 (void) trace_wri_log(&trace); 00195 } 00196 00197 void 00198 trace_write_3(uint_t type, intptr_t arg1, intptr_t arg2, intptr_t arg3) 00199 { 00200 TRACE trace; 00201 00202 trace.logtype = type; 00203 trace.loginfo[0] = arg1; 00204 trace.loginfo[1] = arg2; 00205 trace.loginfo[2] = arg3; 00206 (void) trace_wri_log(&trace); 00207 } 00208 00209 /* 00210 * アセンブリ言語で記述されるコードからトレースログを出力するための関 00211 * 数 00212 */ 00213 00214 void 00215 log_dsp_enter(TCB *p_tcb) 00216 { 00217 trace_1(LOG_TYPE_DSP|LOG_ENTER, p_tcb); 00218 } 00219 00220 void 00221 log_dsp_leave(TCB *p_tcb) 00222 { 00223 trace_1(LOG_TYPE_DSP|LOG_LEAVE, p_tcb); 00224 } 00225 00226 void 00227 log_inh_enter(INHNO inhno) 00228 { 00229 trace_1(LOG_TYPE_INH|LOG_ENTER, inhno); 00230 } 00231 00232 void 00233 log_inh_leave(INHNO inhno) 00234 { 00235 trace_1(LOG_TYPE_INH|LOG_LEAVE, inhno); 00236 } 00237 00238 void 00239 log_exc_enter(EXCNO excno) 00240 { 00241 trace_1(LOG_TYPE_EXC|LOG_ENTER, excno); 00242 } 00243 00244 void 00245 log_exc_leave(EXCNO excno) 00246 { 00247 trace_1(LOG_TYPE_EXC|LOG_LEAVE, excno); 00248 }
Copyright © 2008 by Kijineko Inc.