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

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

initial

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