00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2007,2008 by Embedded and Real-Time Systems Laboratory 00007 * Graduate School of Information Science, Nagoya Univ., JAPAN 00008 * 00009 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00010 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00011 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00012 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00013 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00014 * スコード中に含まれていること. 00015 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00016 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00017 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00018 * の無保証規定を掲載すること. 00019 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00020 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00021 * と. 00022 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00023 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00024 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00025 * 報告すること. 00026 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00027 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00028 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00029 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00030 * 免責すること. 00031 * 00032 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00033 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00034 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00035 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00036 * の責任を負わない. 00037 * 00038 * @(#) $Id$ 00039 */ 00040 00041 /* 00042 * トレースログのダンプ 00043 */ 00044 00045 #include "kernel_impl.h" 00046 #include "task.h" 00047 #include <log_output.h> 00048 00049 /* 00050 * カーネル情報の取出し 00051 */ 00052 static intptr_t 00053 get_tskid(intptr_t info) 00054 { 00055 TCB *p_tcb; 00056 ID tskid; 00057 00058 p_tcb = (TCB *) info; 00059 if (p_tcb == NULL) { 00060 tskid = 0; 00061 } 00062 else { 00063 tskid = TSKID(p_tcb); 00064 } 00065 return((intptr_t) tskid); 00066 } 00067 00068 static intptr_t 00069 get_tskstat(intptr_t info) 00070 { 00071 uint_t tstat; 00072 const char *tstatstr; 00073 00074 tstat = (uint_t) info; 00075 switch (tstat & (TS_RUNNABLE|TS_WAITING|TS_SUSPENDED)) { 00076 case TS_DORMANT: 00077 tstatstr = "DORMANT"; 00078 break; 00079 case TS_RUNNABLE: 00080 tstatstr = "RUNNABLE"; 00081 break; 00082 case TS_WAITING: 00083 tstatstr = "WAITING"; 00084 break; 00085 case TS_SUSPENDED: 00086 tstatstr = "SUSPENDED"; 00087 break; 00088 case TS_WAITING|TS_SUSPENDED: 00089 tstatstr = "WAITING-SUSPENDED"; 00090 break; 00091 default: 00092 tstatstr = "unknown state"; 00093 break; 00094 } 00095 return((intptr_t) tstatstr); 00096 } 00097 00098 /* 00099 * トレースログの表示 00100 */ 00101 static void 00102 trace_print(TRACE *p_trace, void (*putc)(char_t)) 00103 { 00104 intptr_t traceinfo[TMAX_LOGINFO + 1]; 00105 const char *tracemsg; 00106 int_t i; 00107 00108 traceinfo[0] = (intptr_t)(p_trace->logtim); 00109 syslog_printf("[%d] ", traceinfo, putc); 00110 00111 switch (p_trace->logtype) { 00112 case LOG_TYPE_TSKSTAT: 00113 traceinfo[0] = get_tskid(p_trace->loginfo[0]); 00114 traceinfo[1] = get_tskstat(p_trace->loginfo[1]); 00115 tracemsg = "task %d becomes %s."; 00116 break; 00117 case LOG_TYPE_DSP|LOG_LEAVE: 00118 traceinfo[0] = get_tskid(p_trace->loginfo[0]); 00119 tracemsg = "dispatch to task %d."; 00120 break; 00121 case LOG_TYPE_COMMENT: 00122 for (i = 1; i < TMAX_LOGINFO; i++) { 00123 traceinfo[i-1] = p_trace->loginfo[i]; 00124 } 00125 tracemsg = (const char *)(p_trace->loginfo[0]); 00126 break; 00127 case LOG_TYPE_ASSERT: 00128 traceinfo[0] = p_trace->loginfo[0]; 00129 traceinfo[1] = p_trace->loginfo[1]; 00130 traceinfo[2] = p_trace->loginfo[2]; 00131 tracemsg = "%s:%u: Assertion `%s' failed."; 00132 break; 00133 default: 00134 traceinfo[0] = p_trace->logtype; 00135 tracemsg = "unknown trace log type: %d."; 00136 break; 00137 } 00138 syslog_printf(tracemsg, traceinfo, putc); 00139 (*putc)('\n'); 00140 } 00141 00142 /* 00143 * トレースログのダンプ 00144 */ 00145 void 00146 trace_dump(intptr_t exinf) 00147 { 00148 TRACE trace; 00149 void (*putc)(char_t); 00150 00151 putc = (void (*)(char_t)) exinf; 00152 while (trace_rea_log(&trace) >= 0) { 00153 trace_print(&trace, putc); 00154 } 00155 }
Copyright © 2008 by Kijineko Inc.