00001 /* 00002 * TOPPERS/ASP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Advanced Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ 00012 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 00013 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 00031 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 00032 * 免責すること. 00033 * 00034 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00035 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 00036 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 00037 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 00038 * の責任を負わない. 00039 * 00040 * @(#) $Id: logtask.c 823 2008-03-18 13:02:11Z hiro $ 00041 */ 00042 00043 /* 00044 * システムログタスク 00045 */ 00046 00047 #include <kernel.h> 00048 #include <t_syslog.h> 00049 #include <log_output.h> 00050 #include "syssvc/serial.h" 00051 #include "syssvc/syslog.h" 00052 #include "logtask.h" 00053 00054 /* 00055 * システムログタスクの出力先のポートID 00056 */ 00057 static ID logtask_portid; 00058 00059 /* 00060 * シリアルインタフェースへの1文字出力 00061 */ 00062 static void 00063 logtask_putc(char_t c) 00064 { 00065 serial_wri_dat(logtask_portid, &c, 1); 00066 } 00067 00068 /* 00069 * システムログ出力の待ち合わせ 00070 */ 00071 ER 00072 logtask_flush(uint_t count) 00073 { 00074 T_SYSLOG_RLOG rlog; 00075 T_SERIAL_RPOR rpor; 00076 ER ercd, rercd; 00077 00078 if (sns_dpn()) { 00079 ercd = E_CTX; 00080 } 00081 else { 00082 for (;;) { 00083 if (syslog_ref_log(&rlog) < 0) { 00084 ercd = E_SYS; 00085 goto error_exit; 00086 } 00087 if (rlog.count <= count) { 00088 if (count == 0U) { 00089 /* 00090 * countが0の場合には,シリアルバッファが空かを確 00091 * 認する. 00092 */ 00093 if (serial_ref_por(logtask_portid, &rpor) < 0) { 00094 ercd = E_SYS; 00095 goto error_exit; 00096 } 00097 if (rpor.wricnt == 0U) { 00098 ercd = E_OK; 00099 goto error_exit; 00100 } 00101 } 00102 else { 00103 ercd = E_OK; 00104 goto error_exit; 00105 } 00106 } 00107 00108 /* 00109 * LOGTASK_FLUSH_WAITミリ秒待つ. 00110 */ 00111 rercd = dly_tsk(LOGTASK_FLUSH_WAIT); 00112 if (rercd < 0) { 00113 ercd = (rercd == E_RLWAI) ? rercd : E_SYS; 00114 goto error_exit; 00115 } 00116 } 00117 } 00118 00119 error_exit: 00120 return(ercd); 00121 } 00122 00123 /* 00124 * システムログタスクの本体 00125 */ 00126 void 00127 logtask_main(intptr_t exinf) 00128 { 00129 SYSLOG syslog; 00130 uint_t lost; 00131 ER_UINT rercd; 00132 00133 logtask_portid = (ID) exinf; 00134 serial_opn_por(logtask_portid); 00135 syslog_msk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG)); 00136 syslog_1(LOG_NOTICE, "System logging task is started on port %d.", 00137 logtask_portid); 00138 for (;;) { 00139 lost = 0U; 00140 while ((rercd = syslog_rea_log(&syslog)) >= 0) { 00141 lost += (uint_t) rercd; 00142 if (syslog.logtype >= LOG_TYPE_COMMENT) { 00143 if (lost > 0U) { 00144 syslog_lostmsg(lost, logtask_putc); 00145 lost = 0U; 00146 } 00147 syslog_print(&syslog, logtask_putc); 00148 logtask_putc('\n'); 00149 } 00150 } 00151 if (lost > 0U) { 00152 syslog_lostmsg(lost, logtask_putc); 00153 } 00154 dly_tsk(LOGTASK_INTERVAL); 00155 } 00156 } 00157 00158 /* 00159 * システムログタスクの終了処理 00160 */ 00161 void 00162 logtask_terminate(intptr_t exinf) 00163 { 00164 char_t c; 00165 SYSLOG syslog; 00166 ER_UINT rercd; 00167 00168 /* 00169 * シリアルインタフェースドライバの送信バッファに蓄積されたデータ 00170 * を,低レベル出力機能を用いて出力する. 00171 */ 00172 while (serial_get_chr(logtask_portid, &c)) { 00173 target_fput_log(c); 00174 } 00175 00176 /* 00177 * ログバッファに記録されたログ情報を,低レベル出力機能を用いて出 00178 * 力する. 00179 */ 00180 while ((rercd = syslog_rea_log(&syslog)) >= 0) { 00181 if (rercd > 0) { 00182 syslog_lostmsg((uint_t) rercd, target_fput_log); 00183 } 00184 if (syslog.logtype >= LOG_TYPE_COMMENT) { 00185 syslog_print(&syslog, target_fput_log); 00186 target_fput_log('\n'); 00187 } 00188 } 00189 }
Copyright © 2008 by Kijineko Inc.