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

Last change on this file since 164 was 56, checked in by ertl-hiro, 11 years ago

ASPカーネルの修正への対応。

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