OSDN Git Service

ターゲット名間違いを修正
[toppersasp4lpc/asp.git] / asp / test / test_sem2.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_sem2.c 1577 2009-05-31 14:30:51Z ertl-hiro $
38  */
39
40 /* 
41  *              セマフォ機能のテスト(2)
42  *
43  * 【テストの目的】
44  *
45  *  isig_semを,sig_semとの違いを中心にテストする.
46  *  pol_sem,twai_semを,wai_semとの違いを中心にテストする.
47  *
48  * 【テスト項目】
49  *
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エラー
64  *                    にならない)
65  *      (D) pol_semでポーリング失敗する
66  *      (E) twai_semの静的エラーのテスト
67  *              (E-1) 非タスクコンテキストからの呼出し
68  *              (E-2) CPUロック状態からの呼出し
69  *              (E-3) ディスパッチ禁止状態からの呼出し
70  *              (E-4) 割込み優先度マスク全解除でない状態からの呼出し
71  *              (E-5) tmoutが不正
72  *      (F) twai_semでtmout=TMO_POLの時にポーリング失敗する
73  *      (G) twai_semでtmout=TMO_FEVRの時にセマフォ待ち状態になる
74  *      (H) twai_semでtmoutにタイムアウトを設定した時に,タイムアウト付きの
75  *              セマフォ待ち状態になる
76  *
77  * 【使用リソース】
78  *
79  *      TASK1: 中優先度タスク,TA_ACT属性
80  *      TASK2: 高優先度タスク
81  *      TASK3: 低優先度タスク
82  *      TASK4: 中優先度タスク
83  *      TASK5: 中優先度タスク
84  *      ALM1:  アラームハンドラ
85  *  SEM1:  TA_NULL属性,初期資源数1,最大資源数1
86  *
87  * 【テストシーケンス】
88  *
89  *      == TASK1(優先度:中)==
90  *  1:  isig_sem(SEM1) -> E_CTX                         ... (A-1)
91  *      2:      loc_cpu()
92  *              pol_sem(SEM1) -> E_CTX                          ... (C-2)
93  *              twai_sem(SEM1, TMO_POL) -> E_CTX        ... (E-2)
94  *              unl_cpu()
95  *      3:      dis_dsp()
96  *              pol_sem(SEM1)                                           ... (C-3)
97  *              twai_sem(SEM1, TMO_POL) -> E_CTX        ... (E-3)
98  *              ena_dsp()
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)
107  *      == ALM1-1 ==
108  *      8:      pol_sem(SEM1) -> E_CTX                          ... (C-1)
109  *              twai_sem(SEM1, TMO_POL) -> E_CTX        ... (E-1)
110  *      9:      iloc_cpu()
111  *              isig_sem(SEM1) -> E_CTX                         ... (A-2)
112  *              iunl_cpu()
113  *      10:     isig_sem(SEM1)                                          ... (B-1)
114  *              RETURN
115  *      == TASK1(続き)==
116  *      11:     act_tsk(TASK3)
117  *      12:     wai_sem(SEM1)
118  *      == TASK3(優先度:低)==
119  *      13:     sta_alm(ALM1, 10)
120  *              call(wait_var())
121  *      == ALM1-2 ==
122  *      14:     isig_sem(SEM1)                                          ... (B-2)
123  *              call(signal_var())
124  *              RETURN
125  *      == TASK1(続き)==
126  *      15:     wai_sem(SEM1)
127  *      == TASK3(続き)==
128  *      16:     sta_alm(ALM1, 10)
129  *              dis_dsp()
130  *              call(wait_var())
131  *      == ALM1-3 ==
132  *      17:     isig_sem(SEM1)                                          ... (B-3)
133  *              call(signal_var())
134  *              RETURN
135  *      == TASK3(続き)==
136  *      18:     ena_dsp()
137  *      == TASK1(続き)==
138  *      19:     wai_sem(SEM1)
139  *      == TASK3(続き)==
140  *      20:     sta_alm(ALM1, 10)
141  *              sus_tsk(TASK1)
142  *              call(wait_var())
143  *      == ALM1-4 ==
144  *      21:     isig_sem(SEM1)                                          ... (B-4)
145  *              call(signal_var())
146  *              RETURN
147  *      == TASK3(続き)==
148  *      22:     rsm_tsk(TASK1)
149  *      == TASK1(続き)==
150  *      23:     act_tsk(TASK2)
151  *      == TASK2(優先度:高)==
152  *      24:     tslp_tsk(10) -> E_TMOUT
153  *      == TASK1(続き)==
154  *      25:     wai_sem(SEM1)
155  *      == TASK3(続き)==
156  *      26:     ext_tsk() -> noreturn
157  *      == TASK2(続き)==
158  *      27:     sta_alm(ALM1, 10)
159  *              call(wait_var())
160  *      == ALM1-5 ==
161  *      28:     isig_sem(SEM1)                                          ... (B-5)
162  *              call(signal_var())
163  *              RETURN
164  *      == TASK2(続き)==
165  *      29:     ext_tsk() -> noreturn
166  *      == TASK1(続き)==
167  *      30:     sta_alm(ALM1, 10)
168  *      31:     twai_sem(SEM1, 100) -> E_RLWAI
169  *      == ALM1-6 ==
170  *      32:     irel_wai(TASK1)
171  *              RETURN
172  *      == TASK1(続き)==
173  *      33:     sta_alm(ALM1, 100)
174  *      34:     twai_sem(SEM1, 10) -> E_TMOUT           ... (H)
175  *      35:     stp_alm(ALM1)
176  *      36:     END
177  */
178
179 #include <kernel.h>
180 #include <test_lib.h>
181 #include <t_syslog.h>
182 #include "kernel_cfg.h"
183 #include "test_sem2.h"
184
185 static volatile bool_t  flagvar;
186
187 static void
188 wait_var(void)
189 {
190         flagvar = false;
191         while (!flagvar);
192 }
193
194 static void
195 signal_var(void)
196 {
197         flagvar = true;
198 }
199
200 static uint_t   alarm1_count = 0;
201
202 void
203 alarm1_handler(intptr_t exinf)
204 {
205         ER              ercd;
206
207         switch (++alarm1_count) {
208         case 1:
209                 check_point(8);
210                 ercd = pol_sem(SEM1);
211                 check_ercd(ercd, E_CTX);
212
213                 ercd = twai_sem(SEM1, TMO_POL);
214                 check_ercd(ercd, E_CTX);
215
216                 check_point(9);
217                 ercd = iloc_cpu();
218                 check_ercd(ercd, E_OK);
219
220                 ercd = isig_sem(SEM1);
221                 check_ercd(ercd, E_CTX);
222
223                 ercd = iunl_cpu();
224                 check_ercd(ercd, E_OK);
225
226                 check_point(10);
227                 ercd = isig_sem(SEM1);
228                 check_ercd(ercd, E_OK);
229
230                 return;
231
232                 check_point(0);
233
234         case 2:
235                 check_point(14);
236                 ercd = isig_sem(SEM1);
237                 check_ercd(ercd, E_OK);
238
239                 signal_var();
240
241                 return;
242
243                 check_point(0);
244
245         case 3:
246                 check_point(17);
247                 ercd = isig_sem(SEM1);
248                 check_ercd(ercd, E_OK);
249
250                 signal_var();
251
252                 return;
253
254                 check_point(0);
255
256         case 4:
257                 check_point(21);
258                 ercd = isig_sem(SEM1);
259                 check_ercd(ercd, E_OK);
260
261                 signal_var();
262
263                 return;
264
265                 check_point(0);
266
267         case 5:
268                 check_point(28);
269                 ercd = isig_sem(SEM1);
270                 check_ercd(ercd, E_OK);
271
272                 signal_var();
273
274                 return;
275
276                 check_point(0);
277
278         case 6:
279                 check_point(32);
280                 ercd = irel_wai(TASK1);
281                 check_ercd(ercd, E_OK);
282
283                 return;
284
285                 check_point(0);
286         }
287         check_point(0);
288 }
289
290 void
291 task1(intptr_t exinf)
292 {
293         ER              ercd;
294
295         check_point(1);
296         ercd = isig_sem(SEM1);
297         check_ercd(ercd, E_CTX);
298
299         check_point(2);
300         ercd = loc_cpu();
301         check_ercd(ercd, E_OK);
302
303         ercd = pol_sem(SEM1);
304         check_ercd(ercd, E_CTX);
305
306         ercd = twai_sem(SEM1, TMO_POL);
307         check_ercd(ercd, E_CTX);
308
309         ercd = unl_cpu();
310         check_ercd(ercd, E_OK);
311
312         check_point(3);
313         ercd = dis_dsp();
314         check_ercd(ercd, E_OK);
315
316         ercd = pol_sem(SEM1);
317         check_ercd(ercd, E_OK);
318
319         ercd = twai_sem(SEM1, TMO_POL);
320         check_ercd(ercd, E_CTX);
321
322         ercd = ena_dsp();
323         check_ercd(ercd, E_OK);
324
325         check_point(4);
326         ercd = chg_ipm(TMAX_INTPRI);
327         check_ercd(ercd, E_OK);
328
329         ercd = pol_sem(SEM1);
330         check_ercd(ercd, E_TMOUT);
331
332         ercd = twai_sem(SEM1, TMO_POL);
333         check_ercd(ercd, E_CTX);
334
335         ercd = chg_ipm(TIPM_ENAALL);
336         check_ercd(ercd, E_OK);
337
338         check_point(5);
339         ercd = twai_sem(SEM1, -2);
340         check_ercd(ercd, E_PAR);
341
342         ercd = twai_sem(SEM1, TMO_POL);
343         check_ercd(ercd, E_TMOUT);
344
345         check_point(6);
346         ercd = sta_alm(ALM1, 10);
347         check_ercd(ercd, E_OK);
348
349         check_point(7);
350         ercd = twai_sem(SEM1, TMO_FEVR);
351         check_ercd(ercd, E_OK);
352
353         check_point(11);
354         ercd = act_tsk(TASK3);
355         check_ercd(ercd, E_OK);
356
357         check_point(12);
358         ercd = wai_sem(SEM1);
359         check_ercd(ercd, E_OK);
360
361         check_point(15);
362         ercd = wai_sem(SEM1);
363         check_ercd(ercd, E_OK);
364
365         check_point(19);
366         ercd = wai_sem(SEM1);
367         check_ercd(ercd, E_OK);
368
369         check_point(23);
370         ercd = act_tsk(TASK2);
371         check_ercd(ercd, E_OK);
372
373         check_point(25);
374         ercd = wai_sem(SEM1);
375         check_ercd(ercd, E_OK);
376
377         check_point(30);
378         ercd = sta_alm(ALM1, 10);
379         check_ercd(ercd, E_OK);
380
381         check_point(31);
382         ercd = twai_sem(SEM1, 100);
383         check_ercd(ercd, E_RLWAI);
384
385         check_point(33);
386         ercd = sta_alm(ALM1, 100);
387         check_ercd(ercd, E_OK);
388
389         check_point(34);
390         ercd = twai_sem(SEM1, 10);
391         check_ercd(ercd, E_TMOUT);
392
393         check_point(35);
394         ercd = stp_alm(ALM1);
395         check_ercd(ercd, E_OK);
396
397         check_finish(36);
398
399         check_point(0);
400 }
401
402 void
403 task2(intptr_t exinf)
404 {
405         ER              ercd;
406
407         check_point(24);
408         ercd = tslp_tsk(10);
409         check_ercd(ercd, E_TMOUT);
410
411         check_point(27);
412         ercd = sta_alm(ALM1, 10);
413         check_ercd(ercd, E_OK);
414
415         wait_var();
416
417         check_point(29);
418         ercd = ext_tsk();
419
420         check_point(0);
421 }
422
423 void
424 task3(intptr_t exinf)
425 {
426         ER              ercd;
427
428         check_point(13);
429         ercd = sta_alm(ALM1, 10);
430         check_ercd(ercd, E_OK);
431
432         wait_var();
433
434         check_point(16);
435         ercd = sta_alm(ALM1, 10);
436         check_ercd(ercd, E_OK);
437
438         ercd = dis_dsp();
439         check_ercd(ercd, E_OK);
440
441         wait_var();
442
443         check_point(18);
444         ercd = ena_dsp();
445         check_ercd(ercd, E_OK);
446
447         check_point(20);
448         ercd = sta_alm(ALM1, 10);
449         check_ercd(ercd, E_OK);
450
451         ercd = sus_tsk(TASK1);
452         check_ercd(ercd, E_OK);
453
454         wait_var();
455
456         check_point(22);
457         ercd = rsm_tsk(TASK1);
458         check_ercd(ercd, E_OK);
459
460         check_point(26);
461         ercd = ext_tsk();
462
463         check_point(0);
464 }