source: asp3_gr_sakura/trunk/sample/sample1.c@ 318

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

プロパティの文字コードにUTF-8を追加、キーワードを削除

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc; charset=UTF-8
File size: 19.6 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-2016 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$
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 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ
59 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
60 * が出力できるように,メッセージの量を制限するという理由もある.
61 *
62 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
63 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
64 * 周期ハンドラは停止状態になっている.
65 *
66 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
67 * 待っている間は,並行実行されるタスクが実行されている),入力された
68 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
69 * Control-Cまたは'Q'が入力されると,プログラムを終了する.
70 *
71 * '1' : 対象タスクをTASK1に切り換える(初期設定).
72 * '2' : 対象タスクをTASK2に切り換える.
73 * '3' : 対象タスクをTASK3に切り換える.
74 * 'a' : 対象タスクをact_tskにより起動する.
75 * 'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする.
76 * 'e' : 対象タスクにext_tskを呼び出させ,終了させる.
77 * 't' : 対象タスクをter_tskにより強制終了する.
78 * '>' : 対象タスクの優先度をHIGH_PRIORITYにする.
79 * '=' : 対象タスクの優先度をMID_PRIORITYにする.
80 * '<' : 対象タスクの優先度をLOW_PRIORITYにする.
81 * 'G' : 対象タスクの優先度をget_priで読み出す.
82 * 's' : 対象タスクにslp_tskを呼び出させ,起床待ちにさせる.
83 * 'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ,起床待ちにさせる.
84 * 'w' : 対象タスクをwup_tskにより起床する.
85 * 'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする.
86 * 'l' : 対象タスクをrel_waiにより強制的に待ち解除にする.
87 * 'u' : 対象タスクをsus_tskにより強制待ち状態にする.
88 * 'm' : 対象タスクの強制待ち状態をrsm_tskにより解除する.
89 * 'd' : 対象タスクにdly_tsk(10秒)を呼び出させ,時間経過待ちにさせる.
90 * 'x' : 対象タスクにras_terにより終了要求する.
91 * 'y' : 対象タスクにdis_terを呼び出させ,タスク終了を禁止する.
92 * 'Y' : 対象タスクにena_terを呼び出させ,タスク終了を許可する.
93 * 'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
94 * ディキューを回転させる.
95 * 'c' : 周期ハンドラを動作開始させる.
96 * 'C' : 周期ハンドラを動作停止させる.
97 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
98 * 'B' : アラームハンドラを動作停止させる.
99 * 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
100 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
101 * 終了する).
102 * '@' : タスク3をacre_tskにより生成する.
103 * '!' : 対象タスクをdel_tskにより削除する.
104 * '$' : アラームハンドラをacre_almにより生成する.
105 * '#' : アラームハンドラをdel_almにより削除する.
106 * 'V' : fch_hrtで高分解能タイマを2回読む.
107 * 'o' : 対象タスクに対してオーバランハンドラを動作開始させる
108 * 'O' : 対象タスクに対してオーバランハンドラを動作停止させる
109 * 'v' : 発行したシステムコールを表示する(デフォルト).
110 * 'q' : 発行したシステムコールを表示しない.
111 */
112
113#include <kernel.h>
114#include <t_syslog.h>
115#include <t_stdlib.h>
116#include "syssvc/serial.h"
117#include "syssvc/syslog.h"
118#include "kernel_cfg.h"
119#include "sample1.h"
120/*#include "sample1n.h"*/
121
122/*
123 * サービスコールのエラーのログ出力
124 */
125Inline void
126svc_perror(const char *file, int_t line, const char *expr, ER ercd)
127{
128 if (ercd < 0) {
129 t_perror(LOG_ERROR, file, line, expr, ercd);
130 }
131}
132
133#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
134
135/*
136 * 並行実行されるタスクへのメッセージ領域
137 */
138char message[3];
139
140/*
141 * ループ回数
142 */
143ulong_t task_loop; /* タスク内でのループ回数 */
144
145/*
146 * 並行実行されるタスク
147 */
148void task(intptr_t exinf)
149{
150 volatile ulong_t i;
151 int_t n = 0;
152 int_t tskno = (int_t) exinf;
153 const char *graph[] = { "|", " +", " *" };
154 char c;
155#ifdef TOPPERS_SUPPORT_OVRHDR
156 T_ROVR pk_rovr;
157#endif /* TOPPERS_SUPPORT_OVRHDR */
158
159 while (true) {
160#ifdef TOPPERS_SUPPORT_OVRHDR
161 SVC_PERROR(ref_ovr(TSK_SELF, &pk_rovr));
162 if ((pk_rovr.ovrstat & TOVR_STA) != 0) {
163 syslog(LOG_NOTICE, "task%d is running (%03d). %s [%ld]",
164 tskno, ++n, graph[tskno-1], pk_rovr.leftotm);
165 }
166 else {
167 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
168 tskno, ++n, graph[tskno-1]);
169 }
170#else /* TOPPERS_SUPPORT_OVRHDR */
171 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
172 tskno, ++n, graph[tskno-1]);
173#endif /* TOPPERS_SUPPORT_OVRHDR */
174 for (i = 0; i < task_loop; i++);
175 c = message[tskno-1];
176 message[tskno-1] = 0;
177 switch (c) {
178 case 'e':
179 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
180 SVC_PERROR(ext_tsk());
181 assert(0);
182 case 's':
183 syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
184 SVC_PERROR(slp_tsk());
185 break;
186 case 'S':
187 syslog(LOG_INFO, "#%d#tslp_tsk(10000000)", tskno);
188 SVC_PERROR(tslp_tsk(10000000));
189 break;
190 case 'd':
191 syslog(LOG_INFO, "#%d#dly_tsk(10000000)", tskno);
192 SVC_PERROR(dly_tsk(10000000));
193 break;
194 case 'y':
195 syslog(LOG_INFO, "#%d#dis_ter()", tskno);
196 SVC_PERROR(dis_ter());
197 break;
198 case 'Y':
199 syslog(LOG_INFO, "#%d#ena_ter()", tskno);
200 SVC_PERROR(ena_ter());
201 break;
202#ifdef CPUEXC1
203 case 'z':
204 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
205 RAISE_CPU_EXCEPTION;
206 break;
207 case 'Z':
208 SVC_PERROR(loc_cpu());
209 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
210 RAISE_CPU_EXCEPTION;
211 SVC_PERROR(unl_cpu());
212 break;
213#endif /* CPUEXC1 */
214 default:
215 break;
216 }
217 }
218}
219
220/*
221 * 割込みハンドラ
222 */
223#ifdef INTNO1
224
225void intno1_isr(intptr_t exinf)
226{
227 intno1_clear();
228 SVC_PERROR(rot_rdq(HIGH_PRIORITY));
229 SVC_PERROR(rot_rdq(MID_PRIORITY));
230 SVC_PERROR(rot_rdq(LOW_PRIORITY));
231}
232
233#endif /* INTNO1 */
234
235/*
236 * CPU例外ハンドラ
237 */
238ID cpuexc_tskid; /* CPU例外を起こしたタスクのID */
239
240#ifdef CPUEXC1
241
242void
243cpuexc_handler(void *p_excinf)
244{
245 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
246 if (sns_ctx() != true) {
247 syslog(LOG_WARNING,
248 "sns_ctx() is not true in CPU exception handler.");
249 }
250 if (sns_dpn() != true) {
251 syslog(LOG_WARNING,
252 "sns_dpn() is not true in CPU exception handler.");
253 }
254 syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d xsns_dpn = %d",
255 sns_loc(), sns_dsp(), xsns_dpn(p_excinf));
256
257 if (xsns_dpn(p_excinf)) {
258 syslog(LOG_NOTICE, "Sample program ends with exception.");
259 SVC_PERROR(ext_ker());
260 assert(0);
261 }
262
263#ifdef PREPARE_RETURN_CPUEXC
264 PREPARE_RETURN_CPUEXC;
265 SVC_PERROR(get_tid(&cpuexc_tskid));
266 SVC_PERROR(act_tsk(EXC_TASK));
267#else /* PREPARE_RETURN_CPUEXC */
268 syslog(LOG_NOTICE, "Sample program ends with exception.");
269 SVC_PERROR(ext_ker());
270 assert(0);
271#endif /* PREPARE_RETURN_CPUEXC */
272}
273
274#endif /* CPUEXC1 */
275
276/*
277 * 周期ハンドラ
278 *
279 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
280 * を回転させる.
281 */
282void cyclic_handler(intptr_t exinf)
283{
284 SVC_PERROR(rot_rdq(HIGH_PRIORITY));
285 SVC_PERROR(rot_rdq(MID_PRIORITY));
286 SVC_PERROR(rot_rdq(LOW_PRIORITY));
287}
288
289/*
290 * アラームハンドラ
291 *
292 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
293 * を回転させる.
294 */
295void alarm_handler(intptr_t exinf)
296{
297 SVC_PERROR(rot_rdq(HIGH_PRIORITY));
298 SVC_PERROR(rot_rdq(MID_PRIORITY));
299 SVC_PERROR(rot_rdq(LOW_PRIORITY));
300}
301
302/*
303 * 例外処理タスク
304 */
305void exc_task(intptr_t exinf)
306{
307 SVC_PERROR(ras_ter(cpuexc_tskid));
308}
309
310/*
311 * オーバランハンドラ
312 */
313#ifdef TOPPERS_SUPPORT_OVRHDR
314
315void
316overrun_handler(ID tskid, intptr_t exinf)
317{
318 int_t tskno = (int_t) exinf;
319
320 syslog(LOG_NOTICE, "Overrun handler for task%d.", tskno);
321}
322
323#endif /* TOPPERS_SUPPORT_OVRHDR */
324
325/*
326 * メインタスク
327 */
328void main_task(intptr_t exinf)
329{
330 char c;
331 ID tskid = TASK1;
332 int_t tskno = 1;
333 ER_UINT ercd;
334 PRI tskpri;
335#ifndef TASK_LOOP
336 volatile ulong_t i;
337 SYSTIM stime1, stime2;
338#endif /* TASK_LOOP */
339 HRTCNT hrtcnt1, hrtcnt2;
340 T_CTSK ctsk;
341 ID TASK3 = -1;
342 T_CALM calm;
343 ID ALMHDR1 = -1;
344
345 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG)));
346 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", (int_t) exinf);
347
348 /*
349 * シリアルポートの初期化
350 *
351 * システムログタスクと同じシリアルポートを使う場合など,シリアル
352 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
353 * ない.
354 */
355 ercd = serial_opn_por(TASK_PORTID);
356 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
357 syslog(LOG_ERROR, "%s (%d) reported by `serial_opn_por'.",
358 itron_strerror(ercd), SERCD(ercd));
359 }
360 SVC_PERROR(serial_ctl_por(TASK_PORTID,
361 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
362
363 /*
364 * ループ回数の設定
365 *
366 * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー
367 * プの実行時間が約0.4秒になるように設定する.この設定のために,
368 * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで
369 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回
370 * 数を求め,task_loopに設定する.
371 *
372 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ
373 * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか
374 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは,
375 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値
376 * の誤差が大きくなるという問題がある.
377 *
378 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適
379 * 切な値に定義するのが望ましい.
380 *
381 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
382 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を
383 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.
384 *
385 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
386 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE
387 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
388 * を使う.
389 */
390#ifdef TASK_LOOP
391 task_loop = TASK_LOOP;
392#else /* TASK_LOOP */
393
394#ifdef MEASURE_TWICE
395 task_loop = LOOP_REF;
396 SVC_PERROR(get_tim(&stime1));
397 for (i = 0; i < task_loop; i++);
398 SVC_PERROR(get_tim(&stime2));
399#endif /* MEASURE_TWICE */
400
401 task_loop = LOOP_REF;
402 SVC_PERROR(get_tim(&stime1));
403 for (i = 0; i < task_loop; i++);
404 SVC_PERROR(get_tim(&stime2));
405 task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
406
407#endif /* TASK_LOOP */
408
409 /*
410 * タスクの起動
411 */
412 SVC_PERROR(act_tsk(TASK1));
413 SVC_PERROR(act_tsk(TASK2));
414
415 /*
416 * メインループ
417 */
418 do {
419 SVC_PERROR(serial_rea_dat(TASK_PORTID, &c, 1));
420 switch (c) {
421 case 'e':
422 case 's':
423 case 'S':
424 case 'd':
425 case 'y':
426 case 'Y':
427 case 'z':
428 case 'Z':
429 message[tskno-1] = c;
430 break;
431 case '1':
432 tskno = 1;
433 tskid = TASK1;
434 break;
435 case '2':
436 tskno = 2;
437 tskid = TASK2;
438 break;
439 case '3':
440 tskno = 3;
441 tskid = TASK3;
442 break;
443 case 'a':
444 syslog(LOG_INFO, "#act_tsk(%d)", tskno);
445 SVC_PERROR(act_tsk(tskid));
446 break;
447 case 'A':
448 syslog(LOG_INFO, "#can_act(%d)", tskno);
449 SVC_PERROR(ercd = can_act(tskid));
450 if (ercd >= 0) {
451 syslog(LOG_NOTICE, "can_act(%d) returns %d", tskno, ercd);
452 }
453 break;
454 case 't':
455 syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
456 SVC_PERROR(ter_tsk(tskid));
457 break;
458 case '>':
459 syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
460 SVC_PERROR(chg_pri(tskid, HIGH_PRIORITY));
461 break;
462 case '=':
463 syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
464 SVC_PERROR(chg_pri(tskid, MID_PRIORITY));
465 break;
466 case '<':
467 syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
468 SVC_PERROR(chg_pri(tskid, LOW_PRIORITY));
469 break;
470 case 'G':
471 syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
472 SVC_PERROR(ercd = get_pri(tskid, &tskpri));
473 if (ercd >= 0) {
474 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
475 }
476 break;
477 case 'w':
478 syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
479 SVC_PERROR(wup_tsk(tskid));
480 break;
481 case 'W':
482 syslog(LOG_INFO, "#can_wup(%d)", tskno);
483 SVC_PERROR(ercd = can_wup(tskid));
484 if (ercd >= 0) {
485 syslog(LOG_NOTICE, "can_wup(%d) returns %d", tskno, ercd);
486 }
487 break;
488 case 'l':
489 syslog(LOG_INFO, "#rel_wai(%d)", tskno);
490 SVC_PERROR(rel_wai(tskid));
491 break;
492 case 'u':
493 syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
494 SVC_PERROR(sus_tsk(tskid));
495 break;
496 case 'm':
497 syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
498 SVC_PERROR(rsm_tsk(tskid));
499 break;
500 case 'x':
501 syslog(LOG_INFO, "#ras_ter(%d)", tskno);
502 SVC_PERROR(ras_ter(tskid));
503 break;
504 case 'r':
505 syslog(LOG_INFO, "#rot_rdq(three priorities)");
506 SVC_PERROR(rot_rdq(HIGH_PRIORITY));
507 SVC_PERROR(rot_rdq(MID_PRIORITY));
508 SVC_PERROR(rot_rdq(LOW_PRIORITY));
509 break;
510 case 'c':
511 syslog(LOG_INFO, "#sta_cyc(1)");
512 SVC_PERROR(sta_cyc(CYCHDR1));
513 break;
514 case 'C':
515 syslog(LOG_INFO, "#stp_cyc(1)");
516 SVC_PERROR(stp_cyc(CYCHDR1));
517 break;
518 case 'b':
519 syslog(LOG_INFO, "#sta_alm(1, 5000000)");
520 SVC_PERROR(sta_alm(ALMHDR1, 5000000));
521 break;
522 case 'B':
523 syslog(LOG_INFO, "#stp_alm(1)");
524 SVC_PERROR(stp_alm(ALMHDR1));
525 break;
526 case '@':
527 ctsk.tskatr = TA_NULL;
528 ctsk.exinf = 3;
529 ctsk.task = task;
530 ctsk.itskpri = MID_PRIORITY;
531 ctsk.stksz = STACK_SIZE;
532 ctsk.stk = NULL;
533 SVC_PERROR(TASK3 = acre_tsk(&ctsk));
534 syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
535 (int_t) TASK3);
536 break;
537 case '!':
538 syslog(LOG_INFO, "#del_tsk(%d)", tskno);
539 SVC_PERROR(del_tsk(tskid));
540 break;
541 case '$':
542 calm.almatr = TA_NULL;
543 calm.nfyinfo.nfymode = TNFY_HANDLER;
544 calm.nfyinfo.nfy.handler.exinf = (intptr_t) 0;
545 calm.nfyinfo.nfy.handler.tmehdr = (TMEHDR) alarm_handler;
546 SVC_PERROR(ALMHDR1 = acre_alm(&calm));
547 syslog(LOG_NOTICE, "alarm handler is created with almid = %d.",
548 (int_t) ALMHDR1);
549 break;
550 case '#':
551 syslog(LOG_INFO, "#del_alm(1)");
552 SVC_PERROR(del_alm(ALMHDR1));
553 break;
554
555 case 'V':
556 hrtcnt1 = fch_hrt();
557 hrtcnt2 = fch_hrt();
558 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu",
559 hrtcnt1, hrtcnt2);
560 break;
561
562 case 'o':
563#ifdef TOPPERS_SUPPORT_OVRHDR
564 syslog(LOG_INFO, "#sta_ovr(%d, 2000000)", tskno);
565 SVC_PERROR(sta_ovr(tskid, 2000000));
566#else /* TOPPERS_SUPPORT_OVRHDR */
567 syslog(LOG_NOTICE, "sta_ovr is not supported.");
568#endif /* TOPPERS_SUPPORT_OVRHDR */
569 break;
570 case 'O':
571#ifdef TOPPERS_SUPPORT_OVRHDR
572 syslog(LOG_INFO, "#stp_ovr(%d)", tskno);
573 SVC_PERROR(stp_ovr(tskid));
574#else /* TOPPERS_SUPPORT_OVRHDR */
575 syslog(LOG_NOTICE, "stp_ovr is not supported.");
576#endif /* TOPPERS_SUPPORT_OVRHDR */
577 break;
578
579 case 'v':
580 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_INFO),
581 LOG_UPTO(LOG_EMERG)));
582 break;
583 case 'q':
584 SVC_PERROR(syslog_msk_log(LOG_UPTO(LOG_NOTICE),
585 LOG_UPTO(LOG_EMERG)));
586 break;
587
588#ifdef BIT_KERNEL
589 case ' ':
590 SVC_PERROR(loc_cpu());
591 {
592 extern ER bit_kernel(void);
593
594 SVC_PERROR(ercd = bit_kernel());
595 if (ercd >= 0) {
596 syslog(LOG_NOTICE, "bit_kernel passed.");
597 }
598 }
599 SVC_PERROR(unl_cpu());
600 break;
601#endif /* BIT_KERNEL */
602
603 default:
604 break;
605 }
606 } while (c != '\003' && c != 'Q');
607
608 syslog(LOG_NOTICE, "Sample program ends.");
609 SVC_PERROR(ext_ker());
610 assert(0);
611}
Note: See TracBrowser for help on using the repository browser.