source: rubycfg_asp/trunk/asp_dcre/sample/sample1.c@ 313

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

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 18.5 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2012 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: sample1.c 313 2017-07-23 04:50:32Z coas-nagasima $
56 */
57
58/*
59 * サンプルプログラム(1)の本体
60 *
61 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム.
62 *
63 * プログラムの概要:
64 *
65 * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,優
66 * å…
67ˆåº¦: MAIN_PRIORITY)と,3つの並行実行されるタスク(タスクID:
68 * TASK1~TASK3,初期優å…
69ˆåº¦: MID_PRIORITY)で構成される.また,起動周
70 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
71 *
72 * 並行実行されるタスクは,task_loop回空ループを実行する度に,タスクが
73 * 実行中であることをあらわすメッセージを表示する.空ループを実行する
74 * のは,空ループなしでメッセージを出力すると,多量のメッセージが出力
75 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ
76 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
77 * が出力できるように,メッセージの量を制限するという理由もある.
78 *
79 * 周期ハンドラは,三つの優å…
80ˆåº¦ï¼ˆHIGH_PRIORITY,MID_PRIORITY,
81 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
82 * 周期ハンドラは停止状æ…
83‹ã«ãªã£ã¦ã„る.
84 *
85 * メインタスクは,シリアルI/Oポートからの文字å…
86¥åŠ›ã‚’行い(文字å…
87¥åŠ›ã‚’
88 * 待
89っている間は,並行実行されるタスクが実行されている),å…
90¥åŠ›ã•ã‚ŒãŸ
91 * 文字に対応した処理を実行する.å…
92¥åŠ›ã•ã‚ŒãŸæ–‡å­—と処理の関係は次の通り.
93 * Control-Cまたは'Q'がå…
94¥åŠ›ã•ã‚Œã‚‹ã¨ï¼Œãƒ—ログラムを終了する.
95 *
96 * '1' : 対象タスクをTASK1に切り換える(初期設定).
97 * '2' : 対象タスクをTASK2に切り換える.
98 * '3' : 対象タスクをTASK3に切り換える.
99 * 'a' : 対象タスクをact_tskにより起動する.
100 * 'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする.
101 * 'e' : 対象タスクにext_tskを呼び出させ,終了させる.
102 * 't' : 対象タスクをter_tskにより強制終了する.
103 * '>' : 対象タスクの優å…
104ˆåº¦ã‚’HIGH_PRIORITYにする.
105 * '=' : 対象タスクの優å…
106ˆåº¦ã‚’MID_PRIORITYにする.
107 * '<' : 対象タスクの優å…
108ˆåº¦ã‚’LOW_PRIORITYにする.
109 * 'G' : 対象タスクの優å…
110ˆåº¦ã‚’get_priで読み出す.
111 * 's' : 対象タスクにslp_tskを呼び出させ,起床待
112ちにさせる.
113 * 'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ,起床待
114ちにさせる.
115 * 'w' : 対象タスクをwup_tskにより起床する.
116 * 'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする.
117 * 'l' : 対象タスクをrel_waiにより強制的に待
118ち解除にする.
119 * 'u' : 対象タスクをsus_tskにより強制待
120ち状æ…
121‹ã«ã™ã‚‹ï¼Ž
122 * 'm' : 対象タスクの強制待
123ち状æ…
124‹ã‚’rsm_tskにより解除する.
125 * 'd' : 対象タスクにdly_tsk(10秒)を呼び出させ,時間経過待
126ちにさせる.
127 * 'x' : 対象タスクに例外パターン0x0001の例外処理を要求する.
128 * 'X' : 対象タスクに例外パターン0x0002の例外処理を要求する.
129 * 'y' : 対象タスクにdis_texを呼び出させ,タスク例外を禁止する.
130 * 'Y' : 対象タスクにena_texを呼び出させ,タスク例外を許可する.
131 * 'r' : 3つの優å…
132ˆåº¦ï¼ˆHIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
133 * ディキューを回転させる.
134 * 'c' : 周期ハンドラを動作開始させる.
135 * 'C' : 周期ハンドラを動作停止させる.
136 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
137 * 'B' : アラームハンドラを動作停止させる.
138 * 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
139 * 'Z' : 対象タスクにCPUロック状æ…
140‹ã§CPU例外を発生させる(プログラムを
141 * 終了する).
142 * '@' : タスク3をacre_tskにより生成し,def_texによりタスク例外処理
143 * ルーチンを設定する.
144 * '!' : 対象タスクをdel_tskにより削除する.
145 * 'V' : get_utmで性能評価用システム時刻を2回読む.
146 * 'v' : 発行したシステムコールを表示する(デフォルト).
147 * 'q' : 発行したシステムコールを表示しない.
148 */
149
150#include <kernel.h>
151#include <t_syslog.h>
152#include <t_stdlib.h>
153#include "syssvc/serial.h"
154#include "syssvc/syslog.h"
155#include "kernel_cfg.h"
156#include "sample1.h"
157
158/*
159 * サービスコールのエラーのログ出力
160 */
161Inline void
162svc_perror(const char *file, int_t line, const char *expr, ER ercd)
163{
164 if (ercd < 0) {
165 t_perror(LOG_ERROR, file, line, expr, ercd);
166 }
167}
168
169#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
170
171/*
172 * 並行実行されるタスクへのメッセージ領域
173 */
174char message[3];
175
176/*
177 * ループ回数
178 */
179ulong_t task_loop; /* タスク内
180でのループ回数 */
181ulong_t tex_loop; /* 例外処理ルーチン内
182でのループ回数 */
183
184/*
185 * 並行実行されるタスク
186 */
187void task(intptr_t exinf)
188{
189 volatile ulong_t i;
190 int_t n = 0;
191 int_t tskno = (int_t) exinf;
192 const char *graph[] = { "|", " +", " *" };
193 char c;
194
195 SVC_PERROR(ena_tex());
196 while (true) {
197 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
198 tskno, ++n, graph[tskno-1]);
199 for (i = 0; i < task_loop; i++);
200 c = message[tskno-1];
201 message[tskno-1] = 0;
202 switch (c) {
203 case 'e':
204 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
205 SVC_PERROR(ext_tsk());
206 assert(0);
207 case 's':
208 syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
209 SVC_PERROR(slp_tsk());
210 break;
211 case 'S':
212 syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
213 SVC_PERROR(tslp_tsk(10000));
214 break;
215 case 'd':
216 syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
217 SVC_PERROR(dly_tsk(10000));
218 break;
219 case 'y':
220 syslog(LOG_INFO, "#%d#dis_tex()", tskno);
221 SVC_PERROR(dis_tex());
222 break;
223 case 'Y':
224 syslog(LOG_INFO, "#%d#ena_tex()", tskno);
225 SVC_PERROR(ena_tex());
226 break;
227#ifdef CPUEXC1
228 case 'z':
229 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
230 RAISE_CPU_EXCEPTION;
231 break;
232 case 'Z':
233 SVC_PERROR(loc_cpu());
234 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
235 RAISE_CPU_EXCEPTION;
236 SVC_PERROR(unl_cpu());
237 break;
238#endif /* CPUEXC1 */
239 default:
240 break;
241 }
242 }
243}
244
245/*
246 * 並行して実行されるタスク用のタスク例外処理ルーチン
247 */
248void tex_routine(TEXPTN texptn, intptr_t exinf)
249{
250 volatile ulong_t i;
251 int_t tskno = (int_t) exinf;
252
253 syslog(LOG_NOTICE, "task%d receives exception 0x%04x.", tskno, texptn);
254 for (i = 0; i < tex_loop; i++);
255
256 if ((texptn & 0x8000U) != 0U) {
257 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
258 SVC_PERROR(ext_tsk());
259 assert(0);
260 }
261}
262
263/*
264 * CPU例外ハンドラ
265 */
266#ifdef CPUEXC1
267
268void
269cpuexc_handler(void *p_excinf)
270{
271 ID tskid;
272
273 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
274 if (sns_ctx() != true) {
275 syslog(LOG_WARNING,
276 "sns_ctx() is not true in CPU exception handler.");
277 }
278 if (sns_dpn() != true) {
279 syslog(LOG_WARNING,
280 "sns_dpn() is not true in CPU exception handler.");
281 }
282 syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d sns_tex = %d",
283 sns_loc(), sns_dsp(), sns_tex());
284 syslog(LOG_INFO, "xsns_dpn = %d xsns_xpn = %d",
285 xsns_dpn(p_excinf), xsns_xpn(p_excinf));
286
287 if (xsns_xpn(p_excinf)) {
288 syslog(LOG_NOTICE, "Sample program ends with exception.");
289 SVC_PERROR(ext_ker());
290 assert(0);
291 }
292
293 SVC_PERROR(iget_tid(&tskid));
294 SVC_PERROR(iras_tex(tskid, 0x8000U));
295}
296
297#endif /* CPUEXC1 */
298
299/*
300 * 周期ハンドラ
301 *
302 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優å…
303ˆåº¦ã®ãƒ¬ãƒ‡ã‚£ã‚­ãƒ¥ãƒ¼
304 * を回転させる.
305 */
306void cyclic_handler(intptr_t exinf)
307{
308 SVC_PERROR(irot_rdq(HIGH_PRIORITY));
309 SVC_PERROR(irot_rdq(MID_PRIORITY));
310 SVC_PERROR(irot_rdq(LOW_PRIORITY));
311}
312
313/*
314 * アラームハンドラ
315 *
316 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優å…
317ˆåº¦ã®ãƒ¬ãƒ‡ã‚£ã‚­ãƒ¥ãƒ¼
318 * を回転させる.
319 */
320void alarm_handler(intptr_t exinf)
321{
322 SVC_PERROR(irot_rdq(HIGH_PRIORITY));
323 SVC_PERROR(irot_rdq(MID_PRIORITY));
324 SVC_PERROR(irot_rdq(LOW_PRIORITY));
325}
326
327/*
328 * メインタスク
329 */
330void main_task(intptr_t exinf)
331{
332 char c;
333 ID tskid = TASK1;
334 int_t tskno = 1;
335 ER_UINT ercd;
336 PRI tskpri;
337#ifndef TASK_LOOP
338 volatile ulong_t i;
339 SYSTIM stime1, stime2;
340#endif /* TASK_LOOP */
341#ifdef TOPPERS_SUPPORT_GET_UTM
342 SYSUTM utime1, utime2;
343#endif /* TOPPERS_SUPPORT_GET_UTM */
344 T_CTSK ctsk;
345 T_DTEX dtex;
346 ID TASK3 = -1;
347
348 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
349 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
350
351 /*
352 * シリアルポートの初期化
353 *
354 * システムログタスクと同じシリアルポートを使う場合など,シリアル
355 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
356 * ない.
357 */
358 ercd = serial_opn_por(TASK_PORTID);
359 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
360 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
361 itron_strerror(ercd), SERCD(ercd));
362 }
363 SVC_PERROR(serial_ctl_por(TASK_PORTID,
364 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
365
366 /*
367 * ループ回数の設定
368 *
369 * 並行実行されるタスク内
370での空ループの回数(task_loop)は,空ルー
371 * プの実行時間が約0.4秒になるように設定する.この設定のために,
372 * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで
373 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回
374 * 数を求め,task_loopに設定する.
375 *
376 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ
377 * り遅
378いプロセッサでは,サンプルプログラムの実行開始に時間がかか
379 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは,
380 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値
381 * の誤差が大きくなるという問題がある.
382 *
383 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適
384 * 切な値に定義するのが望ましい.
385 *
386 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
387 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を
388 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.
389 *
390 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
391 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE
392 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
393 * を使う.
394 *
395 * タスク例外処理ルーチン内
396での空ループの回数(tex_loop)は,
397 * task_loopの4分の1の値(空ループの実行時間が0.1秒になるループ回
398 * 数)に設定する.
399 */
400#ifdef TASK_LOOP
401 task_loop = TASK_LOOP;
402#else /* TASK_LOOP */
403
404#ifdef MEASURE_TWICE
405 task_loop = LOOP_REF;
406 SVC_PERROR(get_tim(&stime1));
407 for (i = 0; i < task_loop; i++);
408 SVC_PERROR(get_tim(&stime2));
409#endif /* MEASURE_TWICE */
410
411 task_loop = LOOP_REF;
412 SVC_PERROR(get_tim(&stime1));
413 for (i = 0; i < task_loop; i++);
414 SVC_PERROR(get_tim(&stime2));
415 task_loop = LOOP_REF * 400UL / (stime2 - stime1);
416
417#endif /* TASK_LOOP */
418 tex_loop = task_loop / 4;
419
420 /*
421 * タスクの起動
422 */
423 SVC_PERROR(act_tsk(TASK1));
424 SVC_PERROR(act_tsk(TASK2));
425
426 /*
427 * メインループ
428 */
429 do {
430 SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
431 switch (c) {
432 case 'e':
433 case 's':
434 case 'S':
435 case 'd':
436 case 'y':
437 case 'Y':
438 case 'z':
439 case 'Z':
440 message[tskno-1] = c;
441 break;
442 case '1':
443 tskno = 1;
444 tskid = TASK1;
445 break;
446 case '2':
447 tskno = 2;
448 tskid = TASK2;
449 break;
450 case '3':
451 tskno = 3;
452 tskid = TASK3;
453 break;
454 case 'a':
455 syslog(LOG_INFO, "#act_tsk(%d)", tskno);
456 SVC_PERROR(act_tsk(tskid));
457 break;
458 case 'A':
459 syslog(LOG_INFO, "#can_act(%d)", tskno);
460 SVC_PERROR(ercd = can_act(tskid));
461 if (ercd >= 0) {
462 syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
463 }
464 break;
465 case 't':
466 syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
467 SVC_PERROR(ter_tsk(tskid));
468 break;
469 case '>':
470 syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
471 SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
472 break;
473 case '=':
474 syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
475 SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
476 break;
477 case '<':
478 syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
479 SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
480 break;
481 case 'G':
482 syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
483 SVC_PERROR(ercd = get_pri(tskid, &tskpri));
484 if (ercd >= 0) {
485 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
486 }
487 break;
488 case 'w':
489 syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
490 SVC_PERROR(wup_tsk(tskid));
491 break;
492 case 'W':
493 syslog(LOG_INFO, "#can_wup(%d)", tskno);
494 SVC_PERROR(ercd = can_wup(tskid));
495 if (ercd >= 0) {
496 syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
497 }
498 break;
499 case 'l':
500 syslog(LOG_INFO, "#rel_wai(%d)", tskno);
501 SVC_PERROR(rel_wai(tskid));
502 break;
503 case 'u':
504 syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
505 SVC_PERROR(sus_tsk(tskid));
506 break;
507 case 'm':
508 syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
509 SVC_PERROR(rsm_tsk(tskid));
510 break;
511 case 'x':
512 syslog(LOG_INFO, "#ras_tex(%d, 0x0001U)", tskno);
513 SVC_PERROR(ras_tex(tskid, 0x0001U));
514 break;
515 case 'X':
516 syslog(LOG_INFO, "#ras_tex(%d, 0x0002U)", tskno);
517 SVC_PERROR(ras_tex(tskid, 0x0002U));
518 break;
519 case 'r':
520 syslog(LOG_INFO, "#rot_rdq(three priorities)");
521 SVC_PERROR(rot_rdq(HIGH_PRIORITY));
522 SVC_PERROR(rot_rdq(MID_PRIORITY));
523 SVC_PERROR(rot_rdq(LOW_PRIORITY));
524 break;
525 case 'c':
526 syslog(LOG_INFO, "#sta_cyc(1)");
527 SVC_PERROR(sta_cyc(CYCHDR1));
528 break;
529 case 'C':
530 syslog(LOG_INFO, "#stp_cyc(1)");
531 SVC_PERROR(stp_cyc(CYCHDR1));
532 break;
533 case 'b':
534 syslog(LOG_INFO, "#sta_alm(1, 5000)");
535 SVC_PERROR(sta_alm(ALMHDR1, 5000));
536 break;
537 case 'B':
538 syslog(LOG_INFO, "#stp_alm(1)");
539 SVC_PERROR(stp_alm(ALMHDR1));
540 break;
541 case '@':
542 ctsk.tskatr = TA_NULL;
543 ctsk.exinf = 3;
544 ctsk.task = task;
545 ctsk.itskpri = MID_PRIORITY;
546 ctsk.stksz = STACK_SIZE;
547 ctsk.stk = NULL;
548 SVC_PERROR(TASK3 = acre_tsk(&ctsk));
549
550 dtex.texatr = TA_NULL;
551 dtex.texrtn = tex_routine;
552 SVC_PERROR(def_tex(TASK3, &dtex));
553
554 syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
555 (int_t) TASK3);
556 break;
557 case '!':
558 syslog(LOG_INFO, "#del_tsk(%d)", tskno);
559 SVC_PERROR(del_tsk(tskid));
560 break;
561
562 case 'V':
563#ifdef TOPPERS_SUPPORT_GET_UTM
564 SVC_PERROR(get_utm(&utime1));
565 SVC_PERROR(get_utm(&utime2));
566 syslog(LOG_NOTICE, "utime1 = %ld, utime2 = %ld",
567 (ulong_t) utime1, (ulong_t) utime2);
568#else /* TOPPERS_SUPPORT_GET_UTM */
569 syslog(LOG_NOTICE, "get_utm is not supported.");
570#endif /* TOPPERS_SUPPORT_GET_UTM */
571 break;
572
573 case 'v':
574 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
575 LOG_UPTO(LOG_EMERG)));
576 break;
577 case 'q':
578 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
579 LOG_UPTO(LOG_EMERG)));
580 break;
581
582#ifdef BIT_KERNEL
583 case ' ':
584 SVC_PERROR(loc_cpu());
585 {
586 extern ER bit_kernel(void);
587
588 SVC_PERROR(ercd = bit_kernel());
589 if (ercd >= 0) {
590 syslog(LOG_NOTICE, "bit_kernel passed.");
591 }
592 }
593 SVC_PERROR(unl_cpu());
594 break;
595#endif /* BIT_KERNEL */
596
597 default:
598 break;
599 }
600 } while (c != '\003' && c != 'Q');
601
602 syslog(LOG_NOTICE, "Sample program ends.");
603 SVC_PERROR(ext_ker());
604 assert(0);
605}
Note: See TracBrowser for help on using the repository browser.