3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 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_mutex8.c 1696 2010-01-01 16:01:25Z ertl-hiro $
45 * 優先度上限ミューテックスに対して,chg_priに伴うミューテックス関連の
46 * 優先度変更処理を網羅的にテストする.ただし,change_priorityと
47 * mutex_calc_priorityの内容には踏み込まない.
51 * (A) タスクのベース優先度の変更処理(chg_pri)
52 * (A-1) 対象タスクが実行できる状態で,ミューテックスをロックして
53 * いない場合に,同じ優先度内での優先順位が最低になること
54 * (A-2) 対象タスクが実行できる状態で,優先度上限ミューテックス以
55 * 外のミューテックスのみをロックしている場合に,同じ優先度
57 * (A-3) 対象タスクが実行できる状態で,優先度上限ミューテックスを
58 * ロックしている場合に,同じ優先度内での優先順位が変わらな
60 * (A-4) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
61 * り,ミューテックスをロックしていない場合に,優先度が正し
62 * く変更され,同じ優先度内での順序が最後になること
63 * (A-5) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
64 * り,優先度上限ミューテックス以外のミューテックスのみをロッ
65 * クしている場合に,優先度が正しく変更され,同じ優先度内で
67 * (A-6) 対象タスクが待ち状態で,優先度順の待ち行列につながれてお
68 * り,優先度上限ミューテックスをロックしている場合に,同じ
70 * (B) タスクのベース優先度の変更処理(chg_pri)のE_ILUSEエラー
71 * (B-1) 対象タスクがロックしているミューテックスの上限優先度より
72 * も,ベース優先度を高くしようとした時,E_ILUSEエラーになる
74 * (B-2) 対象タスクが優先度上限ミューテックスをロックしていても,
75 * ロックしているミューテックスの上限優先度よりも,ベース優
76 * 先度を高くしようとしない場合には,E_ILUSEエラーにならない
78 * (B-3) 対象タスクがロックを待っているミューテックスの上限優先度
79 * よりも,ベース優先度を高くしようとした時,E_ILUSEエラーに
81 * (B-4) 対象タスクが優先度上限ミューテックス待ちであっても,ロッ
82 * クを待っているミューテックスの上限優先度よりも,ベース優
83 * 先度を高くしようとしない場合には,E_ILUSEエラーにならない
89 * 中優先度タスク(TASK1)が実行可能状態の時に,高優先度タスク
90 * (TASK5)からTASK1を低優先度にchg_priすると,実行可能状態の他の
91 * 低優先度タスク(TASK4)よりも,優先順位が低くなることを確認する.
93 * 中優先度タスク(TASK1)が優先度順ミューテックス(MTX3)をロック
94 * し,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を低優
95 * 先度にchg_priすると,実行可能状態の他の低優先度タスク(TASK4)
96 * よりも,優先順位が低くなることを確認する.
98 * 中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
99 * クし,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を低
100 * 優先度にchg_priすると,TASK1の優先度が変化しないことを確認する.
101 * また,実行可能状態の中優先度タスクを2つ(TASK2,TASK3)を用意し
102 * ておき,優先順位が変わらないことを確認する.
104 * 中優先度タスク(TASK1)が高優先度上限ミューテックス(MTX2)を待っ
105 * ている時に,高優先度タスク(TASK5)からTASK1を低優先度に
106 * chg_priすると,MTX2を待っている他の低優先度タスク(TASK4)より
107 * も,待ち行列中での順序が後になることを確認する.
109 * 中優先度タスク(TASK1)が優先度順ミューテックス(MTX3)をロック
110 * し,高優先度上限ミューテックス(MTX2)を待っている時に,高優先度タ
111 * スク(TASK5)からTASK1を低優先度にchg_priすると,MTX2を待ってい
112 * る他の低優先度タスク(TASK4)よりも,待ち行列中での順序が変わら
115 * 中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
116 * クし,高優先度上限ミューテックス(MTX2)を待っている時に,高優
117 * 先度タスク(TASK5)からTASK1を低優先度にchg_priすると,TASK1の
118 * 優先度が変化しないことを確認する.また,MTX2を待っている中優先
119 * 度タスクを2つ(TASK2,TASK3)を用意しておき,待ち行列中での順序
122 * 中優先度タスク(TASK1)が中優先度上限ミューテックス(MTX1)をロッ
123 * クし,実行可能状態の時に,高優先度タスク(TASK5)からTASK1を高
124 * 優先度にchg_priすると,E_ILUSEエラーになることを確認する.
126 * (A-3)のテスト項目で,chg_priがE_ILUSEエラーにならないことで確認
129 * 中優先度タスク(TASK2)が中優先度上限ミューテックス(MTX1)のロッ
130 * クを待っている時に,高優先度タスク(TASK5)からTASK2を高優先度
131 * にchg_priすると,E_ILUSEエラーになることを確認する.
133 * (A-6)のテスト項目で,chg_priがE_ILUSEエラーにならないことで確認
138 * TASK1: 中優先度タスク,メインタスク,最初から起動
143 * MTX1: ミューテックス(TA_CEILING属性,上限は中優先度)
144 * MTX2: ミューテックス(TA_CEILING属性,上限は高優先度)
145 * MTX3: ミューテックス(TA_TPRI属性)
150 * call(set_bit_func(bit_mutex))
153 * // 高:TASK5,中:TASK1,低:TASK4
155 * 3: chg_pri(TASK1, LOW_PRIORITY) ... (A-1)
156 * // 高:TASK5,低:TASK4→TASK1
161 * 6: chg_pri(TSK_SELF, TPRI_INI)
166 * // 高:TASK5,中:TASK1,低:TASK4,MTX3:TASK1
168 * 10: chg_pri(TASK1, LOW_PRIORITY) ... (A-2)
169 * // 高:TASK5,低:TASK4→TASK1,MTX3:TASK1
175 * chg_pri(TSK_SELF, TPRI_INI)
180 * 17: rot_rdq(MID_PRIORITY)
182 * // 中:TASK2→TASK1→TASK3,MTX1:TASK1
184 * // 高:TASK5,中:TASK2→TASK1→TASK3,MTX1:TASK1
187 * 21: chg_pri(TASK1, LOW_PRIORITY) ... (A-3)(B-2)
188 * // 高:TASK5,中:TASK2→TASK1→TASK3,MTX1:TASK1
189 * get_pri(TASK1, &tskpri)
190 * assert(tskpri == MID_PRIORITY)
192 * // 中:TASK2→TASK1→TASK3,MTX1:TASK1
195 * // 中:TASK1→TASK3,MTX1:TASK1
202 * 26: chg_pri(TSK_SELF, TPRI_INI)
207 * 29: tslp_tsk(10) -> E_TMOUT
213 * // MTX2:TASK5→TASK1→TASK4
215 * // 高:TASK5,MTX2:TASK5→TASK1→TASK4
217 * 33: chg_pri(TASK1, LOW_PRIORITY) ... (A-4)
218 * // 高:TASK5,MTX2:TASK5→TASK4→TASK1
220 * // 高:TASK5→TASK4,MTX2:TASK4→TASK1
222 * // 高:TASK4,MTX2:TASK4→TASK1
225 * // 高:TASK1,低:TASK4,MTX2:TASK1
229 * 38: chg_pri(TSK_SELF, TPRI_INI)
233 * // 高:TASK5,中:TASK1,低:TASK4,MTX3:TASK1
236 * 42: tslp_tsk(10) -> E_TMOUT
241 * // MTX2:TASK5→TASK1→TASK4,MTX3:TASK1
243 * // 高:TASK5,MTX2:TASK5→TASK1→TASK4,MTX3:TASK1
245 * 45: chg_pri(TASK1, LOW_PRIORITY) ... (A-5)
246 * // 高:TASK5,MTX2:TASK5→TASK4→TASK1,MTX3:TASK1
248 * // 高:TASK5→TASK4,MTX2:TASK4→TASK1,MTX3:TASK1
250 * // 高:TASK4,MTX2:TASK4→TASK1,MTX3:TASK1
253 * // 高:TASK1,低:TASK4,MTX2:TASK1,MTX3:TASK1
256 * // 低:TASK1→TASK4,MTX3:TASK1
260 * 52: chg_pri(TSK_SELF, TPRI_INI)
264 * // 高:TASK5,中:TASK1,MTX1:TASK1
267 * 56: tslp_tsk(10) -> E_TMOUT
268 * // 中:TASK1,MTX1:TASK1,MTX2:TASK5
271 * 58: rot_rdq(MID_PRIORITY)
274 * // 中:TASK1,MTX1:TASK1,MTX2:TASK5→TASK2
278 * // 中:TASK3,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1
281 * // MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
283 * // 高:TASK5,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
285 * 63: chg_pri(TASK1, LOW_PRIORITY) ... (A-6)(B-4)
286 * // 高:TASK5,MTX1:TASK1,MTX2:TASK5→TASK2→TASK1→TASK3
287 * get_pri(TASK1, &tskpri)
288 * assert(tskpri == MID_PRIORITY)
290 * // 高:TASK5→TASK2,MTX1:TASK1,MTX2:TASK2→TASK1→TASK3
292 * // 高:TASK2,MTX1:TASK1,MTX2:TASK2→TASK1→TASK3
295 * // 高:TASK1,中:TASK2,MTX1:TASK1,MTX2:TASK1→TASK3
298 * // 高:TASK3,中:TASK1→TASK2,MTX1:TASK1,MTX2:TASK3
301 * // 中:TASK3→TASK1→TASK2,MTX1:TASK1
302 * 69: ext_tsk() -> noreturn
303 * // 中:TASK1→TASK2,MTX1:TASK1
305 * 70: chg_pri(TSK_SELF, TPRI_INI)
306 * // 中:TASK1→TASK2,MTX1:TASK1
308 * 71: rot_rdq(MID_PRIORITY)
309 * // 中:TASK2→TASK1,MTX1:TASK1
312 * // 中:TASK1,MTX1:TASK1→TASK2
315 * // 高:TASK5,中:TASK1,MTX1:TASK1→TASK2
317 * 74: chg_pri(TASK1, HIGH_PRIORITY) -> E_ILUSE ... (B-1)
318 * 75: chg_pri(TASK2, HIGH_PRIORITY) -> E_ILUSE ... (B-3)
319 * 76: ext_tsk() -> noreturn
320 * // 中:TASK1,MTX1:TASK1→TASK2
323 * // 中:TASK1→TASK2,MTX1:TASK2
324 * 78: ext_tsk() -> noreturn
331 #include <t_syslog.h>
332 #include "syssvc/logtask.h"
333 #include "kernel_cfg.h"
334 #include "test_lib.h"
335 #include "test_mutex8.h"
337 extern ER bit_mutex(void);
340 task1(intptr_t exinf)
344 set_bit_func(bit_mutex);
347 ercd = act_tsk(TASK4);
348 check_ercd(ercd, E_OK);
351 ercd = act_tsk(TASK5);
352 check_ercd(ercd, E_OK);
355 ercd = chg_pri(TSK_SELF, TPRI_INI);
356 check_ercd(ercd, E_OK);
359 ercd = loc_mtx(MTX3);
360 check_ercd(ercd, E_OK);
363 ercd = wup_tsk(TASK4);
364 check_ercd(ercd, E_OK);
367 ercd = wup_tsk(TASK5);
368 check_ercd(ercd, E_OK);
371 ercd = unl_mtx(MTX3);
372 check_ercd(ercd, E_OK);
374 ercd = chg_pri(TSK_SELF, TPRI_INI);
375 check_ercd(ercd, E_OK);
378 ercd = loc_mtx(MTX1);
379 check_ercd(ercd, E_OK);
382 ercd = act_tsk(TASK2);
383 check_ercd(ercd, E_OK);
387 check_ercd(ercd, E_OK);
390 ercd = rot_rdq(MID_PRIORITY);
391 check_ercd(ercd, E_OK);
394 ercd = act_tsk(TASK3);
395 check_ercd(ercd, E_OK);
398 ercd = wup_tsk(TASK5);
399 check_ercd(ercd, E_OK);
403 check_ercd(ercd, E_OK);
406 ercd = unl_mtx(MTX1);
407 check_ercd(ercd, E_OK);
410 ercd = chg_pri(TSK_SELF, TPRI_INI);
411 check_ercd(ercd, E_OK);
414 ercd = wup_tsk(TASK5);
415 check_ercd(ercd, E_OK);
418 ercd = wup_tsk(TASK4);
419 check_ercd(ercd, E_OK);
422 ercd = loc_mtx(MTX2);
423 check_ercd(ercd, E_OK);
426 ercd = unl_mtx(MTX2);
427 check_ercd(ercd, E_OK);
430 ercd = chg_pri(TSK_SELF, TPRI_INI);
431 check_ercd(ercd, E_OK);
434 ercd = loc_mtx(MTX3);
435 check_ercd(ercd, E_OK);
438 ercd = wup_tsk(TASK5);
439 check_ercd(ercd, E_OK);
442 ercd = loc_mtx(MTX2);
443 check_ercd(ercd, E_OK);
446 ercd = unl_mtx(MTX2);
447 check_ercd(ercd, E_OK);
450 ercd = unl_mtx(MTX3);
451 check_ercd(ercd, E_OK);
454 ercd = ter_tsk(TASK4);
455 check_ercd(ercd, E_OK);
458 ercd = chg_pri(TSK_SELF, TPRI_INI);
459 check_ercd(ercd, E_OK);
462 ercd = loc_mtx(MTX1);
463 check_ercd(ercd, E_OK);
466 ercd = wup_tsk(TASK5);
467 check_ercd(ercd, E_OK);
470 ercd = wup_tsk(TASK2);
471 check_ercd(ercd, E_OK);
474 ercd = rot_rdq(MID_PRIORITY);
475 check_ercd(ercd, E_OK);
478 ercd = wup_tsk(TASK3);
479 check_ercd(ercd, E_OK);
482 ercd = loc_mtx(MTX2);
483 check_ercd(ercd, E_OK);
486 ercd = unl_mtx(MTX2);
487 check_ercd(ercd, E_OK);
490 ercd = chg_pri(TSK_SELF, TPRI_INI);
491 check_ercd(ercd, E_OK);
494 ercd = rot_rdq(MID_PRIORITY);
495 check_ercd(ercd, E_OK);
498 ercd = wup_tsk(TASK5);
499 check_ercd(ercd, E_OK);
502 ercd = unl_mtx(MTX1);
503 check_ercd(ercd, E_OK);
512 task2(intptr_t exinf)
518 check_ercd(ercd, E_OK);
521 ercd = loc_mtx(MTX2);
522 check_ercd(ercd, E_OK);
525 ercd = unl_mtx(MTX2);
526 check_ercd(ercd, E_OK);
529 ercd = loc_mtx(MTX1);
530 check_ercd(ercd, E_OK);
533 ercd = unl_mtx(MTX1);
534 check_ercd(ercd, E_OK);
542 task3(intptr_t exinf)
548 check_ercd(ercd, E_OK);
551 ercd = loc_mtx(MTX2);
552 check_ercd(ercd, E_OK);
555 ercd = unl_mtx(MTX2);
556 check_ercd(ercd, E_OK);
565 task4(intptr_t exinf)
571 check_ercd(ercd, E_OK);
575 check_ercd(ercd, E_OK);
578 ercd = loc_mtx(MTX2);
579 check_ercd(ercd, E_OK);
582 ercd = unl_mtx(MTX2);
583 check_ercd(ercd, E_OK);
586 ercd = loc_mtx(MTX2);
587 check_ercd(ercd, E_OK);
590 ercd = unl_mtx(MTX2);
591 check_ercd(ercd, E_OK);
597 task5(intptr_t exinf)
603 ercd = chg_pri(TASK1, LOW_PRIORITY);
604 check_ercd(ercd, E_OK);
608 check_ercd(ercd, E_OK);
611 ercd = chg_pri(TASK1, LOW_PRIORITY);
612 check_ercd(ercd, E_OK);
616 check_ercd(ercd, E_OK);
619 ercd = chg_pri(TASK1, LOW_PRIORITY);
620 check_ercd(ercd, E_OK);
622 ercd = get_pri(TASK1, &tskpri);
623 check_ercd(ercd, E_OK);
624 check_assert(tskpri == MID_PRIORITY);
628 check_ercd(ercd, E_OK);
631 ercd = loc_mtx(MTX2);
632 check_ercd(ercd, E_OK);
636 check_ercd(ercd, E_TMOUT);
639 ercd = chg_pri(TASK1, LOW_PRIORITY);
640 check_ercd(ercd, E_OK);
643 ercd = unl_mtx(MTX2);
644 check_ercd(ercd, E_OK);
648 check_ercd(ercd, E_OK);
651 ercd = loc_mtx(MTX2);
652 check_ercd(ercd, E_OK);
656 check_ercd(ercd, E_TMOUT);
659 ercd = chg_pri(TASK1, LOW_PRIORITY);
660 check_ercd(ercd, E_OK);
663 ercd = unl_mtx(MTX2);
664 check_ercd(ercd, E_OK);
668 check_ercd(ercd, E_OK);
671 ercd = loc_mtx(MTX2);
672 check_ercd(ercd, E_OK);
676 check_ercd(ercd, E_TMOUT);
679 ercd = chg_pri(TASK1, LOW_PRIORITY);
680 check_ercd(ercd, E_OK);
682 ercd = get_pri(TASK1, &tskpri);
683 check_ercd(ercd, E_OK);
684 check_assert(tskpri == MID_PRIORITY);
687 ercd = unl_mtx(MTX2);
688 check_ercd(ercd, E_OK);
692 check_ercd(ercd, E_OK);
695 ercd = chg_pri(TASK1, HIGH_PRIORITY);
696 check_ercd(ercd, E_ILUSE);
699 ercd = chg_pri(TASK2, HIGH_PRIORITY);
700 check_ercd(ercd, E_ILUSE);