source: asp_wo_cfg/trunk/sample/sample1.c@ 49

Last change on this file since 49 was 49, checked in by ertl-hiro, 12 years ago

asp_wo_kernelをコミット。

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