3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
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
10 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によって公表されている GNU General Public License の Version 2 に記
12 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
13 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
20 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
23 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
25 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
26 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
27 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
29 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
30 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
34 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
35 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
37 * @(#) $Id: cxx_sample1.cpp,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 * JSPカーネルの基本的な動作を確認するためのサンプルプログラム.
47 * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,
48 * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID:
49 * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
50 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
52 * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク
53 * が実行中であることをあらわすメッセージを表示する.
55 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
56 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
59 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
60 * 待っている間は,並列実行されるタスクが実行されている),入力された
61 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
62 * Control-C または 'Q' が入力されると,プログラムを終了する.
64 * '1' : 以降のコマンドは TASK1 に対して行う.
65 * '2' : 以降のコマンドは TASK2 に対して行う.
66 * '3' : 以降のコマンドは TASK3 に対して行う.
67 * 'a' : タスクを act_tsk により起動する.
68 * 'A' : タスクに対する起動要求を can_act によりキャンセルする.
69 * 'e' : タスクに ext_tsk を呼び出させ,終了させる.
70 * 't' : タスクを ter_tsk により強制終了する.
71 * '>' : タスクの優先度を HIGH_PRIORITY にする.
72 * '=' : タスクの優先度を MID_PRIORITY にする.
73 * '<' : タスクの優先度を LOW_PRIORITY にする.
74 * 'G' : タスクの優先度を get_pri で読み出す.
75 * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる.
76 * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる.
77 * 'w' : タスクを wup_tsk により起床する.
78 * 'W' : タスクに対する起床要求を can_wup によりキャンセルする.
79 * 'l' : タスクを rel_wai により強制的に待ち解除にする.
80 * 'u' : タスクを sus_tsk により強制待ち状態にする.
81 * 'm' : タスクの強制待ち状態を rsm_tsk により解除する.
82 * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する.
83 * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる.
84 * 'x' : タスクにパターン 0x0001 の例外処理を要求する.
85 * 'X' : タスクにパターン 0x0002 の例外処理を要求する.
86 * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する.
87 * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する.
88 * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の
93 * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する).
94 * 'V' : vxget_tim で性能評価用システム時刻を2回読む.
95 * 'v' : 発行したシステムコールを表示する(デフォルト).
96 * 'q' : 発行したシステムコールを表示しない.
99 #include <t_services.h>
100 #include "kernel_id.h"
101 #include "cxx_sample1.h"
104 * 並行実行されるタスクへのメッセージ領域
111 UW task_loop; /* タスク内でのループ回数 */
112 UW tex_loop; /* 例外処理ルーチン内でのループ回数 */
117 void task(VP_INT exinf)
119 _toppers_cxxrt_reset_specific();
123 INT tskno = (INT) exinf;
124 char *graph[] = { "|", " +", " *" };
129 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
130 tskno, ++n, graph[tskno-1]);
131 for (i = 0; i < task_loop; i++);
132 c = message[tskno-1];
133 message[tskno-1] = 0;
136 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
139 syslog(LOG_INFO, "#%d#slp_tsk()", tskno);
143 syslog(LOG_INFO, "#%d#tslp_tsk(10000)", tskno);
144 syscall(tslp_tsk(10000));
147 syslog(LOG_INFO, "#%d#dly_tsk(10000)", tskno);
148 syscall(dly_tsk(10000));
151 syslog(LOG_INFO, "#%d#dis_tex()", tskno);
155 syslog(LOG_INFO, "#%d#ena_tex()", tskno);
160 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
165 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
177 * 並行して実行されるタスク用のタスク例外処理ルーチン
179 void tex_routine(TEXPTN texptn, VP_INT exinf)
182 INT tskno = (INT) exinf;
184 syslog(LOG_NOTICE, "task%d receives exception 0x%04x. ",
186 for (i = 0; i < tex_loop; i++);
188 if (texptn & 0x8000) {
189 syslog(LOG_INFO, "#%d#ext_tsk()", tskno);
200 cpuexc_handler(VP p_excinf)
204 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).",
206 if (sns_ctx() != TRUE) {
208 "sns_ctx() is not TRUE in CPU exception handler.");
210 if (sns_dpn() != TRUE) {
212 "sns_dpn() is not TRUE in CPU exception handler.");
215 "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp());
217 "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d",
218 vxsns_loc(p_excinf), vxsns_ctx(p_excinf),
219 vxsns_dsp(p_excinf), vxsns_dpn(p_excinf));
221 if (!vxsns_loc(p_excinf) && !vxsns_ctx(p_excinf)) {
222 syscall(iget_tid(&tskid));
223 syscall(iras_tex(tskid, 0x8000));
226 syslog(LOG_NOTICE, "Sample program ends with exception.");
236 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
239 void cyclic_handler(VP_INT exinf)
241 irot_rdq(HIGH_PRIORITY);
242 irot_rdq(MID_PRIORITY);
243 irot_rdq(LOW_PRIORITY);
249 void main_task(VP_INT exinf)
257 SYSTIM stime1, stime2;
258 #ifndef OMIT_VGET_TIM
259 SYSUTIM utime1, utime2;
260 #endif /* OMIT_VGET_TIM */
262 vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
263 syslog(LOG_NOTICE, "Sample program starts (exinf = %d).", exinf);
265 syscall(serial_ctl_por(TASK_PORTID,
266 (IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)));
271 task_loop = LOOP_REF;
273 for (i = 0; i < task_loop; i++);
275 task_loop = LOOP_REF * 400 / (stime2 - stime1);
276 tex_loop = task_loop / 5;
289 syscall(serial_rea_dat(TASK_PORTID, &c, 1));
299 message[tskno-1] = c;
314 syslog(LOG_INFO, "#act_tsk(%d)", tskno);
315 syscall(act_tsk(tskid));
318 syslog(LOG_INFO, "#can_act(%d)", tskno);
319 syscall(ercd = can_act(tskid));
321 syslog(LOG_NOTICE, "can_act(%d) returns %d",
326 syslog(LOG_INFO, "#ter_tsk(%d)", tskno);
327 syscall(ter_tsk(tskid));
330 syslog(LOG_INFO, "#chg_pri(%d, HIGH_PRIORITY)", tskno);
331 chg_pri(tskid, HIGH_PRIORITY);
334 syslog(LOG_INFO, "#chg_pri(%d, MID_PRIORITY)", tskno);
335 chg_pri(tskid, MID_PRIORITY);
338 syslog(LOG_INFO, "#chg_pri(%d, LOW_PRIORITY)", tskno);
339 chg_pri(tskid, LOW_PRIORITY);
342 syslog(LOG_INFO, "#get_pri(%d, &tskpri)", tskno);
343 syscall(ercd = get_pri(tskid, &tskpri));
345 syslog(LOG_NOTICE, "priority of task %d is %d",
350 syslog(LOG_INFO, "#wup_tsk(%d)", tskno);
351 syscall(wup_tsk(tskid));
354 syslog(LOG_INFO, "#can_wup(%d)", tskno);
355 syscall(ercd = can_wup(tskid));
357 syslog(LOG_NOTICE, "can_wup(%d) returns %d",
362 syslog(LOG_INFO, "#rel_wai(%d)", tskno);
363 syscall(rel_wai(tskid));
366 syslog(LOG_INFO, "#sus_tsk(%d)", tskno);
367 syscall(sus_tsk(tskid));
370 syslog(LOG_INFO, "#rsm_tsk(%d)", tskno);
371 syscall(rsm_tsk(tskid));
374 syslog(LOG_INFO, "#frsm_tsk(%d)", tskno);
375 syscall(frsm_tsk(tskid));
378 syslog(LOG_INFO, "#ras_tex(%d, 0x0001)", tskno);
379 syscall(ras_tex(tskid, 0x0001));
382 syslog(LOG_INFO, "#ras_tex(%d, 0x0002)", tskno);
383 syscall(ras_tex(tskid, 0x0002));
386 syslog(LOG_INFO, "#rot_rdq(three priorities)");
387 rot_rdq(HIGH_PRIORITY);
388 rot_rdq(MID_PRIORITY);
389 rot_rdq(LOW_PRIORITY);
397 #ifndef OMIT_VGET_TIM
399 syscall(vxget_tim(&utime1));
400 syscall(vxget_tim(&utime2));
401 syslog(LOG_NOTICE, "utime1 = %d, utime2 = %d",
402 (UINT) utime1, (UINT) utime2);
404 #endif /* OMIT_VGET_TIM */
406 vmsk_log(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG));
409 vmsk_log(LOG_UPTO(LOG_NOTICE), LOG_UPTO(LOG_EMERG));
414 } while (c != '\003' && c != 'Q');
416 syslog(LOG_NOTICE, "Sample program ends.");