3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 2007-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_mutex4.c 1696 2010-01-01 16:01:25Z ertl-hiro $
45 * 優先度上限ミューテックスに対して,loc_mtxとunl_mtxに伴う優先度の変
46 * 更処理を網羅的にテストする.ただし,change_priorityと
47 * mutex_calc_priorityの内容には踏み込まない.
51 * (A) ミューテックスのロック処理(loc_mtx)に伴う優先度変更
52 * (A-1) ロックしたミューテックスの優先度上限が自タスクの現在優先
53 * 度よりも高い場合に,自タスクの優先度がその優先度上限まで
54 * 上がること.また,同じ優先度内での優先順位が最高になるこ
56 * (A-2) ロックしたミューテックスの優先度上限が自タスクの現在優先
57 * 度と同じ場合に,自タスクの優先度が変わらないこと.また,
58 * 同じ優先度内での優先順位が変わらないこと
59 * (A-3) ロックしたミューテックスの優先度上限が自タスクの現在優先
60 * 度よりも低い場合に,自タスクの優先度が変わらないこと.ま
61 * た,同じ優先度内での優先順位が変わらないこと
62 * (B) ミューテックスのロック解除処理(unl_mtx)に伴うロック解除した
64 * (B-1) ロック解除したミューテックスの上限優先度が自タスクの現在
65 * 優先度と同じで,ミューテックスのロック解除で優先度が下が
66 * るべき場合に,自タスクの優先度が適切に下げられること.ま
67 * た,同じ優先度内での優先順位が最高になること
68 * (B-2) ロック解除したミューテックスの上限優先度が自タスクの現在
69 * 優先度と同じで,ミューテックスのロック解除で優先度が変わ
70 * るべきでない場合に,自タスクの優先度が変わらないこと.ま
71 * た,同じ優先度内での優先順位が変わらないこと
72 * (B-3) ロック解除したミューテックスの上限優先度が自タスクの現在
73 * 優先度よりも低い場合に,自タスクの優先度が変わらないこと.
74 * また,同じ優先度内での優先順位が変わらないこと
75 * (C) ミューテックスのロック解除処理(unl_mtx)に伴いミューテックスを
77 * (C-1) ミューテックスの優先度上限が新たにミューテックスをロック
78 * したタスクの現在優先度よりも高い場合に,当該タスクの優先
79 * 度がその優先度上限まで上がること.また,同じ優先度内での
81 * (C-2) ミューテックスの優先度上限が新たにミューテックスをロック
82 * したタスクの現在優先度と同じ場合に,当該タスクの優先度が
83 * 変わらないこと.また,同じ優先度内での優先順位が最低にな
85 * (C-3) ミューテックスの優先度上限が新たにミューテックスをロック
86 * したタスクの現在優先度よりも低い場合に,当該タスクの優先
87 * 度が変わらないこと.また,同じ優先度内での優先順位が最低
89 * (D) ミューテックスのロック処理(loc_mtx)のE_ILUSEエラー
90 * (D-1) 自タスクのベース優先度が,ロックしようとしたミューテック
91 * スの上限優先度よりも高い時,E_ILUSEエラーになること
92 * (D-2) 自タスクのベース優先度が,ロックしようとしたミューテック
93 * スの上限優先度と同じかそれより低ければ,自タスクの現在優
94 * 先度がそれより高くても,E_ILUSEエラーにならないこと
99 * 中優先度タスク(TASK1)に,高優先度上限ミューテックス(MTX2)を
100 * ロックさせ,高優先度になることを確認する.また,実行可能状態の
101 * 高優先度タスク(TASK4)よりも,優先順位が高くなることを確認する.
104 * 中優先度タスク(TASK1)に,中優先度上限ミューテックス(MTX1)を
105 * ロックさせ,優先度が変わらないことを確認する.また,実行可能状
106 * 態の中優先度タスクを2つ(TASK2,TASK3)を用意しておき,優先順位
107 * が変わらないことを確認する.ディスパッチ禁止状態で実施する.
109 * 中優先度タスク(TASK1)が高優先度上限ミューテックス(MTX2)をロッ
110 * クして高優先度になっている状態で,中優先度上限ミューテックス
111 * (MTX1)をロックさせ,優先度が変わらないことを確認する.また,
112 * 実行可能状態の高優先度タスクを2つ(TASK4,TASK5)を用意しておき,
113 * 優先順位が変わらないことを確認する.ディスパッチ禁止状態で実施
116 * 中優先度タスク(TASK1)に高優先度上限ミューテックス(MTX2)のみ
117 * をロックさせている状態で,それをロック解除させ,中優先度になる
118 * ことを確認する.また,実行可能状態の中優先度タスク(TASK2)より
119 * も,優先順位が高くなることを確認する.
121 * 中優先度タスク(TASK1)に中優先度上限ミューテックス(MTX1)のみ
122 * をロックさせている状態で,それをロック解除させ,優先度が変わら
123 * ないことを確認する.また,実行可能状態の中優先度タスクを2つ
124 * (TASK2,TASK3)を用意しておき,優先順位が変わらないことを確認
125 * する.ディスパッチ禁止状態で実施する.
127 * 中優先度タスク(TASK1)に高優先度上限ミューテックス(MTX2)と中
128 * 優先度上限ミューテックス(MTX1)をロックさせている状態で,中優
129 * 先度上限ミューテックス(MTX1)をロック解除させ,優先度が変わら
130 * ないことを確認する.また,実行可能状態の高優先度タスクを2つ
131 * (TASK4,TASK5)を用意しておき,優先順位が変わらないことを確認
132 * する.ディスパッチ禁止状態で実施する.
134 * 中優先度タスク(TASK1)に高優先度上限ミューテックスを2つ(MTX2,
135 * MTX3)ロックさせ,別の中優先度タスク(TASK2)がMTX2を待っている
136 * 状態で,TASK1にMTX2をロック解除させ,TASK2の優先度が高優先度に
137 * なることを確認する.また,TASK2の優先順位が,TASK1よりも低くな
140 * 中優先度タスク(TASK2)に中優先度上限ミューテックス(MTX1)をロッ
141 * クさせ,別の中優先度タスク(TASK1)がMTX1を待っている状態で,
142 * TASK2にMTX1をロック解除させ,TASK1の優先度が中優先度のまま変化
143 * しないことを確認する.また,実行可能状態の中優先度タスクをもう
144 * 1つ(TASK3)用意しておき,TASK1の優先順位がTASK3よりも低くなる
147 * 中優先度タスク(TASK1)に中優先度上限ミューテックス(MTX1)と高
148 * 優先度上限ミューテックス(MTX3)をロックさせ,別の中優先度タス
149 * ク(TASK2)が別の高優先度上限ミューテックス(MTX2)をロックして
150 * MTX1を待っている状態で,TASK1にMTX1をロック解除させ,TASK2の優
151 * 先度が高優先度のまま変化しないことを確認する.また,TASK2の優先
152 * 順位が,TASK1よりも低くなることを確認する.
154 * 高優先度タスク(TASK4)に,中優先度上限ミューテックス(MTX1)を
155 * ロックさせ,E_ILUSEエラーになることを確認する.
157 * 中優先度タスク(TASK1)が高優先度上限ミューテックス(MTX2)をロッ
158 * クして高優先度になっている状態で,中優先度上限ミューテックス
159 * (MTX1)をロックさせ,E_ILUSEエラーになるないことを確認する.
163 * TASK1: 中優先度タスク,メインタスク,最初から起動
168 * MTX1: ミューテックス(TA_CEILING属性,上限は中優先度)
169 * MTX2: ミューテックス(TA_CEILING属性,上限は高優先度)
170 * MTX3: ミューテックス(TA_CEILING属性,上限は高優先度)
175 * call(set_bit_func(bit_mutex))
179 * // 高:TASK4,中:TASK1→TASK2
180 * 3: ploc_mtx(MTX2) ... (A-1)
181 * // 高:TASK1→TASK4,中:TASK2,MTX2:TASK1
182 * get_pri(TSK_SELF, &tskpri)
183 * assert(tskpri == HIGH_PRIORITY)
185 * 5: unl_mtx(MTX2) ... (B-1)
186 * // 高:TASK4,中:TASK1→TASK2
188 * 6: loc_mtx(MTX1) -> E_ILUSE ... (D-1)
192 * 8: get_pri(TSK_SELF, &tskpri)
193 * assert(tskpri == MID_PRIORITY)
196 * 10: rot_rdq(MID_PRIORITY)
199 * // 中:TASK2→TASK1→TASK3
200 * 12: ploc_mtx(MTX1) ... (A-2)
201 * // 中:TASK2→TASK1→TASK3,MTX1:TASK1
202 * get_pri(TSK_SELF, &tskpri)
203 * assert(tskpri == MID_PRIORITY)
207 * // 中:TASK1→TASK3,MTX1:TASK1
210 * // 中:TASK3,MTX1:TASK1
213 * // 中:TASK3→TASK1,MTX1:TASK1
215 * // 中:TASK1,MTX1:TASK1
219 * // 中:TASK1→TASK2,MTX1:TASK1
221 * 20: rot_rdq(MID_PRIORITY)
222 * // 中:TASK2→TASK1,MTX1:TASK1
224 * // 中:TASK2→TASK1→TASK3,MTX1:TASK1
225 * 22: unl_mtx(MTX1) ... (B-2)
226 * // 中:TASK2→TASK1→TASK3
227 * get_pri(TSK_SELF, &tskpri)
228 * assert(tskpri == MID_PRIORITY)
247 * // 高:TASK1→TASK4,MTX2:TASK1
248 * 31: rot_rdq(HIGH_PRIORITY)
249 * // 高:TASK4→TASK1,MTX2:TASK1
251 * // 高:TASK4→TASK1→TASK5,MTX2:TASK1
252 * 33: ploc_mtx(MTX1) ... (A-3)(D-2)
253 * // 高:TASK4→TASK1→TASK5,MTX2:TASK1,MTX1:TASK1
254 * get_pri(TSK_SELF, &tskpri)
255 * assert(tskpri == HIGH_PRIORITY)
259 * // 高:TASK1→TASK5,MTX2:TASK1,MTX1:TASK1
262 * // 高:TASK5,MTX2:TASK1,MTX1:TASK1
265 * // 高:TASK5→TASK1,MTX2:TASK1,MTX1:TASK1
267 * // 高:TASK1,MTX2:TASK1,MTX1:TASK1
272 * // 高:TASK1→TASK4,MTX2:TASK1,MTX1:TASK1
273 * 41: rot_rdq(HIGH_PRIORITY)
274 * // 高:TASK4→TASK1,MTX2:TASK1,MTX1:TASK1
276 * // 高:TASK4→TASK1→TASK5,MTX2:TASK1,MTX1:TASK1
277 * 43: unl_mtx(MTX1) ... (B-3)
278 * // 高:TASK4→TASK1→TASK5,MTX2:TASK1
279 * get_pri(TSK_SELF, &tskpri)
280 * assert(tskpri == HIGH_PRIORITY)
284 * // 高:TASK1→TASK5,MTX2:TASK1
287 * // 高:TASK5,MTX2:TASK1
290 * // 高:TASK5→TASK1,MTX2:TASK1
292 * // 高:TASK1,MTX2:TASK1
298 * // 中:TASK2→TASK3,MTX2:TASK1
301 * // 中:TASK3,MTX2:TASK1→TASK2
304 * // 高:TASK1,中:TASK3,MTX2:TASK1→TASK2
307 * // 高:TASK1,中:TASK3,MTX2:TASK1→TASK2,MTX3:TASK1
308 * 53: unl_mtx(MTX2) ... (C-1)
309 * // 高:TASK1→TASK2,中:TASK3,MTX2:TASK2,MTX3:TASK1
310 * get_pri(TASK2, &tskpri)
311 * assert(tskpri == HIGH_PRIORITY)
313 * // 高:TASK1→TASK2,中:TASK3,MTX1:TASK1,MTX2:TASK2,MTX3:TASK1
315 * // 高:TASK2,中:TASK3,MTX1:TASK1,MTX2:TASK2,MTX3:TASK1
319 * // 高:TASK2→TASK1,中:TASK3,MTX1:TASK1,MTX2:TASK2,MTX3:TASK1
321 * // 高:TASK1,中:TASK3,MTX1:TASK1→TASK2,MTX2:TASK2,MTX3:TASK1
323 * 58: unl_mtx(MTX1) ... (C-3)
324 * // 高:TASK1→TASK2,中:TASK3,MTX1:TASK2,MTX2:TASK2,MTX3:TASK1
325 * get_pri(TASK2, &tskpri)
326 * assert(tskpri == HIGH_PRIORITY)
328 * // 高:TASK2,中:TASK1→TASK3,MTX1:TASK2,MTX2:TASK2
331 * // 中:TASK2→TASK1→TASK3,MTX1:TASK2
333 * 61: rot_rdq(MID_PRIORITY)
334 * // 中:TASK1→TASK3→TASK2,MTX1:TASK2
337 * // 中:TASK3→TASK2,MTX1:TASK2→TASK1
339 * 63: rot_rdq(MID_PRIORITY)
340 * // 中:TASK2→TASK3,MTX1:TASK2→TASK1
342 * 64: unl_mtx(MTX1) ... (C-2)
343 * // 中:TASK2→TASK3→TASK1,MTX1:TASK1
344 * get_pri(TASK1, &tskpri)
345 * assert(tskpri == MID_PRIORITY)
347 * 65: ext_tsk() -> noreturn
348 * // 中:TASK3→TASK1,MTX1:TASK1
350 * 66: ext_tsk() -> noreturn
351 * // 中:TASK1,MTX1:TASK1
357 #include <t_syslog.h>
358 #include "syssvc/logtask.h"
359 #include "kernel_cfg.h"
360 #include "test_lib.h"
361 #include "test_mutex4.h"
363 extern ER bit_mutex(void);
366 task1(intptr_t exinf)
371 set_bit_func(bit_mutex);
375 check_ercd(ercd, E_OK);
378 ercd = act_tsk(TASK2);
379 check_ercd(ercd, E_OK);
381 ercd = act_tsk(TASK4);
382 check_ercd(ercd, E_OK);
385 ercd = ploc_mtx(MTX2);
386 check_ercd(ercd, E_OK);
388 ercd = get_pri(TSK_SELF, &tskpri);
389 check_ercd(ercd, E_OK);
390 check_assert(tskpri == HIGH_PRIORITY);
394 check_ercd(ercd, E_OK);
397 ercd = unl_mtx(MTX2);
398 check_ercd(ercd, E_OK);
401 ercd = get_pri(TSK_SELF, &tskpri);
402 check_ercd(ercd, E_OK);
403 check_assert(tskpri == MID_PRIORITY);
407 check_ercd(ercd, E_OK);
410 ercd = rot_rdq(MID_PRIORITY);
411 check_ercd(ercd, E_OK);
414 ercd = act_tsk(TASK3);
415 check_ercd(ercd, E_OK);
418 ercd = ploc_mtx(MTX1);
419 check_ercd(ercd, E_OK);
421 ercd = get_pri(TSK_SELF, &tskpri);
422 check_ercd(ercd, E_OK);
423 check_assert(tskpri == MID_PRIORITY);
427 check_ercd(ercd, E_OK);
431 check_ercd(ercd, E_OK);
434 ercd = wup_tsk(TASK2);
435 check_ercd(ercd, E_OK);
439 check_ercd(ercd, E_OK);
442 ercd = rot_rdq(MID_PRIORITY);
443 check_ercd(ercd, E_OK);
446 ercd = wup_tsk(TASK3);
447 check_ercd(ercd, E_OK);
450 ercd = unl_mtx(MTX1);
451 check_ercd(ercd, E_OK);
453 ercd = get_pri(TSK_SELF, &tskpri);
454 check_ercd(ercd, E_OK);
455 check_assert(tskpri == MID_PRIORITY);
459 check_ercd(ercd, E_OK);
463 check_ercd(ercd, E_OK);
467 check_ercd(ercd, E_OK);
470 ercd = wup_tsk(TASK4);
471 check_ercd(ercd, E_OK);
474 ercd = ploc_mtx(MTX2);
475 check_ercd(ercd, E_OK);
478 ercd = rot_rdq(HIGH_PRIORITY);
479 check_ercd(ercd, E_OK);
482 ercd = act_tsk(TASK5);
483 check_ercd(ercd, E_OK);
486 ercd = ploc_mtx(MTX1);
487 check_ercd(ercd, E_OK);
489 ercd = get_pri(TSK_SELF, &tskpri);
490 check_ercd(ercd, E_OK);
491 check_assert(tskpri == HIGH_PRIORITY);
495 check_ercd(ercd, E_OK);
499 check_ercd(ercd, E_OK);
503 check_ercd(ercd, E_OK);
506 ercd = wup_tsk(TASK4);
507 check_ercd(ercd, E_OK);
510 ercd = rot_rdq(HIGH_PRIORITY);
511 check_ercd(ercd, E_OK);
514 ercd = wup_tsk(TASK5);
515 check_ercd(ercd, E_OK);
518 ercd = unl_mtx(MTX1);
519 check_ercd(ercd, E_OK);
521 ercd = get_pri(TSK_SELF, &tskpri);
522 check_ercd(ercd, E_OK);
523 check_assert(tskpri == HIGH_PRIORITY);
527 check_ercd(ercd, E_OK);
531 check_ercd(ercd, E_OK);
534 ercd = wup_tsk(TASK2);
535 check_ercd(ercd, E_OK);
537 ercd = wup_tsk(TASK3);
538 check_ercd(ercd, E_OK);
541 check_ercd(ercd, E_OK);
544 ercd = loc_mtx(MTX3);
545 check_ercd(ercd, E_OK);
548 ercd = unl_mtx(MTX2);
549 check_ercd(ercd, E_OK);
551 ercd = get_pri(TASK2, &tskpri);
552 check_ercd(ercd, E_OK);
553 check_assert(tskpri == HIGH_PRIORITY);
556 ercd = loc_mtx(MTX1);
557 check_ercd(ercd, E_OK);
561 check_ercd(ercd, E_OK);
564 ercd = unl_mtx(MTX1);
565 check_ercd(ercd, E_OK);
567 ercd = get_pri(TASK2, &tskpri);
568 check_ercd(ercd, E_OK);
569 check_assert(tskpri == HIGH_PRIORITY);
572 ercd = unl_mtx(MTX3);
573 check_ercd(ercd, E_OK);
576 ercd = loc_mtx(MTX1);
577 check_ercd(ercd, E_OK);
585 task2(intptr_t exinf)
592 check_ercd(ercd, E_OK);
596 check_ercd(ercd, E_OK);
599 ercd = loc_mtx(MTX2);
600 check_ercd(ercd, E_OK);
603 ercd = wup_tsk(TASK1);
604 check_ercd(ercd, E_OK);
607 ercd = loc_mtx(MTX1);
608 check_ercd(ercd, E_OK);
611 ercd = unl_mtx(MTX2);
612 check_ercd(ercd, E_OK);
615 ercd = rot_rdq(MID_PRIORITY);
616 check_ercd(ercd, E_OK);
619 ercd = unl_mtx(MTX1);
620 check_ercd(ercd, E_OK);
622 ercd = get_pri(TASK1, &tskpri);
623 check_ercd(ercd, E_OK);
624 check_assert(tskpri == MID_PRIORITY);
633 task3(intptr_t exinf)
638 ercd = wup_tsk(TASK1);
639 check_ercd(ercd, E_OK);
643 check_ercd(ercd, E_OK);
646 ercd = wup_tsk(TASK1);
647 check_ercd(ercd, E_OK);
651 check_ercd(ercd, E_OK);
654 ercd = wup_tsk(TASK1);
655 check_ercd(ercd, E_OK);
658 ercd = rot_rdq(MID_PRIORITY);
659 check_ercd(ercd, E_OK);
668 task4(intptr_t exinf)
673 ercd = loc_mtx(MTX1);
674 check_ercd(ercd, E_ILUSE);
678 check_ercd(ercd, E_OK);
682 check_ercd(ercd, E_OK);
686 check_ercd(ercd, E_OK);
692 task5(intptr_t exinf)
697 ercd = wup_tsk(TASK1);
698 check_ercd(ercd, E_OK);
702 check_ercd(ercd, E_OK);
705 ercd = wup_tsk(TASK1);
706 check_ercd(ercd, E_OK);
710 check_ercd(ercd, E_OK);