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_sem2.c 1577 2009-05-31 14:30:51Z ertl-hiro $
45 * isig_semを,sig_semとの違いを中心にテストする.
46 * pol_sem,twai_semを,wai_semとの違いを中心にテストする.
50 * (A) isig_semの静的エラーのテスト
51 * (A-1) タスクコンテキストからの呼出し
52 * (A-2) CPUロック状態からの呼出し
53 * (B) isig_semによりセマフォ待ち状態のタスクが待ち解除される
54 * (B-1) アイドル状態から,待ち解除されたタスクに切り換わる
55 * (B-2) 実行状態のタスクから,待ち解除されたタスクに切り換わる
56 * (B-3) ディスパッチ保留状態で,切り換わらない
57 * (B-4) 待ち解除されたタスクが強制待ち状態で,切り換わらない
58 * (B-5) 待ち解除されたタスクが優先度が低く,切り換わらない
59 * (C) pol_semの静的エラーのテスト
60 * (C-1) 非タスクコンテキストからの呼出し
61 * (C-2) CPUロック状態からの呼出し
62 * (C-3) ディスパッチ禁止状態からの呼出し(E_CTXエラーにならない)
63 * (C-4) 割込み優先度マスク全解除でない状態からの呼出し(E_CTXエラー
65 * (D) pol_semでポーリング失敗する
66 * (E) twai_semの静的エラーのテスト
67 * (E-1) 非タスクコンテキストからの呼出し
68 * (E-2) CPUロック状態からの呼出し
69 * (E-3) ディスパッチ禁止状態からの呼出し
70 * (E-4) 割込み優先度マスク全解除でない状態からの呼出し
72 * (F) twai_semでtmout=TMO_POLの時にポーリング失敗する
73 * (G) twai_semでtmout=TMO_FEVRの時にセマフォ待ち状態になる
74 * (H) twai_semでtmoutにタイムアウトを設定した時に,タイムアウト付きの
79 * TASK1: 中優先度タスク,TA_ACT属性
85 * SEM1: TA_NULL属性,初期資源数1,最大資源数1
90 * 1: isig_sem(SEM1) -> E_CTX ... (A-1)
92 * pol_sem(SEM1) -> E_CTX ... (C-2)
93 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-2)
96 * pol_sem(SEM1) ... (C-3)
97 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-3)
99 * 4: chg_ipm(TMAX_INTPRI)
100 * pol_sem(SEM1) -> E_TMOUT ... (C-4)(D)
101 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-4)
102 * chg_ipm(TIPM_ENAALL)
103 * 5: twai_sem(SEM1, -2) -> E_PAR ... (E-5)
104 * twai_sem(SEM1, TMO_POL) -> E_TMOUT ... (F)
105 * 6: sta_alm(ALM1, 10)
106 * 7: twai_sem(SEM1, TMO_FEVR) ... (G)
108 * 8: pol_sem(SEM1) -> E_CTX ... (C-1)
109 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-1)
111 * isig_sem(SEM1) -> E_CTX ... (A-2)
113 * 10: isig_sem(SEM1) ... (B-1)
119 * 13: sta_alm(ALM1, 10)
122 * 14: isig_sem(SEM1) ... (B-2)
128 * 16: sta_alm(ALM1, 10)
132 * 17: isig_sem(SEM1) ... (B-3)
140 * 20: sta_alm(ALM1, 10)
144 * 21: isig_sem(SEM1) ... (B-4)
152 * 24: tslp_tsk(10) -> E_TMOUT
156 * 26: ext_tsk() -> noreturn
158 * 27: sta_alm(ALM1, 10)
161 * 28: isig_sem(SEM1) ... (B-5)
165 * 29: ext_tsk() -> noreturn
167 * 30: sta_alm(ALM1, 10)
168 * 31: twai_sem(SEM1, 100) -> E_RLWAI
170 * 32: irel_wai(TASK1)
173 * 33: sta_alm(ALM1, 100)
174 * 34: twai_sem(SEM1, 10) -> E_TMOUT ... (H)
180 #include <test_lib.h>
181 #include <t_syslog.h>
182 #include "kernel_cfg.h"
183 #include "test_sem2.h"
185 static volatile bool_t flagvar;
200 static uint_t alarm1_count = 0;
203 alarm1_handler(intptr_t exinf)
207 switch (++alarm1_count) {
210 ercd = pol_sem(SEM1);
211 check_ercd(ercd, E_CTX);
213 ercd = twai_sem(SEM1, TMO_POL);
214 check_ercd(ercd, E_CTX);
218 check_ercd(ercd, E_OK);
220 ercd = isig_sem(SEM1);
221 check_ercd(ercd, E_CTX);
224 check_ercd(ercd, E_OK);
227 ercd = isig_sem(SEM1);
228 check_ercd(ercd, E_OK);
236 ercd = isig_sem(SEM1);
237 check_ercd(ercd, E_OK);
247 ercd = isig_sem(SEM1);
248 check_ercd(ercd, E_OK);
258 ercd = isig_sem(SEM1);
259 check_ercd(ercd, E_OK);
269 ercd = isig_sem(SEM1);
270 check_ercd(ercd, E_OK);
280 ercd = irel_wai(TASK1);
281 check_ercd(ercd, E_OK);
291 task1(intptr_t exinf)
296 ercd = isig_sem(SEM1);
297 check_ercd(ercd, E_CTX);
301 check_ercd(ercd, E_OK);
303 ercd = pol_sem(SEM1);
304 check_ercd(ercd, E_CTX);
306 ercd = twai_sem(SEM1, TMO_POL);
307 check_ercd(ercd, E_CTX);
310 check_ercd(ercd, E_OK);
314 check_ercd(ercd, E_OK);
316 ercd = pol_sem(SEM1);
317 check_ercd(ercd, E_OK);
319 ercd = twai_sem(SEM1, TMO_POL);
320 check_ercd(ercd, E_CTX);
323 check_ercd(ercd, E_OK);
326 ercd = chg_ipm(TMAX_INTPRI);
327 check_ercd(ercd, E_OK);
329 ercd = pol_sem(SEM1);
330 check_ercd(ercd, E_TMOUT);
332 ercd = twai_sem(SEM1, TMO_POL);
333 check_ercd(ercd, E_CTX);
335 ercd = chg_ipm(TIPM_ENAALL);
336 check_ercd(ercd, E_OK);
339 ercd = twai_sem(SEM1, -2);
340 check_ercd(ercd, E_PAR);
342 ercd = twai_sem(SEM1, TMO_POL);
343 check_ercd(ercd, E_TMOUT);
346 ercd = sta_alm(ALM1, 10);
347 check_ercd(ercd, E_OK);
350 ercd = twai_sem(SEM1, TMO_FEVR);
351 check_ercd(ercd, E_OK);
354 ercd = act_tsk(TASK3);
355 check_ercd(ercd, E_OK);
358 ercd = wai_sem(SEM1);
359 check_ercd(ercd, E_OK);
362 ercd = wai_sem(SEM1);
363 check_ercd(ercd, E_OK);
366 ercd = wai_sem(SEM1);
367 check_ercd(ercd, E_OK);
370 ercd = act_tsk(TASK2);
371 check_ercd(ercd, E_OK);
374 ercd = wai_sem(SEM1);
375 check_ercd(ercd, E_OK);
378 ercd = sta_alm(ALM1, 10);
379 check_ercd(ercd, E_OK);
382 ercd = twai_sem(SEM1, 100);
383 check_ercd(ercd, E_RLWAI);
386 ercd = sta_alm(ALM1, 100);
387 check_ercd(ercd, E_OK);
390 ercd = twai_sem(SEM1, 10);
391 check_ercd(ercd, E_TMOUT);
394 ercd = stp_alm(ALM1);
395 check_ercd(ercd, E_OK);
403 task2(intptr_t exinf)
409 check_ercd(ercd, E_TMOUT);
412 ercd = sta_alm(ALM1, 10);
413 check_ercd(ercd, E_OK);
424 task3(intptr_t exinf)
429 ercd = sta_alm(ALM1, 10);
430 check_ercd(ercd, E_OK);
435 ercd = sta_alm(ALM1, 10);
436 check_ercd(ercd, E_OK);
439 check_ercd(ercd, E_OK);
445 check_ercd(ercd, E_OK);
448 ercd = sta_alm(ALM1, 10);
449 check_ercd(ercd, E_OK);
451 ercd = sus_tsk(TASK1);
452 check_ercd(ercd, E_OK);
457 ercd = rsm_tsk(TASK1);
458 check_ercd(ercd, E_OK);