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_mutex6.c 1696 2010-01-01 16:01:25Z ertl-hiro $
45 * 優先度上限ミューテックスに対して,タスクの終了時,タスクの優先順位
46 * の回転時のミューテックス関連の処理を網羅的にテストする.
50 * (A) タスクの終了時(ext_tsk)
51 * (A-1) ロックしていたミューテックス(1つ)がロック解除されること.
52 * (A-2) ロックしていたミューテックス(1つ)がロック解除され,ロッ
53 * クを待っていたタスクがそれをロックし,優先度が変化し,待
55 * (A-3) ロックしていたミューテックス(複数)がすべてロック解除さ
57 * (A-4) ロックしていたミューテックス(複数)がロック解除され,ロッ
58 * クを待っていたタスク(複数)がそれをロックし,優先度が変
59 * 化し,待ち解除されること.その時に,後でミューテックスを
60 * ロックしたタスク(先にロックしていたミューテックスを待っ
61 * ていたタスク)の方が,優先順位が高くなること.
62 * (B) タスクの優先順位の回転(rot_rdq)
63 * (B-1) TPRI_SELFを指定した時に,タスクのベース優先度の優先順位が
65 * (B-2) TPRI_SELFを指定した時に,タスクの現在優先度の優先順位が回
71 * 低優先度タスク(TASK2)にミューテックス(MTX1)をロックさせ,
72 * ext_tskすると,ロックが解除されることを確認する.
74 * 低優先度タスク(TASK2)に高優先度上限ミューテックス(MTX1)をロッ
75 * クさせ,別の低優先度タスク(TASK3)にMTX1を待たせた状態で,
76 * TASK2 がext_tskすると,TASK3が高優先度になって待ち解除されるこ
79 * 低優先度タスク(TASK2)にミューテックスを2つ(MTX1,MTX2)ロッ
80 * クさせ,ext_tskすると,両方のロックが解除されることを確認する.
82 * 低優先度タスク(TASK2)に高優先度上限ミューテックス2つ(MTX1,
83 * MTX2)をこの順でロックさせ,別の低優先度タスク2つ(TASK3,
84 * TASK4)にそれぞれのロックを待たせた状態で,TASK2をext_tskすると,
85 * TASK3とTASK4が高優先度になって待ち解除されることを確認する.ま
86 * た,先にロックしていたミューテックス(MTX1)を待っていたタスク
87 * (TASK3)が,TASK4よりも優先順位が高くなることを確認する.
89 * 低優先度タスクが3つ(TASK2,TASK3,TASK4)が実行できる状態の時
90 * に,1つの低優先度タスク(TASK2)に高優先度上限ミューテックスを
91 * ロックさせ,rot_rdq(TPRI_SELF)すると,残りの2つの低優先度タスク
94 * 上と同じ状況で,高優先度タスクの優先順位が回転しないことを確認
99 * TASK1: 低優先度タスク,メインタスク,最初から起動
103 * MTX1: ミューテックス(TA_CEILING属性,上限は高優先度)
104 * MTX2: ミューテックス(TA_CEILING属性,上限は高優先度)
109 * call(set_bit_func(bit_mutex))
111 * 2: rot_rdq(TPRI_SELF)
113 * == TASK2-1(優先度:低)1回め ==
115 * // 高:TASK2,低:TASK1,MTX1:TASK2
116 * 4: ext_tsk() -> noreturn ... (A-1)
119 * 5: ref_mtx(MTX1, &rmtx)
120 * assert(rmtx.htskid == TSK_NONE)
121 * assert(rmtx.wtskid == TSK_NONE)
125 * 7: rot_rdq(TPRI_SELF)
126 * // 低:TASK2→TASK3→TASK1
127 * == TASK2-2(優先度:低)2回め ==
129 * // 高:TASK2,低:TASK3→TASK1,MTX1:TASK2
131 * // 低:TASK3→TASK1,MTX1:TASK2
134 * // 低:TASK1,MTX1:TASK2→TASK3
137 * // 高:TASK2,低:TASK1,MTX1:TASK2→TASK3
139 * 12: ext_tsk() -> noreturn ... (A-2)
140 * // 高:TASK3,低:TASK1,MTX1:TASK3
142 * 13: ref_mtx(MTX1, &rmtx)
143 * assert(rmtx.htskid == TASK3)
144 * assert(rmtx.wtskid == TSK_NONE)
145 * get_pri(TPRI_SELF, &tskpri)
146 * assert(tskpri == HIGH_PRIORITY)
153 * 15: rot_rdq(TPRI_SELF)
155 * == TASK2-3(優先度:低)3回め ==
158 * // 高:TASK2,低:TASK1,MTX1:TASK2,MTX2:TASK2
159 * 17: ext_tsk() -> noreturn ... (A-3)
162 * 18: ref_mtx(MTX1, &rmtx)
163 * assert(rmtx.htskid == TSK_NONE)
164 * assert(rmtx.wtskid == TSK_NONE)
165 * ref_mtx(MTX2, &rmtx)
166 * assert(rmtx.htskid == TSK_NONE)
167 * assert(rmtx.wtskid == TSK_NONE)
172 * 20: rot_rdq(TPRI_SELF)
173 * // 低:TASK2→TASK3→TASK4→TASK1
174 * == TASK2-4(優先度:低)4回め ==
177 * // 高:TASK2,低:TASK3→TASK4→TASK1,MTX1:TASK2,MTX2:TASK2
178 * 22: chg_pri(TASK1, HIGH_PRIORITY)
179 * // 高:TASK2→TASK1,低:TASK3→TASK4,MTX1:TASK2,MTX2:TASK2
180 * 23: rot_rdq(TPRI_SELF) ... (B-1)(B-2)
181 * // 高:TASK2→TASK1,低:TASK4→TASK3,MTX1:TASK2,MTX2:TASK2
183 * // 高:TASK1,低:TASK4→TASK3,MTX1:TASK2,MTX2:TASK2
185 * 25: chg_pri(TSK_SELF, TPRI_INI)
186 * // 低:TASK4→TASK3→TASK1,MTX1:TASK2,MTX2:TASK2
189 * // 低:TASK3→TASK1,MTX1:TASK2,MTX2:TASK2→TASK4
192 * // 低:TASK1,MTX1:TASK2→TASK3,MTX2:TASK2→TASK4
195 * // 高:TASK2,低:TASK1,MTX1:TASK2→TASK3,MTX2:TASK2→TASK4
197 * 29: ext_tsk() -> noreturn ... (A-4)
198 * // 高:TASK3→TASK4,低:TASK1,MTX1:TASK3,MTX2:TASK4
200 * 30: ref_mtx(MTX1, &rmtx)
201 * assert(rmtx.htskid == TASK3)
202 * assert(rmtx.wtskid == TSK_NONE)
203 * ref_mtx(MTX2, &rmtx)
204 * assert(rmtx.htskid == TASK4)
205 * assert(rmtx.wtskid == TSK_NONE)
206 * get_pri(TPRI_SELF, &tskpri)
207 * assert(tskpri == HIGH_PRIORITY)
208 * ext_tsk() -> noreturn
209 * // 高:TASK4,低:TASK1,MTX2:TASK4
211 * 31: get_pri(TPRI_SELF, &tskpri)
212 * assert(tskpri == HIGH_PRIORITY)
213 * ext_tsk() -> noreturn
220 #include <t_syslog.h>
221 #include "syssvc/logtask.h"
222 #include "kernel_cfg.h"
223 #include "test_lib.h"
224 #include "test_mutex6.h"
226 extern ER bit_mutex(void);
229 task1(intptr_t exinf)
234 set_bit_func(bit_mutex);
237 ercd = act_tsk(TASK2);
238 check_ercd(ercd, E_OK);
241 ercd = rot_rdq(TPRI_SELF);
242 check_ercd(ercd, E_OK);
245 ercd = ref_mtx(MTX1, &rmtx);
246 check_ercd(ercd, E_OK);
247 check_assert(rmtx.htskid == TSK_NONE);
248 check_assert(rmtx.wtskid == TSK_NONE);
251 ercd = act_tsk(TASK2);
252 check_ercd(ercd, E_OK);
254 ercd = act_tsk(TASK3);
255 check_ercd(ercd, E_OK);
258 ercd = rot_rdq(TPRI_SELF);
259 check_ercd(ercd, E_OK);
262 ercd = wup_tsk(TASK2);
263 check_ercd(ercd, E_OK);
266 ercd = act_tsk(TASK2);
267 check_ercd(ercd, E_OK);
270 ercd = rot_rdq(TPRI_SELF);
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);
279 ercd = ref_mtx(MTX2, &rmtx);
280 check_ercd(ercd, E_OK);
281 check_assert(rmtx.htskid == TSK_NONE);
282 check_assert(rmtx.wtskid == TSK_NONE);
285 ercd = act_tsk(TASK2);
286 check_ercd(ercd, E_OK);
288 ercd = wup_tsk(TASK3);
289 check_ercd(ercd, E_OK);
291 ercd = act_tsk(TASK4);
292 check_ercd(ercd, E_OK);
295 ercd = rot_rdq(TPRI_SELF);
296 check_ercd(ercd, E_OK);
299 ercd = chg_pri(TSK_SELF, TPRI_INI);
300 check_ercd(ercd, E_OK);
303 ercd = wup_tsk(TASK2);
304 check_ercd(ercd, E_OK);
311 static uint_t task2_count = 0;
314 task2(intptr_t exinf)
318 switch (++task2_count) {
321 ercd = loc_mtx(MTX1);
322 check_ercd(ercd, E_OK);
331 ercd = loc_mtx(MTX1);
332 check_ercd(ercd, E_OK);
336 check_ercd(ercd, E_OK);
345 ercd = loc_mtx(MTX1);
346 check_ercd(ercd, E_OK);
348 ercd = loc_mtx(MTX2);
349 check_ercd(ercd, E_OK);
358 ercd = loc_mtx(MTX1);
359 check_ercd(ercd, E_OK);
361 ercd = loc_mtx(MTX2);
362 check_ercd(ercd, E_OK);
365 ercd = chg_pri(TASK1, HIGH_PRIORITY);
366 check_ercd(ercd, E_OK);
369 ercd = rot_rdq(TPRI_SELF);
370 check_ercd(ercd, E_OK);
374 check_ercd(ercd, E_OK);
385 task3(intptr_t exinf)
392 ercd = loc_mtx(MTX1);
393 check_ercd(ercd, E_OK);
396 ercd = ref_mtx(MTX1, &rmtx);
397 check_ercd(ercd, E_OK);
398 check_assert(rmtx.htskid == TASK3);
399 check_assert(rmtx.wtskid == TSK_NONE);
401 ercd = get_pri(TPRI_SELF, &tskpri);
402 check_ercd(ercd, E_OK);
403 check_assert(tskpri == HIGH_PRIORITY);
405 ercd = unl_mtx(MTX1);
406 check_ercd(ercd, E_OK);
409 check_ercd(ercd, E_OK);
412 ercd = loc_mtx(MTX1);
413 check_ercd(ercd, E_OK);
416 ercd = ref_mtx(MTX1, &rmtx);
417 check_ercd(ercd, E_OK);
418 check_assert(rmtx.htskid == TASK3);
419 check_assert(rmtx.wtskid == TSK_NONE);
421 ercd = ref_mtx(MTX2, &rmtx);
422 check_ercd(ercd, E_OK);
423 check_assert(rmtx.htskid == TASK4);
424 check_assert(rmtx.wtskid == TSK_NONE);
426 ercd = get_pri(TPRI_SELF, &tskpri);
427 check_ercd(ercd, E_OK);
428 check_assert(tskpri == HIGH_PRIORITY);
436 task4(intptr_t exinf)
442 ercd = loc_mtx(MTX2);
443 check_ercd(ercd, E_OK);
446 ercd = get_pri(TPRI_SELF, &tskpri);
447 check_ercd(ercd, E_OK);
448 check_assert(tskpri == HIGH_PRIORITY);