source: anotherchoice/tags/jsp-1.4.4-full-UTF8/sample/cxx_sample1.cpp@ 26

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

initial

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