source: EcnlProtoTool/trunk/asp3_dcre/arch/tracelog/tTraceLog.c

Last change on this file was 429, checked in by coas-nagasima, 4 years ago

ASP3, TINET, mbed を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 8.9 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
6 * Toyohashi Univ. of Technology, JAPAN
7 * Copyright (C) 2005-2019 by Embedded and Real-Time Systems Laboratory
8 * Graduate School of Information Science, Nagoya Univ., JAPAN
9 *
10 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * $Id$
40 */
41
42/*
43 * トレースログ機能
44 */
45
46#include "tTraceLog_tecsgen.h"
47#include "kernel/kernel_impl.h"
48#include "kernel/task.h"
49#include "kernel/time_event.h"
50#ifdef TOPPERS_SUPPORT_PROTECT
51#include "kernel/domain.h"
52#endif /* TOPPERS_SUPPORT_PROTECT */
53#include <sil.h>
54#include <log_output.h>
55#include "target_syssvc.h"
56
57/*
58 * トレース時刻の取り出し
59 *
60 * デフォルトでは,ログ時刻として,高分解能タイマのカウント値を用いて
61 * いる.ターゲット依存で変更する場合には,TRACE_GET_LOGTIMに,ログ時
62 * 刻を取り出すマクロを定義する.
63 */
64#ifndef TRACE_GET_LOGTIM
65#define TRACE_GET_LOGTIM(p_logtim) \
66 (*(p_logtim) = target_hrt_get_current())
67#endif /* TRACE_GET_TIM */
68
69/*
70 * トレースログの開始(受け口関数)
71 */
72ER
73eTraceLog_start(MODE mode)
74{
75 if ((mode & TRACE_CLEAR) != 0U) {
76 VAR_count = 0U;
77 VAR_head = 0U;
78 VAR_tail = 0U;
79 mode &= ~TRACE_CLEAR;
80 }
81 VAR_mode = mode;
82 return(E_OK);
83}
84
85/*
86 * トレースログの書込み(受け口関数)
87 */
88ER
89eTraceLog_write(const TRACE *p_trace)
90{
91 SIL_PRE_LOC;
92
93 if ((VAR_mode & (TRACE_RINGBUF | TRACE_AUTOSTOP)) != 0U) {
94 SIL_LOC_INT();
95
96 /*
97 * トレース時刻の設定
98 */
99 TRACE_GET_LOGTIM(&(((SYSLOG *) p_trace)->logtim));
100
101 /*
102 * トレースバッファに記録
103 */
104 VAR_logBuffer[VAR_tail] = *p_trace;
105 VAR_tail++;
106 if (VAR_tail >= ATTR_logBufferSize) {
107 VAR_tail = 0U;
108 }
109 if (VAR_count < ATTR_logBufferSize) {
110 VAR_count++;
111 if (VAR_count >= ATTR_logBufferSize
112 && (VAR_mode & TRACE_AUTOSTOP) != 0U) {
113 VAR_mode = TRACE_STOP;
114 }
115 }
116 else {
117 VAR_head = VAR_tail;
118 }
119
120 SIL_UNL_INT();
121 }
122 return(E_OK);
123}
124
125/*
126 * トレースログの読出し(受け口関数)
127 */
128ER
129eTraceLog_read(TRACE* p_trace)
130{
131 ER_UINT ercd;
132 SIL_PRE_LOC;
133
134 SIL_LOC_INT();
135
136 /*
137 * トレースログバッファからの取出し
138 */
139 if (VAR_count > 0U) {
140 *p_trace = VAR_logBuffer[VAR_head];
141 VAR_count--;
142 VAR_head++;
143 if (VAR_head >= ATTR_logBufferSize) {
144 VAR_head = 0U;
145 }
146 ercd = E_OK;
147 }
148 else {
149 ercd = E_OBJ;
150 }
151
152 SIL_UNL_INT();
153 return(ercd);
154}
155
156/*
157 * アセンブリ言語で記述されるコードからトレースログを出力するための関
158 * 数
159 */
160
161void
162log_dsp_enter(TCB *p_tcb)
163{
164 trace_1(LOG_TYPE_DSP|LOG_ENTER, p_tcb);
165}
166
167void
168log_dsp_leave(TCB *p_tcb)
169{
170 trace_1(LOG_TYPE_DSP|LOG_LEAVE, p_tcb);
171}
172
173void
174log_inh_enter(INHNO inhno)
175{
176 trace_1(LOG_TYPE_INH|LOG_ENTER, inhno);
177}
178
179void
180log_inh_leave(INHNO inhno)
181{
182 trace_1(LOG_TYPE_INH|LOG_LEAVE, inhno);
183}
184
185void
186log_exc_enter(EXCNO excno)
187{
188 trace_1(LOG_TYPE_EXC|LOG_ENTER, excno);
189}
190
191void
192log_exc_leave(EXCNO excno)
193{
194 trace_1(LOG_TYPE_EXC|LOG_LEAVE, excno);
195}
196
197/*
198 * カーネル情報の取出し
199 */
200static intptr_t
201get_tskid(intptr_t info)
202{
203 TCB *p_tcb;
204 ID tskid;
205
206 p_tcb = (TCB *) info;
207 if (p_tcb == NULL) {
208 tskid = TSK_NONE;
209 }
210 else {
211 tskid = TSKID(p_tcb);
212 }
213 return((intptr_t) tskid);
214}
215
216static intptr_t
217get_tskstat(intptr_t info)
218{
219 uint_t tstat;
220 const char *tstatstr;
221
222 tstat = (uint_t) info;
223 if (TSTAT_DORMANT(tstat)) {
224 tstatstr = "DORMANT";
225 }
226 else {
227 if (TSTAT_SUSPENDED(tstat)) {
228 if (TSTAT_WAITING(tstat)) {
229 tstatstr = "WAITING-SUSPENDED";
230 }
231 else {
232 tstatstr = "SUSPENDED";
233 }
234 }
235 else if (TSTAT_WAITING(tstat)) {
236 tstatstr = "WAITING";
237 }
238 else {
239 tstatstr = "RUNNABLE";
240 }
241 }
242 return((intptr_t) tstatstr);
243}
244
245#ifdef TOPPERS_SUPPORT_PROTECT
246
247static intptr_t
248get_somid(intptr_t info)
249{
250 SOMINIB *p_sominib;
251 ID somid;
252
253 p_sominib = (SOMINIB *) info;
254 if (p_sominib == NULL) {
255 somid = TSOM_STP;
256 }
257 else {
258 somid = SOMID(p_sominib);
259 }
260 return((intptr_t) somid);
261}
262
263static intptr_t
264get_twd_domid(intptr_t info)
265{
266 TWDINIB *p_twdinib;
267 ID domid;
268
269 p_twdinib = (TWDINIB *) info;
270 domid = (ID)(p_twdinib->p_dominib - dominib_table) + TMIN_DOMID;
271 return((intptr_t) domid);
272}
273
274#endif /* TOPPERS_SUPPORT_PROTECT */
275
276/*
277 * トレースログの表示
278 */
279static void
280trace_print(TRACE *p_trace, void (*putc)(char))
281{
282 intptr_t traceinfo[TNUM_LOGPAR + 1];
283 const char *tracemsg;
284 int_t i;
285
286 traceinfo[0] = (intptr_t)(p_trace->logtim);
287 syslog_printf("[%d] ", traceinfo, putc);
288
289 switch (p_trace->logtype) {
290 case LOG_TYPE_TSKSTAT:
291 traceinfo[0] = get_tskid(p_trace->logpar[0]);
292 traceinfo[1] = get_tskstat(p_trace->logpar[1]);
293 tracemsg = "task %d becomes %s.";
294 break;
295 case LOG_TYPE_DSP|LOG_ENTER:
296 traceinfo[0] = get_tskid(p_trace->logpar[0]);
297 tracemsg = "dispatch from task %d.";
298 break;
299 case LOG_TYPE_DSP|LOG_LEAVE:
300 traceinfo[0] = get_tskid(p_trace->logpar[0]);
301 tracemsg = "dispatch to task %d.";
302 break;
303
304#ifdef TOPPERS_SUPPORT_PROTECT
305 case LOG_TYPE_SCYC|LOG_START:
306 traceinfo[0] = get_somid(p_trace->logpar[0]);
307 tracemsg = "system cycle starts with system operating mode %d.";
308 break;
309 case LOG_TYPE_TWD|LOG_START:
310 if (p_trace->logpar[0] == 0) {
311 tracemsg = "idle window starts.";
312 }
313 else {
314 traceinfo[0] = get_twd_domid(p_trace->logpar[0]);
315 tracemsg = "time window for domain %d starts.";
316 }
317 break;
318#endif /* TOPPERS_SUPPORT_PROTECT */
319
320 case LOG_TYPE_COMMENT:
321 for (i = 1; i < TNUM_LOGPAR; i++) {
322 traceinfo[i-1] = p_trace->logpar[i];
323 }
324 tracemsg = (const char *)(p_trace->logpar[0]);
325 break;
326 case LOG_TYPE_ASSERT:
327 traceinfo[0] = p_trace->logpar[0];
328 traceinfo[1] = p_trace->logpar[1];
329 traceinfo[2] = p_trace->logpar[2];
330 tracemsg = "%s:%u: Assertion `%s' failed.";
331 break;
332 case LOG_TYPE_INH|LOG_ENTER:
333 traceinfo[0] = p_trace->logpar[0];
334 tracemsg = "interrupt IN: %d";
335 break;
336 case LOG_TYPE_INH|LOG_LEAVE:
337 traceinfo[0] = p_trace->logpar[0];
338 tracemsg = "interrupt OUT: %d";
339 break;
340 case LOG_TYPE_EXC|LOG_ENTER:
341 traceinfo[0] = p_trace->logpar[0];
342 tracemsg = "exception IN: %d";
343 break;
344 case LOG_TYPE_EXC|LOG_LEAVE:
345 traceinfo[0] = p_trace->logpar[0];
346 tracemsg = "exception OUT: %d";
347 break;
348 default:
349 traceinfo[0] = p_trace->logtype;
350 tracemsg = "unknown trace log type: %d.";
351 break;
352 }
353 syslog_printf(tracemsg, traceinfo, putc);
354 (*putc)('\n');
355}
356
357/*
358 * 低レベル出力の呼出し関数
359 */
360static void
361low_putchar(char c)
362{
363 cPutLog_putChar(c);
364}
365
366/*
367 * トレースログのダンプ(受け口関数)
368 */
369void
370eDump_main(uintptr_t exinf)
371{
372 TRACE trace;
373
374 while (trace_rea_log(&trace) >= 0) {
375 trace_print(&trace, low_putchar);
376 }
377}
Note: See TracBrowser for help on using the repository browser.