OSDN Git Service

カーネルのターゲット非依存部1.7.0およびCFGをマージ
[toppersasp4lpc/asp.git] / asp / test / test_sem1.c
1 /*
2  *  TOPPERS Software
3  *      Toyohashi Open Platform for Embedded Real-Time Systems
4  * 
5  *  Copyright (C) 2008,2009 by Embedded and Real-Time Systems Laboratory
6  *              Graduate School of Information Science, Nagoya Univ., JAPAN
7  * 
8  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
9  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13  *      スコード中に含まれていること.
14  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17  *      の無保証規定を掲載すること.
18  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20  *      と.
21  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
23  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24  *        報告すること.
25  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29  *      免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35  *  の責任を負わない.
36  * 
37  *  @(#) $Id: test_sem1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
38  */
39
40 /* 
41  *              セマフォ機能のテスト(1)
42  *
43  * 【テストの目的】
44  *
45  *  sig_sem,wai_sem,CRE_SEMを網羅的にテストする.
46  *  ただし,CRE_SEMのエラーのテストは除く.
47  *
48  * 【テスト項目】
49  *
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
89  *
90  * 【使用リソース】
91  *
92  *      TASK1: 中優先度タスク,TA_ACT属性
93  *      TASK2: 高優先度タスク
94  *      TASK3: 低優先度タスク
95  *      TASK4: 中優先度タスク
96  *      TASK5: 中優先度タスク
97  *      ALM1:  アラームハンドラ
98  *  SEM1:  TA_NULL属性,初期資源数1,最大資源数1
99  *  SEM2:  TA_NULL属性,初期資源数2,最大資源数2
100  *  SEM3:  TA_TPRI属性,初期資源数0,最大資源数1
101  *
102  * 【テストシーケンス】
103  *
104  *      == TASK1(優先度:中)==
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)
114  *      2:      loc_cpu()
115  *              sig_sem(SEM1) -> E_CTX                          ... (A-2)
116  *              wai_sem(SEM1) -> E_CTX                          ... (E-2)
117  *              unl_cpu()
118  *              dis_dsp()
119  *              wai_sem(SEM1) -> E_CTX                          ... (E-3)
120  *              ena_dsp()
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)
128  *      3:      act_tsk(TASK3)
129  *      4:      slp_tsk()
130  *      == TASK3(優先度:低)==
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)
137  *      == ALM1 ==
138  *      9:      sig_sem(SEM1) -> E_CTX                          ... (A-1)
139  *              wai_sem(SEM1) -> E_CTX                          ... (E-1)
140  *      10:     iwup_tsk(TASK1)
141  *      11:     RETURN
142  *      == TASK1(続き)==
143  *      12:     act_tsk(TASK2)
144  *      == TASK2(優先度:高)==
145  *      13:     wai_sem(SEM1)                                           ... (G-2)
146  *      == TASK1(続き)==
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)
152  *      == TASK2(続き)==
153  *      17:     wai_sem(SEM1)                                           ... (G-1)
154  *      == TASK1(続き)==
155  *      18: dis_dsp()
156  *      19:     sig_sem(SEM1)                                           ... (B-2)
157  *      20:     ena_dsp()
158  *      == TASK2(続き)==
159  *      21:     wai_sem(SEM1)                                           ... (G-1)
160  *      == TASK1(続き)==
161  *      22: sus_tsk(TASK2)
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)
168  *      27:     rsm_tsk(TASK2)
169  *      == TASK2(続き)==
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)
176  *      == TASK1(続き)==
177  *      32:     sig_sem(SEM2)                                           ... (B-1)
178  *      == TASK2(続き)==
179  *      33:     wai_sem(SEM3)                                           ... (G-3)
180  *      == TASK1(続き)==
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)
190  *      39:     MISSING
191  *      40:     tslp_tsk(10) -> E_TMOUT
192  *      == TASK3(続き)==
193  *      41:     wai_sem(SEM3)                                           ... (G-4)
194  *      == TASK1(続き)==
195  *      42:     act_tsk(TASK4)
196  *      43:     act_tsk(TASK5)
197  *      44:     rot_rdq(TPRI_SELF)
198  *      == TASK4(優先度:中)==
199  *      45:     wai_sem(SEM3)                                           ... (G-6)
200  *      == TASK5(優先度:中)==
201  *      46:     wai_sem(SEM3)                                           ... (G-5)
202  *      == TASK1(続き)==
203  *      47:     sig_sem(SEM3)                                           ... (B-1)
204  *      == TASK2(続き)==
205  *      48:     wai_sem(SEM1)
206  *              wai_sem(SEM1) -> E_RLWAI
207  *      == TASK1(続き)==
208  *      49:     sig_sem(SEM3)                                           ... (B-4)
209  *      50:     tslp_tsk(10) -> E_TMOUT
210  *      == TASK4(続き)==
211  *      51:     ext_tsk() -> noreturn
212  *      == TASK1(続き)==
213  *      52:     sig_sem(SEM3)                                           ... (B-4)
214  *      53:     tslp_tsk(10) -> E_TMOUT
215  *      == TASK5(続き)==
216  *      54:     ext_tsk() -> noreturn
217  *      == TASK1(続き)==
218  *      55:     sig_sem(SEM3)                                           ... (B-4)
219  *      56:     tslp_tsk(10) -> E_TMOUT
220  *      == TASK3(続き)==
221  *      57:     ext_tsk() -> noreturn
222  *      == TASK1(続き)==
223  *      58: rel_wai(TASK2)                                              ... (H)
224  *      == TASK2(続き)==
225  *      59:     wai_sem(SEM1) -> E_DLT
226  *      == TASK1(続き)==
227  *      60: ini_sem(SEM1)                                               ... (I)
228  *      == TASK2(続き)==
229  *      61: ext_tsk() -> noreturn
230  *      == TASK1(続き)==
231  *      62: END
232  */
233
234 #include <kernel.h>
235 #include <test_lib.h>
236 #include <t_syslog.h>
237 #include "kernel_cfg.h"
238 #include "test_sem1.h"
239
240 void
241 alarm1_handler(intptr_t exinf)
242 {
243         ER              ercd;
244
245         check_point(9);
246         ercd = sig_sem(SEM1);
247         check_ercd(ercd, E_CTX);
248
249         ercd = wai_sem(SEM1);
250         check_ercd(ercd, E_CTX);
251
252         check_point(10);
253         ercd = iwup_tsk(TASK1);
254         check_ercd(ercd, E_OK);
255
256         check_point(11);
257         return;
258
259         check_point(0);
260 }
261
262 void
263 task1(intptr_t exinf)
264 {
265         ER              ercd;
266         T_RSEM  rsem;
267
268         check_point(1);
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);
273
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);
278
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);
283
284         check_point(2);
285         ercd = loc_cpu();
286         check_ercd(ercd, E_OK);
287
288         ercd = sig_sem(SEM1);
289         check_ercd(ercd, E_CTX);
290
291         ercd = wai_sem(SEM1);
292         check_ercd(ercd, E_CTX);
293
294         ercd = unl_cpu();
295         check_ercd(ercd, E_OK);
296
297         ercd = dis_dsp();
298         check_ercd(ercd, E_OK);
299
300         ercd = wai_sem(SEM1);
301         check_ercd(ercd, E_CTX);
302
303         ercd = ena_dsp();
304         check_ercd(ercd, E_OK);
305
306         ercd = chg_ipm(TMAX_INTPRI);
307         check_ercd(ercd, E_OK);
308
309         ercd = wai_sem(SEM1);
310         check_ercd(ercd, E_CTX);
311
312         ercd = chg_ipm(TIPM_ENAALL);
313         check_ercd(ercd, E_OK);
314
315         ercd = sig_sem(0);
316         check_ercd(ercd, E_ID);
317
318         ercd = wai_sem(0);
319         check_ercd(ercd, E_ID);
320
321         ercd = sig_sem(TNUM_SEMID+1);
322         check_ercd(ercd, E_ID);
323
324         ercd = wai_sem(TNUM_SEMID+1);
325         check_ercd(ercd, E_ID);
326
327         check_point(3);
328         ercd = act_tsk(TASK3);
329         check_ercd(ercd, E_OK);
330
331         check_point(4);
332         ercd = slp_tsk();
333         check_ercd(ercd, E_OK);
334
335         check_point(12);
336         ercd = act_tsk(TASK2);
337         check_ercd(ercd, E_OK);
338
339         check_point(14);
340         ercd = ref_sem(SEM1, &rsem);
341         check_ercd(ercd, E_OK);
342         check_assert(rsem.wtskid == TASK3);
343         check_assert(rsem.semcnt == 0);
344
345         check_point(15);
346         ercd = sig_sem(SEM1);
347         check_ercd(ercd, E_OK);
348
349         check_point(16);
350         ercd = sig_sem(SEM1);
351         check_ercd(ercd, E_OK);
352
353         check_point(18);
354         ercd = dis_dsp();
355         check_ercd(ercd, E_OK);
356
357         check_point(19);
358         ercd = sig_sem(SEM1);
359         check_ercd(ercd, E_OK);
360
361         check_point(20);
362         ercd = ena_dsp();
363         check_ercd(ercd, E_OK);
364
365         check_point(22);
366         ercd = sus_tsk(TASK2);
367         check_ercd(ercd, E_OK);
368
369         check_point(23);
370         ercd = sig_sem(SEM1);
371         check_ercd(ercd, E_OK);
372
373         check_point(24);
374         ercd = sig_sem(SEM1);
375         check_ercd(ercd, E_OK);
376
377         check_point(25);
378         ercd = sig_sem(SEM1);
379         check_ercd(ercd, E_QOVR);
380
381         check_point(26);
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);
386
387         check_point(27);
388         ercd = rsm_tsk(TASK2);
389         check_ercd(ercd, E_OK);
390
391         check_point(32);
392         ercd = sig_sem(SEM2);
393         check_ercd(ercd, E_OK);
394
395         check_point(34);
396         ercd = sig_sem(SEM2);
397         check_ercd(ercd, E_OK);
398
399         check_point(35);
400         ercd = sig_sem(SEM2);
401         check_ercd(ercd, E_OK);
402
403         check_point(36);
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);
408
409         check_point(37);
410         ercd = sig_sem(SEM2);
411         check_ercd(ercd, E_QOVR);
412
413         check_point(38);
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);
418
419         check_point(39);
420
421         check_point(40);
422         ercd = tslp_tsk(10);
423         check_ercd(ercd, E_TMOUT);
424
425         check_point(42);
426         ercd = act_tsk(TASK4);
427         check_ercd(ercd, E_OK);
428
429         check_point(43);
430         ercd = act_tsk(TASK5);
431         check_ercd(ercd, E_OK);
432
433         check_point(44);
434         ercd = rot_rdq(TPRI_SELF);
435         check_ercd(ercd, E_OK);
436
437         check_point(47);
438         ercd = sig_sem(SEM3);
439         check_ercd(ercd, E_OK);
440
441         check_point(49);
442         ercd = sig_sem(SEM3);
443         check_ercd(ercd, E_OK);
444
445         check_point(50);
446         ercd = tslp_tsk(10);
447         check_ercd(ercd, E_TMOUT);
448
449         check_point(52);
450         ercd = sig_sem(SEM3);
451         check_ercd(ercd, E_OK);
452
453         check_point(53);
454         ercd = tslp_tsk(10);
455         check_ercd(ercd, E_TMOUT);
456
457         check_point(55);
458         ercd = sig_sem(SEM3);
459         check_ercd(ercd, E_OK);
460
461         check_point(56);
462         ercd = tslp_tsk(10);
463         check_ercd(ercd, E_TMOUT);
464
465         check_point(58);
466         ercd = rel_wai(TASK2);
467         check_ercd(ercd, E_OK);
468
469         check_point(60);
470         ercd = ini_sem(SEM1);
471         check_ercd(ercd, E_OK);
472
473         check_finish(62);
474
475         check_point(0);
476 }
477
478 void
479 task2(intptr_t exinf)
480 {
481         ER              ercd;
482         T_RSEM  rsem;
483
484         check_point(13);
485         ercd = wai_sem(SEM1);
486         check_ercd(ercd, E_OK);
487
488         check_point(17);
489         ercd = wai_sem(SEM1);
490         check_ercd(ercd, E_OK);
491
492         check_point(21);
493         ercd = wai_sem(SEM1);
494         check_ercd(ercd, E_OK);
495
496         check_point(28);
497         ercd = wai_sem(SEM2);
498         check_ercd(ercd, E_OK);
499
500         check_point(29);
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);
505
506         check_point(30);
507         ercd = wai_sem(SEM2);
508         check_ercd(ercd, E_OK);
509
510         check_point(31);
511         ercd = wai_sem(SEM2);
512         check_ercd(ercd, E_OK);
513
514         check_point(33);
515         ercd = wai_sem(SEM3);
516         check_ercd(ercd, E_OK);
517
518         check_point(48);
519         ercd = wai_sem(SEM1);
520         check_ercd(ercd, E_OK);
521
522         ercd = wai_sem(SEM1);
523         check_ercd(ercd, E_RLWAI);
524
525         check_point(59);
526         ercd = wai_sem(SEM1);
527         check_ercd(ercd, E_DLT);
528
529         check_point(61);
530         ercd = ext_tsk();
531
532         check_point(0);
533 }
534
535 void
536 task3(intptr_t exinf)
537 {
538         ER              ercd;
539         T_RSEM  rsem;
540
541         check_point(5);
542         ercd = wai_sem(SEM1);
543         check_ercd(ercd, E_OK);
544
545         check_point(6);
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);
550
551         check_point(7);
552         ercd = sta_alm(ALM1, 10);
553         check_ercd(ercd, E_OK);
554
555         check_point(8);
556         ercd = wai_sem(SEM1);
557         check_ercd(ercd, E_OK);
558
559         check_point(41);
560         ercd = wai_sem(SEM3);
561         check_ercd(ercd, E_OK);
562
563         check_point(57);
564         ercd = ext_tsk();
565
566         check_point(0);
567 }
568
569 void
570 task4(intptr_t exinf)
571 {
572         ER              ercd;
573
574         check_point(45);
575         ercd = wai_sem(SEM3);
576         check_ercd(ercd, E_OK);
577
578         check_point(51);
579         ercd = ext_tsk();
580
581         check_point(0);
582 }
583
584 void
585 task5(intptr_t exinf)
586 {
587         ER              ercd;
588
589         check_point(46);
590         ercd = wai_sem(SEM3);
591         check_ercd(ercd, E_OK);
592
593         check_point(54);
594         ercd = ext_tsk();
595
596         check_point(0);
597 }