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) 2004-2005 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によって公表されている GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
35 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
36 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
38 * @(#) $Id: sample1.c,v 1.22 2005/11/12 15:01:44 hiro Exp $
44 * JSPカーネルの基本的な動作を確認するためのサンプルプログラム.
48 * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,
49 * 優先度: MAIN_PRIORITY)と,三つの並列実行されるタスク(タスクID:
50 * TASK1〜TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
51 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
53 * 並列実行されるタスクは,task_loop 回空ループを実行する度に,タスク
54 * が実行中であることをあらわすメッセージを表示する.
56 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
57 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
60 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
61 * 待っている間は,並列実行されるタスクが実行されている),入力された
62 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
63 * Control-C または 'Q' が入力されると,プログラムを終了する.
65 * '1' : 以降のコマンドは TASK1 に対して行う.
66 * '2' : 以降のコマンドは TASK2 に対して行う.
67 * '3' : 以降のコマンドは TASK3 に対して行う.
68 * 'a' : タスクを act_tsk により起動する.
69 * 'A' : タスクに対する起動要求を can_act によりキャンセルする.
70 * 'e' : タスクに ext_tsk を呼び出させ,終了させる.
71 * 't' : タスクを ter_tsk により強制終了する.
72 * '>' : タスクの優先度を HIGH_PRIORITY にする.
73 * '=' : タスクの優先度を MID_PRIORITY にする.
74 * '<' : タスクの優先度を LOW_PRIORITY にする.
75 * 'G' : タスクの優先度を get_pri で読み出す.
76 * 's' : タスクに slp_tsk を呼び出させ,起床待ちにさせる.
77 * 'S' : タスクに tslp_tsk(10秒) を呼び出させ,起床待ちにさせる.
78 * 'w' : タスクを wup_tsk により起床する.
79 * 'W' : タスクに対する起床要求を can_wup によりキャンセルする.
80 * 'l' : タスクを rel_wai により強制的に待ち解除にする.
81 * 'u' : タスクを sus_tsk により強制待ち状態にする.
82 * 'm' : タスクの強制待ち状態を rsm_tsk により解除する.
83 * 'M' : タスクの強制待ち状態を frsm_tsk により強制解除する.
84 * 'd' : タスクに dly_tsk(10秒) を呼び出させ,時間経過待ちにさせる.
85 * 'x' : タスクにパターン 0x0001 の例外処理を要求する.
86 * 'X' : タスクにパターン 0x0002 の例外処理を要求する.
87 * 'y' : タスクに dis_tex を呼び出させ,タスク例外を禁止する.
88 * 'Y' : タスクに ena_tex を呼び出させ,タスク例外を許可する.
89 * 'r' : 三つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)の
94 * 'Z' : CPUロック状態でCPU例外を発生させる(プログラムを終了する).
95 * 'V' : vxget_tim で性能評価用システム時刻を2回読む.
96 * 'v' : 発行したシステムコールを表示する(デフォルト).
97 * 'q' : 発行したシステムコールを表示しない.
101 #include <t_services.h>
102 #include "kernel_id.h"
104 #include "keyboard.h"
112 * 並行実行されるタスクへのメッセージ領域
119 UW task_loop
; /* タスク内でのループ回数 */
120 UW tex_loop
; /* 例外処理ルーチン内でのループ回数 */
122 static FATFS s_activeFatFs
;
127 void task(VP_INT exinf
)
132 * 並行して実行されるタスク用のタスク例外処理ルーチン
134 void tex_routine(TEXPTN texptn
, VP_INT exinf
)
137 INT tskno
= (INT
) exinf
;
139 syslog(LOG_NOTICE
, "task%d receives exception 0x%04x. ",
141 for (i
= 0; i
< tex_loop
; i
++);
143 if (texptn
& 0x8000) {
144 syslog(LOG_INFO
, "#%d#ext_tsk()", tskno
);
155 cpuexc_handler(VP p_excinf
)
159 syslog(LOG_NOTICE
, "CPU exception handler (p_excinf = %08p).",
161 if (sns_ctx() != TRUE
) {
163 "sns_ctx() is not TRUE in CPU exception handler.");
165 if (sns_dpn() != TRUE
) {
167 "sns_dpn() is not TRUE in CPU exception handler.");
170 "sns_loc = %d sns_dsp = %d", sns_loc(), sns_dsp());
172 "vxsns_loc = %d vxsns_ctx = %d vxsns_dsp = %d vxsns_dpn = %d",
173 vxsns_loc(p_excinf
), vxsns_ctx(p_excinf
),
174 vxsns_dsp(p_excinf
), vxsns_dpn(p_excinf
));
176 if (!vxsns_loc(p_excinf
) && !vxsns_ctx(p_excinf
)) {
177 syscall(iget_tid(&tskid
));
178 syscall(iras_tex(tskid
, 0x8000));
181 syslog(LOG_NOTICE
, "Sample program ends with exception.");
191 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
194 void cyclic_handler(VP_INT exinf
)
196 irot_rdq(HIGH_PRIORITY
);
197 irot_rdq(MID_PRIORITY
);
198 irot_rdq(LOW_PRIORITY
);
204 void main_task(VP_INT exinf
)
207 SYSTIM stime1
, stime2
;
208 #ifndef OMIT_VGET_TIM
209 SYSUTIM utime1
, utime2
;
210 #endif /* OMIT_VGET_TIM */
212 vmsk_log(LOG_UPTO(LOG_INFO
), LOG_UPTO(LOG_EMERG
));
213 syslog(LOG_NOTICE
, "Wikireader task starts (exinf = %d).", (INT
) exinf
);
215 syscall(serial_ctl_por(TASK_PORTID
,
216 (IOCTL_CRLF
| IOCTL_FCSND
| IOCTL_FCRCV
)));
221 f_mount(0, &s_activeFatFs
);
226 * en: Set loop frequency
228 task_loop
= LOOP_REF
;
230 for (i
= 0; i
< task_loop
; i
++);
232 task_loop
= LOOP_REF
* 400 / (stime2
- stime1
);
233 tex_loop
= task_loop
/ 5;
241 syslog(LOG_NOTICE
, "Wikireader task ends.");