source: asp_wo_cfg/trunk/arch/logtrace/trace_config.c@ 49

Last change on this file since 49 was 49, checked in by ertl-hiro, 12 years ago

asp_wo_kernelをコミット。

  • Property svn:keywords set to Id
File size: 5.3 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2011 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * @(#) $Id: trace_config.c 49 2012-09-06 04:41:53Z ertl-hiro $
41 */
42
43/*
44 * トレースログ機能
45 */
46
47#include "kernel_impl.h"
48#include "task.h"
49#include "time_event.h"
50#include <sil.h>
51
52/*
53 * トレースログバッファとそれにアクセスするためのポインタ
54 */
55SYSLOG trace_buffer[TCNT_TRACE_BUFFER]; /* トレースログバッファ */
56uint_t trace_count; /* トレースログバッファ中のログの数 */
57uint_t trace_head; /* 先頭のトレースログの格納位置 */
58uint_t trace_tail; /* 次のトレースログの格納位置 */
59MODE trace_mode; /* トレースモード */
60
61/*
62 * トレースログ機能の初期化
63 */
64void
65trace_initialize(intptr_t exinf)
66{
67 MODE mode = ((MODE) exinf);
68
69 trace_count = 0U;
70 trace_head = 0U;
71 trace_tail = 0U;
72 trace_mode = mode;
73}
74
75/*
76 * トレースログの開始
77 */
78ER
79trace_sta_log(MODE mode)
80{
81 if ((mode & TRACE_CLEAR) != 0U) {
82 trace_count = 0U;
83 trace_head = 0U;
84 trace_tail = 0U;
85 }
86 trace_mode = mode;
87 return(E_OK);
88}
89
90/*
91 * トレースログの書込み
92 */
93ER
94trace_wri_log(TRACE *p_trace)
95{
96 SIL_PRE_LOC;
97
98 if (trace_mode != TRACE_STOP) {
99 SIL_LOC_INT();
100
101 /*
102 * トレース時刻の設定
103 *
104 * LOG_WRI_LOG_ENTERから呼ばれた場合にp_trace->logtimを書き換
105 * えてしまうのは気持ちが悪いが,wri_logの方で上書きするため問
106 * 題はない.
107 */
108 p_trace->logtim = TRACE_GET_TIM();
109
110 /*
111 * トレースバッファに記録
112 */
113 trace_buffer[trace_tail] = *p_trace;
114 trace_tail++;
115 if (trace_tail >= TCNT_TRACE_BUFFER) {
116 trace_tail = 0U;
117 }
118 if (trace_count < TCNT_TRACE_BUFFER) {
119 trace_count++;
120 if (trace_count >= TCNT_TRACE_BUFFER
121 && (trace_mode & TRACE_AUTOSTOP) != 0U) {
122 trace_mode = TRACE_STOP;
123 }
124 }
125 else {
126 trace_head = trace_tail;
127 }
128
129 SIL_UNL_INT();
130 }
131 return(E_OK);
132}
133
134/*
135 * トレースログの読出し
136 */
137ER
138trace_rea_log(TRACE *p_trace)
139{
140 ER_UINT ercd;
141 SIL_PRE_LOC;
142
143 SIL_LOC_INT();
144
145 /*
146 * トレースログバッファからの取出し
147 */
148 if (trace_count > 0U) {
149 *p_trace = trace_buffer[trace_head];
150 trace_count--;
151 trace_head++;
152 if (trace_head >= TCNT_TRACE_BUFFER) {
153 trace_head = 0U;
154 }
155 ercd = E_OK;
156 }
157 else {
158 ercd = E_OBJ;
159 }
160
161 SIL_UNL_INT();
162 return(ercd);
163}
164
165/*
166 * トレースログを出力するためのライブラリ関数
167 */
168
169void
170trace_write_0(uint_t type)
171{
172 TRACE trace;
173
174 trace.logtype = type;
175 (void) trace_wri_log(&trace);
176}
177
178void
179trace_write_1(uint_t type, intptr_t arg1)
180{
181 TRACE trace;
182
183 trace.logtype = type;
184 trace.loginfo[0] = arg1;
185 (void) trace_wri_log(&trace);
186}
187
188void
189trace_write_2(uint_t type, intptr_t arg1, intptr_t arg2)
190{
191 TRACE trace;
192
193 trace.logtype = type;
194 trace.loginfo[0] = arg1;
195 trace.loginfo[1] = arg2;
196 (void) trace_wri_log(&trace);
197}
198
199void
200trace_write_3(uint_t type, intptr_t arg1, intptr_t arg2, intptr_t arg3)
201{
202 TRACE trace;
203
204 trace.logtype = type;
205 trace.loginfo[0] = arg1;
206 trace.loginfo[1] = arg2;
207 trace.loginfo[2] = arg3;
208 (void) trace_wri_log(&trace);
209}
210
211/*
212 * アセンブリ言語で記述されるコードからトレースログを出力するための関
213 * 数
214 */
215
216void
217log_dsp_enter(TCB *p_tcb)
218{
219 trace_1(LOG_TYPE_DSP|LOG_ENTER, p_tcb);
220}
221
222void
223log_dsp_leave(TCB *p_tcb)
224{
225 trace_1(LOG_TYPE_DSP|LOG_LEAVE, p_tcb);
226}
227
228void
229log_inh_enter(INHNO inhno)
230{
231 trace_1(LOG_TYPE_INH|LOG_ENTER, inhno);
232}
233
234void
235log_inh_leave(INHNO inhno)
236{
237 trace_1(LOG_TYPE_INH|LOG_LEAVE, inhno);
238}
239
240void
241log_exc_enter(EXCNO excno)
242{
243 trace_1(LOG_TYPE_EXC|LOG_ENTER, excno);
244}
245
246void
247log_exc_leave(EXCNO excno)
248{
249 trace_1(LOG_TYPE_EXC|LOG_LEAVE, excno);
250}
Note: See TracBrowser for help on using the repository browser.