source: anotherchoice/tags/jsp-1.4.4-full-UTF8/tools/WINDOWS/sample1.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 10 years ago

initial

File size: 12.8 KB
Line 
1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: sample1.c,v 1.9 2003/12/24 08:23:58 takayuki Exp $
51 */
52
53/*
54 * サンプルプログラム(1)の本体
55 *
56 * JSPカーネルの基本的な動作を確認するためのサンプルプログラム.
57 *
58 * プログラムの概要:
59 *
60 * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,
61 * 優å…
62ˆåº¦: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID:
63 * TASK1〜TASK3,初期優å…
64ˆåº¦: MID_PRIORITY)で構成される.また,起動周
65 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
66 *
67 * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク
68 * が実行中であることをあらわすメッセージを表示する.
69 *
70 * 周期ハンドラは,三つの優å…
71ˆåº¦ï¼ˆHIGH_PRIORITY,MID_PRIORITY,
72 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
73 * 周期ハンドラは停止状æ…
74‹ã«ãªã£ã¦ã„る.
75 *
76 * メインタスクは,シリアルI/Oポートからの文字å…
77¥åŠ›ã‚’行い(文字å…
78¥åŠ›ã‚’
79 * 待
80っている間は,並列実行されるタスクが実行されている),å…
81¥åŠ›ã•ã‚ŒãŸ
82 * 文字に対応した処理を実行する.å…
83¥åŠ›ã•ã‚ŒãŸæ–‡å­—と処理の関係は次の通り.
84 * Control-C または 'Q' がå…
85¥åŠ›ã•ã‚Œã‚‹ã¨ï¼Œãƒ—ログラムを終了する.
86 *
87 * '1' : 以降のコマンドは TASK1 に対して行う.
88 * '2' : 以降のコマンドは TASK2 に対して行う.
89 * '3' : 以降のコマンドは TASK3 に対して行う.
90 * 'a' : タスクを act_tsk により起動する.
91 * 'A' : タスクに対する起動要求を can_act によりキャンセルする.
92 * 'e' : タスクに ext_tsk を呼び出させ,終了させる.
93 * 't' : タスクを ter_tsk により強制終了する.
94 * '>' : タスクの優å…
95ˆåº¦ã‚’ HIGH_PRIORITY にする.
96 * '=' : タスクの優å…
97ˆåº¦ã‚’ MID_PRIORITY にする.
98 * '<' : タスクの優å…
99ˆåº¦ã‚’ LOW_PRIORITY にする.
100 * 'G' : タスクの優å…
101ˆåº¦ã‚’ get_pri で読み出す.
102 * 's' : タスクに slp_tsk を呼び出させ,起床待
103ちにさせる.
104 * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待
105ちにさせる.
106 * 'w' : タスクを wup_tsk により起床する.
107 * 'W' : タスクに対する起床要求を can_wup によりキャンセルする.
108 * 'l' : タスクを rel_wai により強制的に待
109ち解除にする.
110 * 'u' : タスクを sus_tsk により強制待
111ち状æ…
112‹ã«ã™ã‚‹ï¼Ž
113 * 'm' : タスクの強制待
114ち状æ…
115‹ã‚’ rsm_tsk により解除する.
116 * 'M' : タスクの強制待
117ち状æ…
118‹ã‚’ frsm_tsk により強制解除する.
119 * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待
120ちにさせる.
121 * 'x' : タスクにパターン 0x0001 の例外処理を要求する.
122 * 'X' : タスクにパターン 0x0002 の例外処理を要求する.
123 * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する.
124 * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する.
125 * 'r' : 三つの優å…
126ˆåº¦ï¼ˆHIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の
127 * レディキューを回転させる.
128 * 'c' : 周期ハンドラを動作させる.
129 * 'C' : 周期ハンドラを停止させる.
130 * 'z' : CPU例外を発生させる.
131 * 'Z' : CPUロック状æ…
132‹ã§CPU例外を発生させる(プログラムを終了する).
133 * 'V' : vxget_tim で性能評価用システム時刻を2回読む.
134 * 'v' : 発行したシステムコールを表示する(デフォルト).
135 * 'q' : 発行したシステムコールを表示しない.
136 */
137
138#include <t_services.h>
139#include "kernel_id.h"
140#include "sample1.h"
141
142/*
143 * 並行実行されるタスクへのメッセージ領域
144 */
145UB message[3];
146
147/*
148 * ループ回数
149 */
150UW task_loop; /* タスク内
151でのループ回数 */
152UW tex_loop; /* 例外処理ルーチン内
153でのループ回数 */
154
155/*
156 * 並行実行されるタスク
157 */
158void task(VP_INT exinf)
159{
160 volatile UW i;
161 INT n = 0;
162 INT tskno = (INT) exinf;
163 UB *graph[] = { "|", " +", " *" };
164 UB c;
165
166 ena_tex();
167 while (1) {
168 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
169 tskno, ++n, graph[tskno-1]);
170 for (i = 0; i < task_loop; i++);
171 c = message[tskno-1];
172 message[tskno-1] = 0;
173 switch (c) {
174 case 'e':
175 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
176 ext_tsk();
177 case 's':
178 syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
179 syscall(slp_tsk());
180 break;
181 case 'S':
182 syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
183 syscall(tslp_tsk(10000));
184 break;
185 case 'd':
186 syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
187 syscall(dly_tsk(10000));
188 break;
189 case 'y':
190 syslog(LOG_INFO, "#%d#dis_tex()", tskno);
191 syscall(dis_tex());
192 break;
193 case 'Y':
194 syslog(LOG_INFO, "#%d#ena_tex()", tskno);
195 syscall(ena_tex());
196 break;
197#ifdef CPUEXC1
198 case 'z':
199 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
200 RAISE_CPU_EXCEPTION;
201 break;
202 case 'Z':
203 loc_cpu();
204 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
205 RAISE_CPU_EXCEPTION;
206 unl_cpu();
207 break;
208#endif /* CPUEXC1 */
209 default:
210 break;
211 }
212 }
213}
214
215/*
216 * 並行して実行されるタスク用のタスク例外処理ルーチン
217 */
218void tex_routine(TEXPTN texptn, VP_INT exinf)
219{
220 volatile UW i;
221 INT tskno = (INT) exinf;
222
223 syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ",
224 tskno, texptn);
225 for (i = 0; i < tex_loop; i++);
226
227 if (texptn & 0x8000) {
228 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
229 ext_tsk();
230 }
231}
232
233/*
234 * CPU例外ハンドラ
235 */
236#ifdef CPUEXC1
237
238void
239cpuexc_handler(VP p_excinf)
240{
241 ID tskid;
242
243 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08x).",
244 p_excinf);
245 if (sns_ctx() != TRUE) {
246 syslog(LOG_WARNING,
247 "sns_ctx() is not TRUE in CPU exception handler.");
248 }
249 if (sns_dpn() != TRUE) {
250 syslog(LOG_WARNING,
251 "sns_dpn() is not TRUE in CPU exception handler.");
252 }
253 syslog(LOG_DEBUG,
254 "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp());
255 syslog(LOG_DEBUG,
256 "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d",
257 vxsns_loc(p_excinf), vxsns_ctx(p_excinf),
258 vxsns_dsp(p_excinf), vxsns_dpn(p_excinf));
259
260 if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) {
261 syscall(iget_tid(&tskid));
262 syscall(iras_tex(tskid, 0x8000));
263 }
264 else {
265 syslog(LOG_NOTICE, "Sample program ends with exception.");
266 kernel_exit();
267 }
268}
269
270#endif /* CPUEXC1 */
271
272/*
273 * 周期ハンドラ
274 *
275 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優å…
276ˆåº¦ã®ãƒ¬ãƒ‡ã‚£ã‚­ãƒ¥ãƒ¼
277 * を回転させる.
278 */
279void cyclic_handler(VP_INT exinf)
280{
281 irot_rdq(HIGH_PRIORITY);
282 irot_rdq(MID_PRIORITY);
283 irot_rdq(LOW_PRIORITY);
284}
285
286/*
287 * メインタスク
288 */
289void main_task(VP_INT exinf)
290{
291 UB c;
292 ID tskid = TASK1;
293 volatile UW i;
294 INT count;
295 INT tskno = 1;
296 ER_UINT ercd;
297 PRI tskpri;
298 SYSTIM stime1, stime2;
299#ifndef OMIT_VGET_TIM
300 SYSUTIM utime1, utime2;
301#endif /* OMIT_VGET_TIM */
302
303 vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
304 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", exinf);
305
306 serial_ctl_por(TASK_PORTID, (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV));
307
308 /*
309 * ループ回数の設定
310 */
311 count = 0;
312 task_loop = LOOP_REF;
313 get_tim(&stime1);
314 do {
315 ++ count;
316 for (i = 0; i < task_loop; i++);
317 get_tim(&stime2);
318 }while(stime1 == stime2);
319 task_loop = LOOP_REF * 400 / (stime2 - stime1);
320 tex_loop = task_loop / 5;
321
322 /*
323 * タスクの起動
324 */
325 act_tsk(TASK1);
326 act_tsk(TASK2);
327 act_tsk(TASK3);
328
329 /*
330 * メインループ
331 */
332 do {
333 serial_rea_dat(TASK_PORTID, &c, 1);
334 switch (c) {
335 case 'e':
336 case 's':
337 case 'S':
338 case 'd':
339 case 'y':
340 case 'Y':
341 case 'z':
342 case 'Z':
343 message[tskno-1] = c;
344 break;
345 case '1':
346 tskno = 1;
347 tskid = TASK1;
348 break;
349 case '2':
350 tskno = 2;
351 tskid = TASK2;
352 break;
353 case '3':
354 tskno = 3;
355 tskid = TASK3;
356 break;
357 case 'a':
358 syslog(LOG_INFO, "#act_tsk(%d)", tskno);
359 syscall(act_tsk(tskid));
360 break;
361 case 'A':
362 syslog(LOG_INFO, "#can_act(%d)", tskno);
363 syscall(ercd = can_act(tskid));
364 if (MERCD(ercd) >= 0) {
365 syslog(LOG_NOTICE, "can_act(%d) returns %d",
366 tskid, ercd);
367 }
368 break;
369 case 't':
370 syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
371 syscall(ter_tsk(tskid));
372 break;
373 case '>':
374 syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
375 chg_pri(tskid, HIGH_PRIORITY);
376 break;
377 case '=':
378 syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
379 chg_pri(tskid, MID_PRIORITY);
380 break;
381 case '<':
382 syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
383 chg_pri(tskid, LOW_PRIORITY);
384 break;
385 case 'G':
386 syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
387 syscall(ercd = get_pri(tskid, &tskpri));
388 if (MERCD(ercd) >= 0) {
389 syslog(LOG_NOTICE, "priority of task %d is %d",
390 tskid, tskpri);
391 }
392 break;
393 case 'w':
394 syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
395 syscall(wup_tsk(tskid));
396 break;
397 case 'W':
398 syslog(LOG_INFO, "#can_wup(%d)", tskno);
399 syscall(ercd = can_wup(tskid));
400 if (MERCD(ercd) >= 0) {
401 syslog(LOG_NOTICE, "can_wup(%d) returns %d",
402 tskid, ercd);
403 }
404 break;
405 case 'l':
406 syslog(LOG_INFO, "#rel_wai(%d)", tskno);
407 syscall(rel_wai(tskid));
408 break;
409 case 'u':
410 syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
411 syscall(sus_tsk(tskid));
412 break;
413 case 'm':
414 syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
415 syscall(rsm_tsk(tskid));
416 break;
417 case 'M':
418 syslog(LOG_INFO, "#frsm_tsk(%d)", tskno);
419 syscall(frsm_tsk(tskid));
420 break;
421 case 'x':
422 syslog(LOG_INFO, "#ras_tsk(%d, 0x0001)", tskno);
423 syscall(ras_tex(tskid, 0x0001));
424 break;
425 case 'X':
426 syslog(LOG_INFO, "#ras_tsk(%d, 0x0002)", tskno);
427 syscall(ras_tex(tskid, 0x0002));
428 break;
429 case 'r':
430 syslog(LOG_INFO, "#rot_rdq(three priorities)");
431 rot_rdq(HIGH_PRIORITY);
432 rot_rdq(MID_PRIORITY);
433 rot_rdq(LOW_PRIORITY);
434 break;
435 case 'c':
436 sta_cyc(CYCHDR1);
437 break;
438 case 'C':
439 stp_cyc(CYCHDR1);
440 break;
441#ifndef OMIT_VGET_TIM
442 case 'V':
443 syscall(vxget_tim(&utime1));
444 syscall(vxget_tim(&utime2));
445 syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d",
446 (UINT) utime1, (UINT) utime2);
447 break;
448#endif /* OMIT_VGET_TIM */
449 case 'v':
450 vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
451 break;
452 case 'q':
453 vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG));
454 break;
455 default:
456 break;
457 }
458 } while (c != '\003' && c != 'Q');
459
460 syslog(LOG_NOTICE, "Sample program ends.");
461 kernel_exit();
462}
Note: See TracBrowser for help on using the repository browser.