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

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

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 7.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-2016 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#include <sil.h>
51#include <log_output.h>
52#include "target_syssvc.h"
53
54/*
55 * トレース時刻の取り出し
56 *
57 * デフォルトでは,ログ時刻として,高分解能タイマのカウント値を用いて
58 * いる.ターゲット依存で変更する場合には,SYSLOG_GET_LOGTIMに,ログ時
59 * 刻を取り出すマクロを定義する.
60 */
61#ifndef SYSLOG_GET_LOGTIM
62#define SYSLOG_GET_LOGTIM(p_logtim) \
63 (*(p_logtim) = target_hrt_get_current())
64#endif /* SYSLOG_GET_TIM */
65
66/*
67 * トレースログの開始
68 */
69ER
70eTraceLog_start(MODE mode)
71{
72 if ((mode & TRACE_CLEAR) != 0U) {
73 VAR_count = 0U;
74 VAR_head = 0U;
75 VAR_tail = 0U;
76 mode &= ~TRACE_CLEAR;
77 }
78 VAR_mode = mode;
79 return(E_OK);
80}
81
82/*
83 * トレースログの書込み
84 */
85ER
86eTraceLog_write(const TRACE *p_trace)
87{
88 SIL_PRE_LOC;
89
90 if ((VAR_mode & (TRACE_RINGBUF | TRACE_AUTOSTOP)) != 0U) {
91 SIL_LOC_INT();
92
93 /*
94 * トレース時刻の設定
95 */
96 SYSLOG_GET_LOGTIM(&(((SYSLOG *) p_trace)->logtim));
97
98 /*
99 * トレースバッファに記録
100 */
101 VAR_logBuffer[VAR_tail] = *p_trace;
102 VAR_tail++;
103 if (VAR_tail >= ATTR_logBufferSize) {
104 VAR_tail = 0U;
105 }
106 if (VAR_count < ATTR_logBufferSize) {
107 VAR_count++;
108 if (VAR_count >= ATTR_logBufferSize
109 && (VAR_mode & TRACE_AUTOSTOP) != 0U) {
110 VAR_mode = TRACE_STOP;
111 }
112 }
113 else {
114 VAR_head = VAR_tail;
115 }
116
117 SIL_UNL_INT();
118 }
119 return(E_OK);
120}
121
122/*
123 * トレースログの読出し
124 */
125ER
126eTraceLog_read(TRACE* p_trace)
127{
128 ER_UINT ercd;
129 SIL_PRE_LOC;
130
131 SIL_LOC_INT();
132
133 /*
134 * トレースログバッファからの取出し
135 */
136 if (VAR_count > 0U) {
137 *p_trace = VAR_logBuffer[VAR_head];
138 VAR_count--;
139 VAR_head++;
140 if (VAR_head >= ATTR_logBufferSize) {
141 VAR_head = 0U;
142 }
143 ercd = E_OK;
144 }
145 else {
146 ercd = E_OBJ;
147 }
148
149 SIL_UNL_INT();
150 return(ercd);
151}
152
153/*
154 * アセンブリ言語で記述されるコードからトレースログを出力するための関
155 * 数
156 */
157
158void
159log_dsp_enter(TCB *p_tcb)
160{
161 trace_1(LOG_TYPE_DSP|LOG_ENTER, p_tcb);
162}
163
164void
165log_dsp_leave(TCB *p_tcb)
166{
167 trace_1(LOG_TYPE_DSP|LOG_LEAVE, p_tcb);
168}
169
170void
171log_inh_enter(INHNO inhno)
172{
173 trace_1(LOG_TYPE_INH|LOG_ENTER, inhno);
174}
175
176void
177log_inh_leave(INHNO inhno)
178{
179 trace_1(LOG_TYPE_INH|LOG_LEAVE, inhno);
180}
181
182void
183log_exc_enter(EXCNO excno)
184{
185 trace_1(LOG_TYPE_EXC|LOG_ENTER, excno);
186}
187
188void
189log_exc_leave(EXCNO excno)
190{
191 trace_1(LOG_TYPE_EXC|LOG_LEAVE, excno);
192}
193
194/*
195 * カーネル情報の取出し
196 */
197static intptr_t
198get_tskid(intptr_t info)
199{
200 TCB *p_tcb;
201 ID tskid;
202
203 p_tcb = (TCB *) info;
204 if (p_tcb == NULL) {
205 tskid = 0;
206 }
207 else {
208 tskid = TSKID(p_tcb);
209 }
210 return((intptr_t) tskid);
211}
212
213static intptr_t
214get_tskstat(intptr_t info)
215{
216 uint_t tstat;
217 const char *tstatstr;
218
219 tstat = (uint_t) info;
220 if (TSTAT_DORMANT(tstat)) {
221 tstatstr = "DORMANT";
222 }
223 else {
224 if (TSTAT_SUSPENDED(tstat)) {
225 if (TSTAT_WAITING(tstat)) {
226 tstatstr = "WAITING-SUSPENDED";
227 }
228 else {
229 tstatstr = "SUSPENDED";
230 }
231 }
232 else if (TSTAT_WAITING(tstat)) {
233 tstatstr = "WAITING";
234 }
235 else {
236 tstatstr = "RUNNABLE";
237 }
238 }
239 return((intptr_t) tstatstr);
240}
241
242/*
243 * トレースログの表示
244 */
245static void
246trace_print(TRACE *p_trace, void (*putc)(char))
247{
248 intptr_t traceinfo[TNUM_LOGPAR + 1];
249 const char *tracemsg;
250 int_t i;
251
252 traceinfo[0] = (intptr_t)(p_trace->logtim);
253 syslog_printf("[%d] ", traceinfo, putc);
254
255 switch (p_trace->logtype) {
256 case LOG_TYPE_TSKSTAT:
257 traceinfo[0] = get_tskid(p_trace->logpar[0]);
258 traceinfo[1] = get_tskstat(p_trace->logpar[1]);
259 tracemsg = "task %d becomes %s.";
260 break;
261 case LOG_TYPE_DSP|LOG_ENTER:
262 traceinfo[0] = get_tskid(p_trace->logpar[0]);
263 tracemsg = "dispatch from task %d.";
264 break;
265 case LOG_TYPE_DSP|LOG_LEAVE:
266 traceinfo[0] = get_tskid(p_trace->logpar[0]);
267 tracemsg = "dispatch to task %d.";
268 break;
269 case LOG_TYPE_COMMENT:
270 for (i = 1; i < TNUM_LOGPAR; i++) {
271 traceinfo[i-1] = p_trace->logpar[i];
272 }
273 tracemsg = (const char *)(p_trace->logpar[0]);
274 break;
275 case LOG_TYPE_ASSERT:
276 traceinfo[0] = p_trace->logpar[0];
277 traceinfo[1] = p_trace->logpar[1];
278 traceinfo[2] = p_trace->logpar[2];
279 tracemsg = "%s:%u: Assertion `%s' failed.";
280 break;
281 case LOG_TYPE_INH|LOG_ENTER:
282 traceinfo[0] = p_trace->logpar[0];
283 tracemsg = "interrupt IN: %d";
284 break;
285 case LOG_TYPE_INH|LOG_LEAVE:
286 traceinfo[0] = p_trace->logpar[0];
287 tracemsg = "interrupt OUT: %d";
288 break;
289 case LOG_TYPE_EXC|LOG_ENTER:
290 traceinfo[0] = p_trace->logpar[0];
291 tracemsg = "exception IN: %d";
292 break;
293 case LOG_TYPE_EXC|LOG_LEAVE:
294 traceinfo[0] = p_trace->logpar[0];
295 tracemsg = "exception OUT: %d";
296 break;
297 default:
298 traceinfo[0] = p_trace->logtype;
299 tracemsg = "unknown trace log type: %d.";
300 break;
301 }
302 syslog_printf(tracemsg, traceinfo, putc);
303 (*putc)('\n');
304}
305
306/*
307 * 低レベル出力の呼出し関数
308 */
309static void
310low_putchar(char c)
311{
312 cPutLog_putChar(c);
313}
314
315/*
316 * トレースログのダンプ
317 */
318void
319eTraceLog_dump(void)
320{
321 TRACE trace;
322
323 while (trace_rea_log(&trace) >= 0) {
324 trace_print(&trace, low_putchar);
325 }
326}
327
328/*
329 * トレースログのダンプ(受け口関数)
330 */
331void
332tTraceLog_eDump_main(uintptr_t exinf)
333{
334 eTraceLog_dump();
335}
Note: See TracBrowser for help on using the repository browser.