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

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

GR-SAKURA向けASP3を追加

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