source: atk2-sc3_fl850f1l/library/log_output.c

Last change on this file was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 7.4 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2011-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: log_output.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * システムログのフォーマット出力
61 */
62
63#include "log_output.h"
64
65void
66_kernel_KernelLibrarySyslog(void *param)
67{
68#ifdef USE_KERNEL_LIBRARY_SYSLOG
69 KERLIBSLG_PRM *prm = (KERLIBSLG_PRM *) param;
70
71 switch (prm->index) {
72 case KERLIBSLG_ID_SYSLOG_INITIALIZE:
73 _syslog_syslog_initialize();
74 break;
75
76 case KERLIBSLG_ID_SYSLOG_WRI_LOG:
77 prm->return_er = _syslog_syslog_wri_log(prm->prio, prm->p_const_syslog);
78 break;
79
80 case KERLIBSLG_ID_SYSLOG_MSK_LOG:
81 prm->return_er = _syslog_syslog_msk_log(prm->lowmask);
82 break;
83
84 case KERLIBSLG_ID_SYSLOG_PRINTF:
85 _syslog_syslog_printf(prm->p_format, prm->p_args, prm->outputc);
86 break;
87
88 case KERLIBSLG_ID_SYSLOG_PRINT:
89 _syslog_syslog_print(prm->p_const_syslog, prm->outputc);
90 break;
91
92 default:
93 /* 上記のケース以外の場合,処理は行わない */
94 break;
95 }
96#endif /* USE_KERNEL_LIBRARY_SYSLOG */
97 return;
98}
99
100/*
101 * 数値を文字列に変換時,uintptr型の数値の最大文字数
102 * 8進数,10進数,16進数へ変換を想定
103 * 動作例:
104 * 2Byteの場合:16進数:FFFF →4文字
105 * :10進数:65535 →5文字
106 * : 8進数:177777→6文字
107 * →CONVERT_BUFLENは最大の6文字を返す
108 * 計算パラメータ:
109 * 8U:1バイトのビット数
110 * 2U:3で割った際の余り1ビット,または2ビット分を含めるための補正値
111 * 3U:10進数へ変換時,最大3ビットで1文字になる
112 * (4ビットだと2桁数字になるため)
113 * 計算例:
114 * 2Byteの場合
115 * ビット数は2 * 8U = 16bit
116 * 単純に3で割ると,16 / 3 = 5となり,余り1ビット分の文字数が
117 * 切り捨てられてしまう
118 * 3で割る前に2ビット分足すことで,切捨てを防ぐ
119 * (16 + 2) / 3 = 6文字
120 */
121#define CONVERT_BUFLEN (((sizeof(uintptr) * 8U) + 2U) / 3U)
122
123/*
124 * 数値を文字列に変換
125 */
126static void
127convert(uintptr val, uint32 radix, const char8 *radchar,
128 uint32 width, boolean minus, boolean padzero, void (*outputc)(char8 c))
129{
130 char8 buf[CONVERT_BUFLEN];
131 uint32 i, j;
132
133 i = 0U;
134 do {
135 buf[i++] = radchar[val % radix];
136 val /= radix;
137 } while ((i < CONVERT_BUFLEN) && (val != 0U));
138
139 if ((minus != FALSE) && (width > 0U)) {
140 width -= 1U;
141 }
142 if ((minus != FALSE) && (padzero != FALSE)) {
143 (*outputc)('-');
144 }
145 for (j = i; j < width; j++) {
146 (*outputc)((char8) ((padzero != FALSE) ? '0' : ' '));
147 }
148 if ((minus != FALSE) && (padzero == FALSE)) {
149 (*outputc)('-');
150 }
151 while (i > 0U) {
152 (*outputc)(buf[--i]);
153 }
154}
155
156/*
157 * 文字列整形出力
158 */
159static const char8 raddec[] = "0123456789";
160static const char8 radhex[] = "0123456789abcdef";
161static const char8 radHEX[] = "0123456789ABCDEF";
162
163void
164_syslog_syslog_printf(const char8 *format, const uintptr *p_args, void (*outputc)(char8 c))
165{
166 char8 c;
167 uint32 width;
168 boolean padzero;
169 sintptr val;
170 const char8 *str;
171
172 while ((c = *format++) != '\0') {
173 if (c != '%') {
174 (*outputc)(c);
175 continue;
176 }
177
178 width = 0U;
179 padzero = FALSE;
180 if ((c = *format++) == '0') {
181 padzero = TRUE;
182 c = *format++;
183 }
184 while (('0' <= c) && (c <= '9')) {
185 width = (width * 10U) + (c - '0');
186 c = *format++;
187 }
188 if (c == 'l') {
189 c = *format++;
190 }
191 switch (c) {
192 case 'd':
193 val = (sintptr) (*p_args++);
194 if (val >= 0) {
195 convert((uintptr) val, 10U, raddec,
196 width, FALSE, padzero, outputc);
197 }
198 else {
199 convert((uintptr) (-val), 10U, raddec,
200 width, TRUE, padzero, outputc);
201 }
202 break;
203 case 'u':
204 val = (sintptr) (*p_args++);
205 convert((uintptr) val, 10U, raddec, width, FALSE, padzero, outputc);
206 break;
207 case 'x':
208 case 'p':
209 val = (sintptr) (*p_args++);
210 convert((uintptr) val, 16U, radhex, width, FALSE, padzero, outputc);
211 break;
212 case 'X':
213 val = (sintptr) (*p_args++);
214 convert((uintptr) val, 16U, radHEX, width, FALSE, padzero, outputc);
215 break;
216 case 'c':
217 (*outputc)((char8) (uintptr) (*p_args++));
218 break;
219 case 's':
220 str = (const char8 *) (*p_args++);
221 while ((c = *str++) != '\0') {
222 (*outputc)(c);
223 }
224 break;
225 case '%':
226 (*outputc)('%');
227 break;
228 case '\0':
229 format--;
230 break;
231 default:
232 /* 上記のケース以外の場合,処理は行わない */
233 break;
234 }
235 }
236}
237
238/*
239 * ログ情報の出力
240 */
241void
242_syslog_syslog_print(const SYSLOG *p_syslog, void (*outputc)(char8 c))
243{
244 switch (p_syslog->logtype) {
245 case LOG_TYPE_COMMENT:
246 _syslog_syslog_printf((const char8 *) (p_syslog->loginfo[0]),
247 &(p_syslog->loginfo[1]), outputc);
248 break;
249 case LOG_TYPE_ASSERT:
250 _syslog_syslog_printf("%s:%u: Assertion '%s' failed.",
251 &(p_syslog->loginfo[0]), outputc);
252 break;
253 default:
254 /* 上記のケース以外の場合,出力は行わない */
255 break;
256 }
257}
Note: See TracBrowser for help on using the repository browser.