3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 2006-2009 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * @(#) $Id: test_tex1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
45 * タスクからタスク例外処理ルーチンを起動する処理を網羅的にテストする.
49 * (A) ras_tex,ref_texのエラー検出
51 * (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない
52 * (B) dis_tex,ena_texのエラー検出
53 * (B-1) 自タスクのタスク例外処理ルーチンが定義されていない
55 * (C-1) 対象タスクが自タスクかつタスク例外処理許可で,すぐに起動
57 * (C-3) 対象タスクが自タスクだがタスク例外処理禁止
59 * (D-1) タスク例外処理要求があり,すぐに起動
62 * (E-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
64 * (F) タスク例外処理ルーチンからのリターンによる起動(連続起動)
65 * (G) タスク例外処理ルーチンからの戻り時による状態復帰
67 * (G-2) タスク例外処理ルーチンが連続起動される時
68 * (H) タスク例外処理ルーチンの多重起動
69 * (I) タスク例外処理ルーチンからの戻り時のタスク切換え
73 * TASK1: メインのタスク.自タスクに対してタスク例外処理を要求する
74 * TASK2: 他タスクに対してタスク例外処理を要求する対象タスク
75 * TASK3: タスク例外処理ルーチンが定義されていないタスク
82 * ref_tex(TSK_SELF, &rtex)
83 * ras_tex(TASK3, 0x0001) ... (A-2)
84 * ras_tex(TASK4, 0x0001) ... (A-1)
85 * ref_tex(TASK3, &rtex) ... (A-2)
86 * ref_tex(TASK4, &rtex) ... (A-1)
87 * 2: ena_tex() ... (D-2)
88 * ref_tex(TSK_SELF, &rtex)
89 * 3: ras_tex(TSK_SELF, 0x0001) ... (C-1)
90 * == TASK1タスク例外処理ルーチン(1回目)==
92 * 5: dis_dsp() ... 4つの状態をそれぞれ変化させる
93 * chg_ipm(TMAX_INTPRI)
98 * 6: 戻ってきた状態のチェック ... (G-1)
99 * 7: dis_dsp() ... 3つの状態をそれぞれ変化させる
100 * chg_ipm(TMIN_INTPRI)
102 * 8: ras_tex(TASK1, 0x0002) ... (C-3)
103 * ref_tex(TSK_SELF, &rtex)
104 * 9: ena_tex() ... (D-1)
105 * == TASK1タスク例外処理ルーチン(2回目)==
107 * 11: ras_tex(TASK1, 0x0001) ... (C-3)
108 * ras_tex(TASK1, 0x0002) ... (C-3)
109 * 12: ena_dsp() ... 3つの状態をそれぞれ変化させる
110 * chg_ipm(TMAX_INTPRI)
113 * == TASK1タスク例外処理ルーチン(3回目)==
115 * 14: ena_dsp() ... 3つの状態をそれぞれ変化させる
116 * chg_ipm(TMAX_INTPRI)
118 * 15: ras_tex(TSK_SELF, 0x0004) ... (H)
119 * == TASK1タスク例外処理ルーチン(4回目)==
121 * 17: dis_dsp() ... 3つの状態をそれぞれ変化させる
122 * chg_ipm(TIPM_ENAALL)
125 * == TASK1タスク例外処理ルーチン(3回目続き)==
126 * 18: 戻ってきた状態のチェック ... (G-2)
129 * 19: 戻ってきた状態のチェック ... (G-1)
131 * chg_ipm(TIPM_ENAALL)
133 * == TASK2(優先度:10) ==
137 * == TASK3(優先度:10) ==
140 * 25: dis_tex() ... (B-1)
141 * ext_tsk() ... (B-1)
143 * 26: ras_tex(TASK2, 0x0001) ... (C-2)
144 * ref_tex(TASK2, &rtex)
145 * 27: rot_rdq(TPRI_SELF) ... (E-1)
146 * == TASK2タスク例外処理ルーチン(1回目)==
150 * 29: ras_tex(TSK_SELF, 0x0002)
151 * == TASK2タスク例外処理ルーチン(2回目)==
163 #include <test_lib.h>
164 #include <t_syslog.h>
165 #include "kernel_cfg.h"
166 #include "test_tex1.h"
169 tex_task1(TEXPTN texptn, intptr_t exinf)
176 check_state(false, false, TIPM_ENAALL, false, false, true);
179 * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可
183 check_ercd(ercd, E_OK);
184 ercd = chg_ipm(TMAX_INTPRI);
185 check_ercd(ercd, E_OK);
187 check_ercd(ercd, E_OK);
189 check_ercd(ercd, E_OK);
190 check_state(false, true, TMAX_INTPRI, true, true, false);
195 check_state(false, false, TMIN_INTPRI, true, true, true);
201 ercd = ras_tex(TSK_SELF, 0x0001);
202 check_ercd(ercd, E_OK);
203 ercd = ras_tex(TSK_SELF, 0x0002);
204 check_ercd(ercd, E_OK);
207 * ディスパッチ許可,割込み優先度マスク変更,CPUロック
211 check_ercd(ercd, E_OK);
212 ercd = chg_ipm(TMAX_INTPRI);
213 check_ercd(ercd, E_OK);
215 check_ercd(ercd, E_OK);
216 check_state(false, true, TMAX_INTPRI, false, true, true);
221 check_state(false, false, TMIN_INTPRI, true, true, true);
224 * ディスパッチ許可,割込み優先度マスク変更,タスク例外許可
228 check_ercd(ercd, E_OK);
229 ercd = chg_ipm(TMAX_INTPRI);
230 check_ercd(ercd, E_OK);
232 check_ercd(ercd, E_OK);
233 check_state(false, false, TMAX_INTPRI, false, true, false);
239 ercd = ras_tex(TSK_SELF, 0x0004);
240 /* ここでタスク例外処理ルーチンが動作する */
241 check_ercd(ercd, E_OK);
244 * タスク例外処理からのリターンにより元の状態に戻っていること
248 check_state(false, false, TMAX_INTPRI, false, true, false);
253 check_state(false, false, TMAX_INTPRI, false, true, true);
256 * ディスパッチ禁止,割込み優先度マスク変更,CPUロック
260 check_ercd(ercd, E_OK);
261 ercd = chg_ipm(TIPM_ENAALL);
262 check_ercd(ercd, E_OK);
264 check_ercd(ercd, E_OK);
265 check_state(false, true, TIPM_ENAALL, true, true, true);
275 task1(intptr_t exinf)
284 check_state(false, false, TIPM_ENAALL, false, false, true);
285 ercd = ref_tex(TSK_SELF, &rtex);
286 check_ercd(ercd, E_OK);
287 check_assert((rtex.texstat & TTEX_DIS) != 0);
288 check_assert(rtex.pndptn == 0);
293 ercd = ras_tex(TASK3, 0x0001);
294 check_ercd(ercd, E_OBJ);
295 ercd = ras_tex(TASK4, 0x0001);
296 check_ercd(ercd, E_OBJ);
301 ercd = ref_tex(TASK3, &rtex);
302 check_ercd(ercd, E_OBJ);
303 ercd = ref_tex(TASK4, &rtex);
304 check_ercd(ercd, E_OBJ);
311 check_ercd(ercd, E_OK);
312 check_state(false, false, TIPM_ENAALL, false, false, false);
313 ercd = ref_tex(TSK_SELF, &rtex);
314 check_ercd(ercd, E_OK);
315 check_assert((rtex.texstat & TTEX_ENA) != 0);
316 check_assert(rtex.pndptn == 0);
322 ercd = ras_tex(TSK_SELF, 0x0001);
323 /* ここでタスク例外処理ルーチンが動作する */
324 check_ercd(ercd, E_OK);
327 * タスク例外処理からのリターンにより元の状態に戻っていることを
331 check_state(false, false, TIPM_ENAALL, false, false, false);
334 * ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理禁止
338 check_ercd(ercd, E_OK);
339 ercd = chg_ipm(TMIN_INTPRI);
340 check_ercd(ercd, E_OK);
342 check_ercd(ercd, E_OK);
343 check_state(false, false, TMIN_INTPRI, true, true, true);
349 ercd = ras_tex(TASK1, 0x0002);
350 check_ercd(ercd, E_OK);
351 ercd = ref_tex(TSK_SELF, &rtex);
352 check_ercd(ercd, E_OK);
353 check_assert((rtex.texstat & TTEX_DIS) != 0);
354 check_assert(rtex.pndptn == 0x0002);
361 /* ここでタスク例外処理ルーチンが動作する */
362 check_ercd(ercd, E_OK);
365 * タスク例外処理からのリターンにより元の状態に戻っていることを
369 check_state(false, false, TMIN_INTPRI, true, true, false);
376 check_ercd(ercd, E_OK);
377 ercd = chg_ipm(TIPM_ENAALL);
378 check_ercd(ercd, E_OK);
379 ercd = rot_rdq(TPRI_SELF);
381 check_ercd(ercd, E_OK);
387 ercd = ras_tex(TASK2, 0x0001);
388 check_ercd(ercd, E_OK);
389 ercd = ref_tex(TASK2, &rtex);
390 check_ercd(ercd, E_OK);
391 check_assert((rtex.texstat & TTEX_ENA) != 0);
392 check_assert(rtex.pndptn == 0x0001);
398 ercd = rot_rdq(TPRI_SELF);
400 check_ercd(ercd, E_OK);
409 tex_task2(TEXPTN texptn, intptr_t exinf)
416 check_state(false, false, TIPM_ENAALL, false, false, true);
421 check_state(false, false, TIPM_ENAALL, false, false, true);
424 * ディスパッチを禁止して,タスク切換えを要求する.
428 check_ercd(ercd, E_OK);
429 ercd = rot_rdq(TPRI_SELF);
430 check_ercd(ercd, E_OK);
433 * タスク例外処理ルーチンからのリターンで,タスク切換えが発生
446 task2(intptr_t exinf)
454 check_state(false, false, TIPM_ENAALL, false, false, true);
461 check_ercd(ercd, E_OK);
462 check_state(false, false, TIPM_ENAALL, false, false, false);
467 ercd = rot_rdq(TPRI_SELF);
469 check_ercd(ercd, E_OK);
475 ercd = ras_tex(TSK_SELF, 0x0002);
476 /* ここでタスク例外処理ルーチンが動作する */
477 check_ercd(ercd, E_OK);
486 task3(intptr_t exinf)
494 check_state(false, false, TIPM_ENAALL, false, false, true);
501 check_ercd(ercd, E_OBJ);
502 check_state(false, false, TIPM_ENAALL, false, false, true);
509 check_ercd(ercd, E_OBJ);
510 check_state(false, false, TIPM_ENAALL, false, false, true);
520 task4(intptr_t exinf)
526 tex_task4(TEXPTN texptn, intptr_t exinf)