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_sem1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
45 * sig_sem,wai_sem,CRE_SEMを網羅的にテストする.
46 * ただし,CRE_SEMのエラーのテストは除く.
50 * (A) sig_semの静的エラーのテスト
51 * (A-1) 非タスクコンテキストからの呼出し
52 * (A-2) CPUロック状態からの呼出し
53 * (A-3) semidが不正(小さすぎる)
54 * (A-4) semidが不正(大きすぎる)
55 * (B) sig_semによりセマフォ待ち状態のタスクが待ち解除される
56 * (B-1) 待ち解除されたタスクに切り換わる
57 * (B-2) ディスパッチ保留状態で,切り換わらない
58 * (B-3) 待ち解除されたタスクが強制待ち状態で,切り換わらない
59 * (B-4) 待ち解除されたタスクが優先度が低く,切り換わらない
60 * (C) sig_semによりセマフォの資源数が1増える
61 * (C-1) セマフォの資源数が0から1になる
62 * (C-2) セマフォの資源数が1から2になる
63 * (D) sig_semがE_QOVRエラーとなる
64 * (D-1) セマフォの最大資源数が1の時
65 * (D-2) セマフォの最大資源数が2の時
66 * (E) wai_semの静的エラーのテスト
67 * (E-1) 非タスクコンテキストからの呼出し
68 * (E-2) CPUロック状態からの呼出し
69 * (E-3) ディスパッチ禁止状態からの呼出し
70 * (E-4) 割込み優先度マスク全解除でない状態からの呼出し
71 * (E-5) semidが不正(小さすぎる)
72 * (E-6) semidが不正(大きすぎる)
73 * (F) wai_semによりセマフォの資源数が1減る
74 * (F-1) セマフォの資源数が1から0になる
75 * (F-2) セマフォの資源数が2から1になる
76 * (G) wai_semによりセマフォ待ち状態になる
77 * (G-1) TA_TNULL属性のセマフォで,待っているタスクがなかった場合
78 * (G-2) TA_TNULL属性のセマフォで,待っているタスクがあった場合
79 * (G-3) TA_TPRI属性のセマフォで,待っているタスクがなかった場合
80 * (G-4) TA_TPRI属性のセマフォで,優先度が高いタスクが待っている場合
81 * (G-5) TA_TPRI属性のセマフォで,優先度が同じタスクが待っている場合
82 * (G-6) TA_TPRI属性のセマフォで,優先度が低いタスクが待っている場合
83 * (H) セマフォ待ち状態が強制解除される
84 * (I) セマフォ待ち状態の間にセマフォが初期化される
85 * (J) セマフォの資源数の初期値が正しく設定される
86 * (J-1) セマフォの資源数の初期値が0
87 * (J-2) セマフォの資源数の初期値が1
88 * (J-3) セマフォの資源数の初期値が2
92 * TASK1: 中優先度タスク,TA_ACT属性
98 * SEM1: TA_NULL属性,初期資源数1,最大資源数1
99 * SEM2: TA_NULL属性,初期資源数2,最大資源数2
100 * SEM3: TA_TPRI属性,初期資源数0,最大資源数1
105 * 1: ref_sem(SEM1, &rsem)
106 * assert(rsem.wtskid == TSK_NONE)
107 * assert(rsem.semcnt == 1) ... (J-2)
108 * ref_sem(SEM2, &rsem)
109 * assert(rsem.wtskid == TSK_NONE)
110 * assert(rsem.semcnt == 2) ... (J-3)
111 * ref_sem(SEM3, &rsem)
112 * assert(rsem.wtskid == TSK_NONE)
113 * assert(rsem.semcnt == 0) ... (J-1)
115 * sig_sem(SEM1) -> E_CTX ... (A-2)
116 * wai_sem(SEM1) -> E_CTX ... (E-2)
119 * wai_sem(SEM1) -> E_CTX ... (E-3)
121 * chg_ipm(TMAX_INTPRI)
122 * wai_sem(SEM1) -> E_CTX ... (E-4)
123 * chg_ipm(TIPM_ENAALL)
124 * sig_sem(0) -> E_ID ... (A-3)
125 * wai_sem(0) -> E_ID ... (E-5)
126 * sig_sem(TNUM_SEMID+1) -> E_ID ... (A-4)
127 * wai_sem(TNUM_SEMID+1) -> E_ID ... (E-6)
131 * 5: wai_sem(SEM1) ... (F-1)
132 * 6: ref_sem(SEM1, &rsem)
133 * assert(rsem.wtskid == TSK_NONE)
134 * assert(rsem.semcnt == 0)
135 * 7: sta_alm(ALM1, 10)
136 * 8: wai_sem(SEM1) ... (G-1)
138 * 9: sig_sem(SEM1) -> E_CTX ... (A-1)
139 * wai_sem(SEM1) -> E_CTX ... (E-1)
140 * 10: iwup_tsk(TASK1)
145 * 13: wai_sem(SEM1) ... (G-2)
147 * 14: ref_sem(SEM1, &rsem)
148 * assert(rsem.wtskid == TASK3)
149 * assert(rsem.semcnt == 0)
150 * 15: sig_sem(SEM1) ... (B-4)
151 * 16: sig_sem(SEM1) ... (B-1)
153 * 17: wai_sem(SEM1) ... (G-1)
156 * 19: sig_sem(SEM1) ... (B-2)
159 * 21: wai_sem(SEM1) ... (G-1)
162 * 23: sig_sem(SEM1) ... (B-3)
163 * 24: sig_sem(SEM1) ... (C-1)
164 * 25: sig_sem(SEM1) -> E_QOVR ... (D-1)
165 * 26: ref_sem(SEM1, &rsem)
166 * assert(rsem.wtskid == TSK_NONE)
167 * assert(rsem.semcnt == 1)
170 * 28: wai_sem(SEM2) ... (F-2)
171 * 29: ref_sem(SEM2, &rsem)
172 * assert(rsem.wtskid == TSK_NONE)
173 * assert(rsem.semcnt == 1)
174 * 30: wai_sem(SEM2) ... (F-1)
175 * 31: wai_sem(SEM2) ... (G-1)
177 * 32: sig_sem(SEM2) ... (B-1)
179 * 33: wai_sem(SEM3) ... (G-3)
181 * 34: sig_sem(SEM2) ... (C-1)
182 * 35: sig_sem(SEM2) ... (C-2)
183 * 36: ref_sem(SEM2, &rsem)
184 * assert(rsem.wtskid == TSK_NONE)
185 * assert(rsem.semcnt == 2)
186 * 37: sig_sem(SEM2) -> E_QOVR ... (D-2)
187 * 38: ref_sem(SEM2, &rsem)
188 * assert(rsem.wtskid == TSK_NONE)
189 * assert(rsem.semcnt == 2)
191 * 40: tslp_tsk(10) -> E_TMOUT
193 * 41: wai_sem(SEM3) ... (G-4)
197 * 44: rot_rdq(TPRI_SELF)
199 * 45: wai_sem(SEM3) ... (G-6)
201 * 46: wai_sem(SEM3) ... (G-5)
203 * 47: sig_sem(SEM3) ... (B-1)
206 * wai_sem(SEM1) -> E_RLWAI
208 * 49: sig_sem(SEM3) ... (B-4)
209 * 50: tslp_tsk(10) -> E_TMOUT
211 * 51: ext_tsk() -> noreturn
213 * 52: sig_sem(SEM3) ... (B-4)
214 * 53: tslp_tsk(10) -> E_TMOUT
216 * 54: ext_tsk() -> noreturn
218 * 55: sig_sem(SEM3) ... (B-4)
219 * 56: tslp_tsk(10) -> E_TMOUT
221 * 57: ext_tsk() -> noreturn
223 * 58: rel_wai(TASK2) ... (H)
225 * 59: wai_sem(SEM1) -> E_DLT
227 * 60: ini_sem(SEM1) ... (I)
229 * 61: ext_tsk() -> noreturn
235 #include <test_lib.h>
236 #include <t_syslog.h>
237 #include "kernel_cfg.h"
238 #include "test_sem1.h"
241 alarm1_handler(intptr_t exinf)
246 ercd = sig_sem(SEM1);
247 check_ercd(ercd, E_CTX);
249 ercd = wai_sem(SEM1);
250 check_ercd(ercd, E_CTX);
253 ercd = iwup_tsk(TASK1);
254 check_ercd(ercd, E_OK);
263 task1(intptr_t exinf)
269 ercd = ref_sem(SEM1, &rsem);
270 check_ercd(ercd, E_OK);
271 check_assert(rsem.wtskid == TSK_NONE);
272 check_assert(rsem.semcnt == 1);
274 ercd = ref_sem(SEM2, &rsem);
275 check_ercd(ercd, E_OK);
276 check_assert(rsem.wtskid == TSK_NONE);
277 check_assert(rsem.semcnt == 2);
279 ercd = ref_sem(SEM3, &rsem);
280 check_ercd(ercd, E_OK);
281 check_assert(rsem.wtskid == TSK_NONE);
282 check_assert(rsem.semcnt == 0);
286 check_ercd(ercd, E_OK);
288 ercd = sig_sem(SEM1);
289 check_ercd(ercd, E_CTX);
291 ercd = wai_sem(SEM1);
292 check_ercd(ercd, E_CTX);
295 check_ercd(ercd, E_OK);
298 check_ercd(ercd, E_OK);
300 ercd = wai_sem(SEM1);
301 check_ercd(ercd, E_CTX);
304 check_ercd(ercd, E_OK);
306 ercd = chg_ipm(TMAX_INTPRI);
307 check_ercd(ercd, E_OK);
309 ercd = wai_sem(SEM1);
310 check_ercd(ercd, E_CTX);
312 ercd = chg_ipm(TIPM_ENAALL);
313 check_ercd(ercd, E_OK);
316 check_ercd(ercd, E_ID);
319 check_ercd(ercd, E_ID);
321 ercd = sig_sem(TNUM_SEMID+1);
322 check_ercd(ercd, E_ID);
324 ercd = wai_sem(TNUM_SEMID+1);
325 check_ercd(ercd, E_ID);
328 ercd = act_tsk(TASK3);
329 check_ercd(ercd, E_OK);
333 check_ercd(ercd, E_OK);
336 ercd = act_tsk(TASK2);
337 check_ercd(ercd, E_OK);
340 ercd = ref_sem(SEM1, &rsem);
341 check_ercd(ercd, E_OK);
342 check_assert(rsem.wtskid == TASK3);
343 check_assert(rsem.semcnt == 0);
346 ercd = sig_sem(SEM1);
347 check_ercd(ercd, E_OK);
350 ercd = sig_sem(SEM1);
351 check_ercd(ercd, E_OK);
355 check_ercd(ercd, E_OK);
358 ercd = sig_sem(SEM1);
359 check_ercd(ercd, E_OK);
363 check_ercd(ercd, E_OK);
366 ercd = sus_tsk(TASK2);
367 check_ercd(ercd, E_OK);
370 ercd = sig_sem(SEM1);
371 check_ercd(ercd, E_OK);
374 ercd = sig_sem(SEM1);
375 check_ercd(ercd, E_OK);
378 ercd = sig_sem(SEM1);
379 check_ercd(ercd, E_QOVR);
382 ercd = ref_sem(SEM1, &rsem);
383 check_ercd(ercd, E_OK);
384 check_assert(rsem.wtskid == TSK_NONE);
385 check_assert(rsem.semcnt == 1);
388 ercd = rsm_tsk(TASK2);
389 check_ercd(ercd, E_OK);
392 ercd = sig_sem(SEM2);
393 check_ercd(ercd, E_OK);
396 ercd = sig_sem(SEM2);
397 check_ercd(ercd, E_OK);
400 ercd = sig_sem(SEM2);
401 check_ercd(ercd, E_OK);
404 ercd = ref_sem(SEM2, &rsem);
405 check_ercd(ercd, E_OK);
406 check_assert(rsem.wtskid == TSK_NONE);
407 check_assert(rsem.semcnt == 2);
410 ercd = sig_sem(SEM2);
411 check_ercd(ercd, E_QOVR);
414 ercd = ref_sem(SEM2, &rsem);
415 check_ercd(ercd, E_OK);
416 check_assert(rsem.wtskid == TSK_NONE);
417 check_assert(rsem.semcnt == 2);
423 check_ercd(ercd, E_TMOUT);
426 ercd = act_tsk(TASK4);
427 check_ercd(ercd, E_OK);
430 ercd = act_tsk(TASK5);
431 check_ercd(ercd, E_OK);
434 ercd = rot_rdq(TPRI_SELF);
435 check_ercd(ercd, E_OK);
438 ercd = sig_sem(SEM3);
439 check_ercd(ercd, E_OK);
442 ercd = sig_sem(SEM3);
443 check_ercd(ercd, E_OK);
447 check_ercd(ercd, E_TMOUT);
450 ercd = sig_sem(SEM3);
451 check_ercd(ercd, E_OK);
455 check_ercd(ercd, E_TMOUT);
458 ercd = sig_sem(SEM3);
459 check_ercd(ercd, E_OK);
463 check_ercd(ercd, E_TMOUT);
466 ercd = rel_wai(TASK2);
467 check_ercd(ercd, E_OK);
470 ercd = ini_sem(SEM1);
471 check_ercd(ercd, E_OK);
479 task2(intptr_t exinf)
485 ercd = wai_sem(SEM1);
486 check_ercd(ercd, E_OK);
489 ercd = wai_sem(SEM1);
490 check_ercd(ercd, E_OK);
493 ercd = wai_sem(SEM1);
494 check_ercd(ercd, E_OK);
497 ercd = wai_sem(SEM2);
498 check_ercd(ercd, E_OK);
501 ercd = ref_sem(SEM2, &rsem);
502 check_ercd(ercd, E_OK);
503 check_assert(rsem.wtskid == TSK_NONE);
504 check_assert(rsem.semcnt == 1);
507 ercd = wai_sem(SEM2);
508 check_ercd(ercd, E_OK);
511 ercd = wai_sem(SEM2);
512 check_ercd(ercd, E_OK);
515 ercd = wai_sem(SEM3);
516 check_ercd(ercd, E_OK);
519 ercd = wai_sem(SEM1);
520 check_ercd(ercd, E_OK);
522 ercd = wai_sem(SEM1);
523 check_ercd(ercd, E_RLWAI);
526 ercd = wai_sem(SEM1);
527 check_ercd(ercd, E_DLT);
536 task3(intptr_t exinf)
542 ercd = wai_sem(SEM1);
543 check_ercd(ercd, E_OK);
546 ercd = ref_sem(SEM1, &rsem);
547 check_ercd(ercd, E_OK);
548 check_assert(rsem.wtskid == TSK_NONE);
549 check_assert(rsem.semcnt == 0);
552 ercd = sta_alm(ALM1, 10);
553 check_ercd(ercd, E_OK);
556 ercd = wai_sem(SEM1);
557 check_ercd(ercd, E_OK);
560 ercd = wai_sem(SEM3);
561 check_ercd(ercd, E_OK);
570 task4(intptr_t exinf)
575 ercd = wai_sem(SEM3);
576 check_ercd(ercd, E_OK);
585 task5(intptr_t exinf)
590 ercd = wai_sem(SEM3);
591 check_ercd(ercd, E_OK);