source: azure_iot_hub_f767zi/trunk/asp_baseplatform/test/test_sem1.c@ 457

Last change on this file since 457 was 457, checked in by coas-nagasima, 4 years ago

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 15.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2008-2014 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$
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: tslp_tsk(10) -> E_TMOUT
191 * == TASK3(続き)==
192 * 40: wai_sem(SEM3) ... (G-4)
193 * == TASK1(続き)==
194 * 41: act_tsk(TASK4)
195 * 42: act_tsk(TASK5)
196 * 43: rot_rdq(TPRI_SELF)
197 * == TASK4(優先度:中)==
198 * 44: wai_sem(SEM3) ... (G-6)
199 * == TASK5(優先度:中)==
200 * 45: wai_sem(SEM3) ... (G-5)
201 * == TASK1(続き)==
202 * 46: sig_sem(SEM3) ... (B-1)
203 * == TASK2(続き)==
204 * 47: wai_sem(SEM1)
205 * wai_sem(SEM1) -> E_RLWAI
206 * == TASK1(続き)==
207 * 48: sig_sem(SEM3) ... (B-4)
208 * 49: tslp_tsk(10) -> E_TMOUT
209 * == TASK4(続き)==
210 * 50: ext_tsk() -> noreturn
211 * == TASK1(続き)==
212 * 51: sig_sem(SEM3) ... (B-4)
213 * 52: tslp_tsk(10) -> E_TMOUT
214 * == TASK5(続き)==
215 * 53: ext_tsk() -> noreturn
216 * == TASK1(続き)==
217 * 54: sig_sem(SEM3) ... (B-4)
218 * 55: tslp_tsk(10) -> E_TMOUT
219 * == TASK3(続き)==
220 * 56: ext_tsk() -> noreturn
221 * == TASK1(続き)==
222 * 57: rel_wai(TASK2) ... (H)
223 * == TASK2(続き)==
224 * 58: wai_sem(SEM1) -> E_DLT
225 * == TASK1(続き)==
226 * 59: ini_sem(SEM1) ... (I)
227 * == TASK2(続き)==
228 * 60: ext_tsk() -> noreturn
229 * == TASK1(続き)==
230 * 61: END
231 */
232
233#include <kernel.h>
234#include <test_lib.h>
235#include <t_syslog.h>
236#include "kernel_cfg.h"
237#include "test_sem1.h"
238
239/* DO NOT DELETE THIS LINE -- gentest depends on it. */
240
241void
242alarm1_handler(intptr_t exinf)
243{
244 ER_UINT ercd;
245
246 check_point(9);
247 ercd = sig_sem(SEM1);
248 check_ercd(ercd, E_CTX);
249
250 ercd = wai_sem(SEM1);
251 check_ercd(ercd, E_CTX);
252
253 check_point(10);
254 ercd = iwup_tsk(TASK1);
255 check_ercd(ercd, E_OK);
256
257 check_point(11);
258 return;
259
260 check_point(0);
261}
262
263void
264task1(intptr_t exinf)
265{
266 ER_UINT ercd;
267 T_RSEM rsem;
268
269 test_start(__FILE__);
270
271 check_point(1);
272 ercd = ref_sem(SEM1, &rsem);
273 check_ercd(ercd, E_OK);
274
275 check_assert(rsem.wtskid == TSK_NONE);
276
277 check_assert(rsem.semcnt == 1);
278
279 ercd = ref_sem(SEM2, &rsem);
280 check_ercd(ercd, E_OK);
281
282 check_assert(rsem.wtskid == TSK_NONE);
283
284 check_assert(rsem.semcnt == 2);
285
286 ercd = ref_sem(SEM3, &rsem);
287 check_ercd(ercd, E_OK);
288
289 check_assert(rsem.wtskid == TSK_NONE);
290
291 check_assert(rsem.semcnt == 0);
292
293 check_point(2);
294 ercd = loc_cpu();
295 check_ercd(ercd, E_OK);
296
297 ercd = sig_sem(SEM1);
298 check_ercd(ercd, E_CTX);
299
300 ercd = wai_sem(SEM1);
301 check_ercd(ercd, E_CTX);
302
303 ercd = unl_cpu();
304 check_ercd(ercd, E_OK);
305
306 ercd = dis_dsp();
307 check_ercd(ercd, E_OK);
308
309 ercd = wai_sem(SEM1);
310 check_ercd(ercd, E_CTX);
311
312 ercd = ena_dsp();
313 check_ercd(ercd, E_OK);
314
315 ercd = chg_ipm(TMAX_INTPRI);
316 check_ercd(ercd, E_OK);
317
318 ercd = wai_sem(SEM1);
319 check_ercd(ercd, E_CTX);
320
321 ercd = chg_ipm(TIPM_ENAALL);
322 check_ercd(ercd, E_OK);
323
324 ercd = sig_sem(0);
325 check_ercd(ercd, E_ID);
326
327 ercd = wai_sem(0);
328 check_ercd(ercd, E_ID);
329
330 ercd = sig_sem(TNUM_SEMID+1);
331 check_ercd(ercd, E_ID);
332
333 ercd = wai_sem(TNUM_SEMID+1);
334 check_ercd(ercd, E_ID);
335
336 check_point(3);
337 ercd = act_tsk(TASK3);
338 check_ercd(ercd, E_OK);
339
340 check_point(4);
341 ercd = slp_tsk();
342 check_ercd(ercd, E_OK);
343
344 check_point(12);
345 ercd = act_tsk(TASK2);
346 check_ercd(ercd, E_OK);
347
348 check_point(14);
349 ercd = ref_sem(SEM1, &rsem);
350 check_ercd(ercd, E_OK);
351
352 check_assert(rsem.wtskid == TASK3);
353
354 check_assert(rsem.semcnt == 0);
355
356 check_point(15);
357 ercd = sig_sem(SEM1);
358 check_ercd(ercd, E_OK);
359
360 check_point(16);
361 ercd = sig_sem(SEM1);
362 check_ercd(ercd, E_OK);
363
364 check_point(18);
365 ercd = dis_dsp();
366 check_ercd(ercd, E_OK);
367
368 check_point(19);
369 ercd = sig_sem(SEM1);
370 check_ercd(ercd, E_OK);
371
372 check_point(20);
373 ercd = ena_dsp();
374 check_ercd(ercd, E_OK);
375
376 check_point(22);
377 ercd = sus_tsk(TASK2);
378 check_ercd(ercd, E_OK);
379
380 check_point(23);
381 ercd = sig_sem(SEM1);
382 check_ercd(ercd, E_OK);
383
384 check_point(24);
385 ercd = sig_sem(SEM1);
386 check_ercd(ercd, E_OK);
387
388 check_point(25);
389 ercd = sig_sem(SEM1);
390 check_ercd(ercd, E_QOVR);
391
392 check_point(26);
393 ercd = ref_sem(SEM1, &rsem);
394 check_ercd(ercd, E_OK);
395
396 check_assert(rsem.wtskid == TSK_NONE);
397
398 check_assert(rsem.semcnt == 1);
399
400 check_point(27);
401 ercd = rsm_tsk(TASK2);
402 check_ercd(ercd, E_OK);
403
404 check_point(32);
405 ercd = sig_sem(SEM2);
406 check_ercd(ercd, E_OK);
407
408 check_point(34);
409 ercd = sig_sem(SEM2);
410 check_ercd(ercd, E_OK);
411
412 check_point(35);
413 ercd = sig_sem(SEM2);
414 check_ercd(ercd, E_OK);
415
416 check_point(36);
417 ercd = ref_sem(SEM2, &rsem);
418 check_ercd(ercd, E_OK);
419
420 check_assert(rsem.wtskid == TSK_NONE);
421
422 check_assert(rsem.semcnt == 2);
423
424 check_point(37);
425 ercd = sig_sem(SEM2);
426 check_ercd(ercd, E_QOVR);
427
428 check_point(38);
429 ercd = ref_sem(SEM2, &rsem);
430 check_ercd(ercd, E_OK);
431
432 check_assert(rsem.wtskid == TSK_NONE);
433
434 check_assert(rsem.semcnt == 2);
435
436 check_point(39);
437 ercd = tslp_tsk(10);
438 check_ercd(ercd, E_TMOUT);
439
440 check_point(41);
441 ercd = act_tsk(TASK4);
442 check_ercd(ercd, E_OK);
443
444 check_point(42);
445 ercd = act_tsk(TASK5);
446 check_ercd(ercd, E_OK);
447
448 check_point(43);
449 ercd = rot_rdq(TPRI_SELF);
450 check_ercd(ercd, E_OK);
451
452 check_point(46);
453 ercd = sig_sem(SEM3);
454 check_ercd(ercd, E_OK);
455
456 check_point(48);
457 ercd = sig_sem(SEM3);
458 check_ercd(ercd, E_OK);
459
460 check_point(49);
461 ercd = tslp_tsk(10);
462 check_ercd(ercd, E_TMOUT);
463
464 check_point(51);
465 ercd = sig_sem(SEM3);
466 check_ercd(ercd, E_OK);
467
468 check_point(52);
469 ercd = tslp_tsk(10);
470 check_ercd(ercd, E_TMOUT);
471
472 check_point(54);
473 ercd = sig_sem(SEM3);
474 check_ercd(ercd, E_OK);
475
476 check_point(55);
477 ercd = tslp_tsk(10);
478 check_ercd(ercd, E_TMOUT);
479
480 check_point(57);
481 ercd = rel_wai(TASK2);
482 check_ercd(ercd, E_OK);
483
484 check_point(59);
485 ercd = ini_sem(SEM1);
486 check_ercd(ercd, E_OK);
487
488 check_finish(61);
489 check_point(0);
490}
491
492void
493task2(intptr_t exinf)
494{
495 ER_UINT ercd;
496 T_RSEM rsem;
497
498 check_point(13);
499 ercd = wai_sem(SEM1);
500 check_ercd(ercd, E_OK);
501
502 check_point(17);
503 ercd = wai_sem(SEM1);
504 check_ercd(ercd, E_OK);
505
506 check_point(21);
507 ercd = wai_sem(SEM1);
508 check_ercd(ercd, E_OK);
509
510 check_point(28);
511 ercd = wai_sem(SEM2);
512 check_ercd(ercd, E_OK);
513
514 check_point(29);
515 ercd = ref_sem(SEM2, &rsem);
516 check_ercd(ercd, E_OK);
517
518 check_assert(rsem.wtskid == TSK_NONE);
519
520 check_assert(rsem.semcnt == 1);
521
522 check_point(30);
523 ercd = wai_sem(SEM2);
524 check_ercd(ercd, E_OK);
525
526 check_point(31);
527 ercd = wai_sem(SEM2);
528 check_ercd(ercd, E_OK);
529
530 check_point(33);
531 ercd = wai_sem(SEM3);
532 check_ercd(ercd, E_OK);
533
534 check_point(47);
535 ercd = wai_sem(SEM1);
536 check_ercd(ercd, E_OK);
537
538 ercd = wai_sem(SEM1);
539 check_ercd(ercd, E_RLWAI);
540
541 check_point(58);
542 ercd = wai_sem(SEM1);
543 check_ercd(ercd, E_DLT);
544
545 check_point(60);
546 ercd = ext_tsk();
547
548 check_point(0);
549}
550
551void
552task3(intptr_t exinf)
553{
554 ER_UINT ercd;
555 T_RSEM rsem;
556
557 check_point(5);
558 ercd = wai_sem(SEM1);
559 check_ercd(ercd, E_OK);
560
561 check_point(6);
562 ercd = ref_sem(SEM1, &rsem);
563 check_ercd(ercd, E_OK);
564
565 check_assert(rsem.wtskid == TSK_NONE);
566
567 check_assert(rsem.semcnt == 0);
568
569 check_point(7);
570 ercd = sta_alm(ALM1, 10);
571 check_ercd(ercd, E_OK);
572
573 check_point(8);
574 ercd = wai_sem(SEM1);
575 check_ercd(ercd, E_OK);
576
577 check_point(40);
578 ercd = wai_sem(SEM3);
579 check_ercd(ercd, E_OK);
580
581 check_point(56);
582 ercd = ext_tsk();
583
584 check_point(0);
585}
586
587void
588task4(intptr_t exinf)
589{
590 ER_UINT ercd;
591
592 check_point(44);
593 ercd = wai_sem(SEM3);
594 check_ercd(ercd, E_OK);
595
596 check_point(50);
597 ercd = ext_tsk();
598
599 check_point(0);
600}
601
602void
603task5(intptr_t exinf)
604{
605 ER_UINT ercd;
606
607 check_point(45);
608 ercd = wai_sem(SEM3);
609 check_ercd(ercd, E_OK);
610
611 check_point(53);
612 ercd = ext_tsk();
613
614 check_point(0);
615}
Note: See TracBrowser for help on using the repository browser.