3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 2008-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_mutex7.c 1696 2010-01-01 16:01:25Z ertl-hiro $
45 * 優先度上限ミューテックスに対して,タスクの強制終了時のミューテック
50 * (A) タスクの強制終了時(ter_tsk)
51 * (A-1) ロックしていたミューテックス(1つ)がロック解除されること.
52 * (A-2) ロックしていたミューテックス(1つ)がロック解除され,ロッ
53 * クを待っていたタスクがそれをロックし,優先度が変化し,待
55 * (A-3) (A-2)の結果,タスクディスパッチが起こること.
56 * (A-4) ロックしていたミューテックス(複数)がすべてロック解除さ
58 * (A-5) ロックしていたミューテックス(複数)がロック解除され,ロッ
59 * クを待っていたタスク(複数)がそれをロックし,優先度が変
60 * 化し,待ち解除されること.その時に,後でミューテックスを
61 * ロックしたタスク(先にロックしていたミューテックスを待っ
62 * ていたタスク)の方が,優先順位が高くなること.
63 * (A-6) (A-5)の結果,タスクディスパッチが起こること.
68 * 低優先度タスク(TASK2)にミューテックス(MTX1)をロックさせ,別
69 * のタスク(TASK1)からTASK2をter_tskすると,ロックが解除されるこ
72 * 低優先度タスク(TASK2)に中優先度上限ミューテックス(MTX1)をロッ
73 * クさせ,別の低優先度タスク(TASK3)にMTX1を待たせた状態で,高優
74 * 先度タスク(TASK1)からTASK2をter_tskすると,TASK3が中優先度に
77 * 低優先度タスク(TASK2)に中優先度上限ミューテックス(MTX1)をロッ
78 * クさせ,別の低優先度タスク(TASK3)にMTX1を待たせた状態で,別の
79 * 低優先度タスク(TASK1)からTASK2をter_tskすると,TASK3が中優先
80 * 度になって待ち解除され,TASK3に切り換わることを確認する.
82 * 低優先度タスク(TASK2)にミューテックスを2つ(MTX1,MTX2)ロッ
83 * クさせ,別のタスク(TASK1)からTASK2をter_tskすると,両方のロッ
86 * 低優先度タスク(TASK2)に高優先度上限ミューテックス2つ(MTX1,
87 * MTX2)をこの順でロックさせ,別の低優先度タスク2つ(TASK3,
88 * TASK4)にそれぞれのロックを待たせた状態で,高優先度タスク
89 * (TASK1)からTASK2をter_tskすると,TASK3とTASK4が中優先度になっ
90 * て待ち解除されることを確認する.また,先にロックしていたミュー
91 * テックス(MTX1)を待っていたタスク(TASK3)が,TASK4よりも優先
94 * 低優先度タスク(TASK2)に高優先度上限ミューテックス2つ(MTX1,
95 * MTX2)をこの順でロックさせ,別の低優先度タスク2つ(TASK3,
96 * TASK4)にそれぞれのロックを待たせた状態で,別の低優先度タスク
97 * (TASK1)からTASK2 をter_tskすると,TASK3とTASK4が中優先度になっ
98 * て待ち解除され,TASK3に切り換わることを確認する.
102 * TASK1: 高優先度タスク,メインタスク,最初から起動
106 * MTX1: ミューテックス(TA_CEILING属性,上限は中優先度)
107 * MTX2: ミューテックス(TA_CEILING属性,上限は中優先度)
112 * call(set_bit_func(bit_mutex))
115 * == TASK2-1(優先度:低)==
119 * 5: ter_tsk(TASK2) ... (A-1)
120 * 6: ref_mtx(MTX1, &rmtx)
121 * assert(rmtx.htskid == TSK_NONE)
122 * assert(rmtx.wtskid == TSK_NONE)
127 * == TASK2-2(優先度:低)==
129 * 10: tslp_tsk(10) -> E_TMOUT
130 * == TASK3-1(優先度:低)==
135 * 13: ter_tsk(TASK2) ... (A-2)
136 * 14: ref_mtx(MTX1, &rmtx)
137 * assert(rmtx.htskid == TASK3)
138 * assert(rmtx.wtskid == TSK_NONE)
139 * get_pri(TASK3, &tskpri)
140 * assert(tskpri == MID_PRIORITY)
145 * 17: chg_pri(TSK_SELF, LOW_PRIORITY)
146 * == TASK2-3(優先度:低)==
149 * == TASK3-2(優先度:低)==
152 * 21: ter_tsk(TASK2) ... (A-3)
154 * 22: ref_mtx(MTX1, &rmtx)
155 * assert(rmtx.htskid == TASK3)
156 * assert(rmtx.wtskid == TSK_NONE)
157 * get_pri(TASK3, &tskpri)
158 * assert(tskpri == MID_PRIORITY)
159 * 23: ext_tsk() -> noreturn
161 * 24: chg_pri(TSK_SELF, HIGH_PRIORITY)
165 * == TASK2-4(優先度:低)==
170 * 29: ter_tsk(TASK2) ... (A-4)
171 * 30: ref_mtx(MTX1, &rmtx)
172 * assert(rmtx.htskid == TSK_NONE)
173 * assert(rmtx.wtskid == TSK_NONE)
174 * ref_mtx(MTX2, &rmtx)
175 * assert(rmtx.htskid == TSK_NONE)
176 * assert(rmtx.wtskid == TSK_NONE)
183 * == TASK2-5(優先度:低)==
186 * 35: tslp_tsk(10) -> E_TMOUT
187 * == TASK3-3(優先度:低)==
189 * == TASK4-1(優先度:低)==
194 * 39: ter_tsk(TASK2) ... (A-5)
195 * 40: ref_mtx(MTX1, &rmtx)
196 * assert(rmtx.htskid == TASK3)
197 * assert(rmtx.wtskid == TSK_NONE)
198 * ref_mtx(MTX2, &rmtx)
199 * assert(rmtx.htskid == TASK4)
200 * assert(rmtx.wtskid == TSK_NONE)
201 * get_pri(TASK3, &tskpri)
202 * assert(tskpri == MID_PRIORITY)
203 * get_pri(TASK4, &tskpri)
204 * assert(tskpri == MID_PRIORITY)
205 * 41: chg_pri(TSK_SELF, LOW_PRIORITY)
207 * 42: ext_tsk() -> noreturn
209 * 43: ext_tsk() -> noreturn
214 * 45: chg_pri(TSK_SELF, LOW_PRIORITY)
215 * == TASK2-6(優先度:低)==
219 * == TASK3-4(優先度:低)==
221 * == TASK4-2(優先度:低)==
224 * 50: ter_tsk(TASK2) ... (A-6)
226 * 51: ref_mtx(MTX1, &rmtx)
227 * assert(rmtx.htskid == TASK3)
228 * assert(rmtx.wtskid == TSK_NONE)
229 * ref_mtx(MTX2, &rmtx)
230 * assert(rmtx.htskid == TASK4)
231 * assert(rmtx.wtskid == TSK_NONE)
232 * get_pri(TASK3, &tskpri)
233 * assert(tskpri == MID_PRIORITY)
234 * get_pri(TASK4, &tskpri)
235 * assert(tskpri == MID_PRIORITY)
236 * 52: ext_tsk() -> noreturn
238 * 53: ext_tsk() -> noreturn
244 #include <t_syslog.h>
245 #include "syssvc/logtask.h"
246 #include "kernel_cfg.h"
247 #include "test_lib.h"
248 #include "test_mutex7.h"
250 extern ER bit_mutex(void);
253 task1(intptr_t exinf)
259 set_bit_func(bit_mutex);
262 ercd = act_tsk(TASK2);
263 check_ercd(ercd, E_OK);
267 check_ercd(ercd, E_OK);
270 ercd = ter_tsk(TASK2);
271 check_ercd(ercd, E_OK);
274 ercd = ref_mtx(MTX1, &rmtx);
275 check_ercd(ercd, E_OK);
276 check_assert(rmtx.htskid == TSK_NONE);
277 check_assert(rmtx.wtskid == TSK_NONE);
280 ercd = act_tsk(TASK2);
281 check_ercd(ercd, E_OK);
283 ercd = act_tsk(TASK3);
284 check_ercd(ercd, E_OK);
288 check_ercd(ercd, E_OK);
291 ercd = ter_tsk(TASK2);
292 check_ercd(ercd, E_OK);
295 ercd = ref_mtx(MTX1, &rmtx);
296 check_ercd(ercd, E_OK);
297 check_assert(rmtx.htskid == TASK3);
298 check_assert(rmtx.wtskid == TSK_NONE);
300 ercd = get_pri(TASK3, &tskpri);
301 check_ercd(ercd, E_OK);
302 check_assert(tskpri == MID_PRIORITY);
305 ercd = ter_tsk(TASK3);
306 check_ercd(ercd, E_OK);
309 ercd = act_tsk(TASK2);
310 check_ercd(ercd, E_OK);
312 ercd = act_tsk(TASK3);
313 check_ercd(ercd, E_OK);
316 ercd = chg_pri(TSK_SELF, LOW_PRIORITY);
317 check_ercd(ercd, E_OK);
320 ercd = ter_tsk(TASK2);
321 check_ercd(ercd, E_OK);
324 ercd = chg_pri(TSK_SELF, HIGH_PRIORITY);
325 check_ercd(ercd, E_OK);
328 ercd = act_tsk(TASK2);
329 check_ercd(ercd, E_OK);
333 check_ercd(ercd, E_OK);
336 ercd = ter_tsk(TASK2);
337 check_ercd(ercd, E_OK);
340 ercd = ref_mtx(MTX1, &rmtx);
341 check_ercd(ercd, E_OK);
342 check_assert(rmtx.htskid == TSK_NONE);
343 check_assert(rmtx.wtskid == TSK_NONE);
345 ercd = ref_mtx(MTX2, &rmtx);
346 check_ercd(ercd, E_OK);
347 check_assert(rmtx.htskid == TSK_NONE);
348 check_assert(rmtx.wtskid == TSK_NONE);
353 ercd = act_tsk(TASK2);
354 check_ercd(ercd, E_OK);
356 ercd = act_tsk(TASK3);
357 check_ercd(ercd, E_OK);
359 ercd = act_tsk(TASK4);
360 check_ercd(ercd, E_OK);
364 check_ercd(ercd, E_OK);
367 ercd = ter_tsk(TASK2);
368 check_ercd(ercd, E_OK);
371 ercd = ref_mtx(MTX1, &rmtx);
372 check_ercd(ercd, E_OK);
373 check_assert(rmtx.htskid == TASK3);
374 check_assert(rmtx.wtskid == TSK_NONE);
376 ercd = ref_mtx(MTX2, &rmtx);
377 check_ercd(ercd, E_OK);
378 check_assert(rmtx.htskid == TASK4);
379 check_assert(rmtx.wtskid == TSK_NONE);
381 ercd = get_pri(TASK3, &tskpri);
382 check_ercd(ercd, E_OK);
383 check_assert(tskpri == MID_PRIORITY);
385 ercd = get_pri(TASK4, &tskpri);
386 check_ercd(ercd, E_OK);
387 check_assert(tskpri == MID_PRIORITY);
390 ercd = chg_pri(TSK_SELF, LOW_PRIORITY);
391 check_ercd(ercd, E_OK);
394 ercd = act_tsk(TASK2);
395 check_ercd(ercd, E_OK);
397 ercd = act_tsk(TASK3);
398 check_ercd(ercd, E_OK);
400 ercd = act_tsk(TASK4);
401 check_ercd(ercd, E_OK);
404 ercd = chg_pri(TSK_SELF, LOW_PRIORITY);
405 check_ercd(ercd, E_OK);
408 ercd = ter_tsk(TASK2);
409 check_ercd(ercd, E_OK);
416 static uint_t task2_count = 0;
419 task2(intptr_t exinf)
423 switch (++task2_count) {
426 ercd = loc_mtx(MTX1);
427 check_ercd(ercd, E_OK);
430 ercd = wup_tsk(TASK1);
431 check_ercd(ercd, E_OK);
437 ercd = loc_mtx(MTX1);
438 check_ercd(ercd, E_OK);
442 check_ercd(ercd, E_TMOUT);
445 ercd = wup_tsk(TASK1);
446 check_ercd(ercd, E_OK);
452 ercd = loc_mtx(MTX1);
453 check_ercd(ercd, E_OK);
457 check_ercd(ercd, E_OK);
463 ercd = loc_mtx(MTX1);
464 check_ercd(ercd, E_OK);
466 ercd = loc_mtx(MTX2);
467 check_ercd(ercd, E_OK);
470 ercd = wup_tsk(TASK1);
471 check_ercd(ercd, E_OK);
477 ercd = loc_mtx(MTX1);
478 check_ercd(ercd, E_OK);
480 ercd = loc_mtx(MTX2);
481 check_ercd(ercd, E_OK);
485 check_ercd(ercd, E_TMOUT);
488 ercd = wup_tsk(TASK1);
489 check_ercd(ercd, E_OK);
495 ercd = loc_mtx(MTX1);
496 check_ercd(ercd, E_OK);
498 ercd = loc_mtx(MTX2);
499 check_ercd(ercd, E_OK);
503 check_ercd(ercd, E_OK);
510 static uint_t task3_count = 0;
513 task3(intptr_t exinf)
519 switch (++task3_count) {
522 ercd = loc_mtx(MTX1);
523 check_ercd(ercd, E_OK);
529 ercd = loc_mtx(MTX1);
530 check_ercd(ercd, E_OK);
533 ercd = ref_mtx(MTX1, &rmtx);
534 check_ercd(ercd, E_OK);
535 check_assert(rmtx.htskid == TASK3);
536 check_assert(rmtx.wtskid == TSK_NONE);
538 ercd = get_pri(TASK3, &tskpri);
539 check_ercd(ercd, E_OK);
540 check_assert(tskpri == MID_PRIORITY);
549 ercd = loc_mtx(MTX1);
550 check_ercd(ercd, E_OK);
559 ercd = loc_mtx(MTX1);
560 check_ercd(ercd, E_OK);
563 ercd = ref_mtx(MTX1, &rmtx);
564 check_ercd(ercd, E_OK);
565 check_assert(rmtx.htskid == TASK3);
566 check_assert(rmtx.wtskid == TSK_NONE);
568 ercd = ref_mtx(MTX2, &rmtx);
569 check_ercd(ercd, E_OK);
570 check_assert(rmtx.htskid == TASK4);
571 check_assert(rmtx.wtskid == TSK_NONE);
573 ercd = get_pri(TASK3, &tskpri);
574 check_ercd(ercd, E_OK);
575 check_assert(tskpri == MID_PRIORITY);
577 ercd = get_pri(TASK4, &tskpri);
578 check_ercd(ercd, E_OK);
579 check_assert(tskpri == MID_PRIORITY);
589 static uint_t task4_count = 0;
592 task4(intptr_t exinf)
596 switch (++task4_count) {
599 ercd = loc_mtx(MTX2);
600 check_ercd(ercd, E_OK);
609 ercd = loc_mtx(MTX2);
610 check_ercd(ercd, E_OK);