trace_config.c

説明を見る。
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.

ホームページ制作