3 * Toyohashi Open Platform for Embedded Real-Time Systems
5 * Copyright (C) 2007,2008 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_mutex3.c 1696 2010-01-01 16:01:25Z ertl-hiro $
45 * 優先度上限ミューテックスを,ロックする処理とロック解除する処理を一
46 * 通りテストする.ref_tskによるベース優先度と現在優先度の参照処理のテ
51 * (A) ミューテックスのロック処理(loc_mtx)
52 * (A-1) ロックされていない場合には,すぐにロックできること
53 * (A-2) 多重にロックしようとすると,E_ILUSEエラーになること
54 * (A-3) ロックされている場合には,優先度順で待ち状態になること
55 * (B) ミューテックスのロック解除処理(unl_mtx)
56 * (B-1) 他タスクがロックしているミューテックスを解放しようとすると
58 * (B-2) 待ちタスクがないと,単にロック解除すること
59 * (B-3) 待ちタスクにロックを渡すこと
60 * (B-4) 待ちタスクにロックを渡して,ディスパッチが起こること
61 * (C) ミューテックスのロック処理(ploc_mtx)
62 * (C-1) ロックされている場合には,すぐにE_TMOUTエラーになること
63 * (D) ミューテックスのロック処理(tloc_mtx)
64 * (D-1) ロックされている場合には,タイムアウト付きの待ち状態にな
67 * (E-1) タスクを終了すると,ミューテックスをロック解除すること
71 * TASK1: 低優先度タスク,メインタスク,最初から起動
74 * MTX1: ミューテックス(TA_CEILING属性,上限は高優先度)
79 * call(set_bit_func(bit_mutex))
80 * 1: ref_mtx(MTX1, &rmtx)
81 * assert(rmtx.htskid == TSK_NONE)
82 * assert(rmtx.wtskid == TSK_NONE)
83 * loc_mtx(MTX1) ... (A-1)
84 * 2: ref_tsk(TASK1, &rtsk)
85 * assert(rtsk.tskpri == HIGH_PRIORITY)
86 * assert(rtsk.tskbpri == LOW_PRIORITY)
87 * loc_mtx(MTX1) -> E_ILUSE ... (A-2)
88 * 3: ref_mtx(MTX1, &rmtx)
89 * assert(rmtx.htskid == TASK1)
90 * assert(rmtx.wtskid == TSK_NONE)
92 * 4: tslp_tsk(10) -> E_TMOUT
94 * 5: ploc_mtx(MTX1) -> E_TMOUT ... (C-1)
95 * loc_mtx(MTX1) ... (A-3)
97 * 6: ref_mtx(MTX1, &rmtx)
98 * assert(rmtx.htskid == TASK1)
99 * assert(rmtx.wtskid == TASK2)
101 * 7: tslp_tsk(10) -> E_TMOUT
103 * 8: unl_mtx(MTX1) -> E_ILUSE ... (B-1)
104 * 9: loc_mtx(MTX1) ... (A-3)
106 * 10: ref_mtx(MTX1, &rmtx)
107 * assert(rmtx.htskid == TASK1)
108 * assert(rmtx.wtskid == TASK3)
110 * unl_mtx(MTX1) ... (B-3)
111 * 11: ref_tsk(TASK1, &rtsk)
112 * assert(rtsk.tskpri == LOW_PRIORITY)
113 * assert(rtsk.tskbpri == LOW_PRIORITY)
114 * ref_mtx(MTX1, &rmtx)
115 * assert(rmtx.htskid == TASK3)
116 * assert(rmtx.wtskid == TASK2)
119 * 12: ext_tsk() -> noreturn ... (E-1)
121 * 13: ref_tsk(TASK2, &rtsk)
122 * assert(rtsk.tskpri == HIGH_PRIORITY)
123 * assert(rtsk.tskbpri == MID_PRIORITY)
124 * unl_mtx(MTX1) ... (B-4)
128 * 16: ref_mtx(MTX1, &rmtx)
129 * assert(rmtx.htskid == TASK2)
130 * assert(rmtx.wtskid == TSK_NONE)
131 * tloc_mtx(MTX1, 10) -> E_TMOUT ... (D-1)
134 * 18: unl_mtx(MTX1) ... (B-2)
135 * 19: ext_tsk() -> noreturn
141 #include <t_syslog.h>
142 #include "syssvc/logtask.h"
143 #include "kernel_cfg.h"
144 #include "test_lib.h"
145 #include "test_mutex.h"
147 extern ER bit_mutex(void);
150 task1(intptr_t exinf)
156 set_bit_func(bit_mutex);
159 ercd = ref_mtx(MTX1, &rmtx);
160 check_ercd(ercd, E_OK);
161 check_assert(rmtx.htskid == TSK_NONE);
162 check_assert(rmtx.wtskid == TSK_NONE);
164 ercd = loc_mtx(MTX1);
165 check_ercd(ercd, E_OK);
168 ercd = ref_tsk(TASK1, &rtsk);
169 check_ercd(ercd, E_OK);
170 check_assert(rtsk.tskpri == HIGH_PRIORITY);
171 check_assert(rtsk.tskbpri == LOW_PRIORITY);
173 ercd = loc_mtx(MTX1);
174 check_ercd(ercd, E_ILUSE);
177 ercd = ref_mtx(MTX1, &rmtx);
178 check_ercd(ercd, E_OK);
179 check_assert(rmtx.htskid == TASK1);
180 check_assert(rmtx.wtskid == TSK_NONE);
182 ercd = act_tsk(TASK2);
183 check_ercd(ercd, E_OK);
187 check_ercd(ercd, E_TMOUT);
190 ercd = ref_mtx(MTX1, &rmtx);
191 check_ercd(ercd, E_OK);
192 check_assert(rmtx.htskid == TASK1);
193 check_assert(rmtx.wtskid == TASK2);
195 ercd = act_tsk(TASK3);
196 check_ercd(ercd, E_OK);
200 check_ercd(ercd, E_TMOUT);
203 ercd = ref_mtx(MTX1, &rmtx);
204 check_ercd(ercd, E_OK);
205 check_assert(rmtx.htskid == TASK1);
206 check_assert(rmtx.wtskid == TASK3);
209 check_ercd(ercd, E_OK);
211 ercd = unl_mtx(MTX1);
212 check_ercd(ercd, E_OK);
215 ercd = ref_tsk(TASK1, &rtsk);
216 check_ercd(ercd, E_OK);
217 check_assert(rtsk.tskpri == LOW_PRIORITY);
218 check_assert(rtsk.tskbpri == LOW_PRIORITY);
220 ercd = ref_mtx(MTX1, &rmtx);
221 check_ercd(ercd, E_OK);
222 check_assert(rmtx.htskid == TASK3);
223 check_assert(rmtx.wtskid == TASK2);
226 check_ercd(ercd, E_OK);
229 ercd = ref_mtx(MTX1, &rmtx);
230 check_ercd(ercd, E_OK);
231 check_assert(rmtx.htskid == TASK2);
232 check_assert(rmtx.wtskid == TSK_NONE);
234 ercd = tloc_mtx(MTX1, 10);
235 check_ercd(ercd, E_TMOUT);
238 ercd = wup_tsk(TASK2);
239 check_ercd(ercd, E_OK);
247 task2(intptr_t exinf)
253 ercd = ploc_mtx(MTX1);
254 check_ercd(ercd, E_TMOUT);
256 ercd = loc_mtx(MTX1);
257 check_ercd(ercd, E_OK);
260 ercd = ref_tsk(TASK2, &rtsk);
261 check_ercd(ercd, E_OK);
262 check_assert(rtsk.tskpri == HIGH_PRIORITY);
263 check_assert(rtsk.tskbpri == MID_PRIORITY);
265 ercd = unl_mtx(MTX1);
266 check_ercd(ercd, E_OK);
269 ercd = loc_mtx(MTX1);
270 check_ercd(ercd, E_OK);
274 check_ercd(ercd, E_OK);
277 ercd = unl_mtx(MTX1);
278 check_ercd(ercd, E_OK);
287 task3(intptr_t exinf)
292 ercd = unl_mtx(MTX1);
293 check_ercd(ercd, E_ILUSE);
296 ercd = loc_mtx(MTX1);
297 check_ercd(ercd, E_OK);