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

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

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