source: asp3_wo_tecs/trunk/test/test_sem2.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 11.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2008-2015 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者
9は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再é…
12å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再é…
18å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
19å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
20 * 者
21マニュアルなど)に,上記の著作権表示,この利用条件および下記
22 * の無保証規定を掲載すること.
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再é…
25å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
26 * と.
27 * (a) 再é…
28å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
29マニュアルなど)に,上記の著
30 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
31 * (b) 再é…
32å¸ƒã®å½¢æ…
33‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
34 * 報告すること.
35 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
36 * 害からも,上記著作権者
37およびTOPPERSプロジェクトをå…
38è²¬ã™ã‚‹ã“と.
39 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40 * 由に基づく請求からも,上記著作権者
41およびTOPPERSプロジェクトを
42 * å…
43è²¬ã™ã‚‹ã“と.
44 *
45 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
46お
47 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
48 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
49 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
50 * の責任を負わない.
51 *
52 * $Id: test_sem2.c 310 2015-02-08 13:46:46Z ertl-hiro $
53 */
54
55/*
56 * セマフォ機能のテスト(2)
57 *
58 * 【テストの目的】
59 *
60 * sig_semを,非タスクコンテキストからの呼び出した場合について,タスク
61 * コンテキストからの呼び出した場合との違いを中心にテストする.
62 * pol_sem,twai_semを,wai_semとの違いを中心にテストする.
63 *
64 * 【テスト項
65目】
66 *
67 * (A) sig_sem(非タスクコンテキストからの呼出し)の静的エラーのテスト
68 * (A-1) CPUロック状æ…
69‹ã‹ã‚‰ã®å‘¼å‡ºã—
70 * (B) sig_sem(非タスクコンテキストからの呼出し)によりセマフォ待
71ち状
72 * æ…
73‹ã®ã‚¿ã‚¹ã‚¯ãŒå¾…
74ち解除される場合のテスト
75 * (B-1) アイドル状æ…
76‹ã‹ã‚‰ï¼Œå¾…
77ち解除されたタスクに切り換わる
78 * (B-2) 実行状æ…
79‹ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ï¼Œå¾…
80ち解除されたタスクに切り換わる
81 * (B-3) ディスパッチ保留状æ…
82‹ã§ï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
83 * (B-4) 待
84ち解除されたタスクが強制待
85ち状æ…
86‹ã§ï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
87 * (B-5) 待
88ち解除されたタスクが優å…
89ˆåº¦ãŒä½Žãï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
90 * (C) pol_semの静的エラーのテスト
91 * (C-1) 非タスクコンテキストからの呼出し
92 * (C-2) CPUロック状æ…
93‹ã‹ã‚‰ã®å‘¼å‡ºã—
94 * (C-3) ディスパッチ禁止状æ…
95‹ã‹ã‚‰ã®å‘¼å‡ºã—(E_CTXエラーにならない)
96 * (C-4) 割込み優å…
97ˆåº¦ãƒžã‚¹ã‚¯å…
98¨è§£é™¤ã§ãªã„状æ…
99‹ã‹ã‚‰ã®å‘¼å‡ºã—(E_CTXエラー
100 * にならない)
101 * (D) pol_semでポーリング失敗する
102 * (E) twai_semの静的エラーのテスト
103 * (E-1) 非タスクコンテキストからの呼出し
104 * (E-2) CPUロック状æ…
105‹ã‹ã‚‰ã®å‘¼å‡ºã—
106 * (E-3) ディスパッチ禁止状æ…
107‹ã‹ã‚‰ã®å‘¼å‡ºã—
108 * (E-4) 割込み優å…
109ˆåº¦ãƒžã‚¹ã‚¯å…
110¨è§£é™¤ã§ãªã„状æ…
111‹ã‹ã‚‰ã®å‘¼å‡ºã—
112 * (E-5) tmoutが不正
113 * (F) twai_semでtmout=TMO_POLの時にポーリング失敗する
114 * (G) twai_semでtmout=TMO_FEVRの時にセマフォ待
115ち状æ…
116‹ã«ãªã‚‹
117 * (H) twai_semでtmoutにタイムアウトを設定した時に,タイムアウト付きの
118 * セマフォ待
119ち状æ…
120‹ã«ãªã‚‹
121 *
122 * 【使用リソース】
123 *
124 * TASK1: 中優å…
125ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ŒTA_ACT属性
126 * TASK2: 高優å…
127ˆåº¦ã‚¿ã‚¹ã‚¯
128 * TASK3: 低優å…
129ˆåº¦ã‚¿ã‚¹ã‚¯
130 * TASK4: 中優å…
131ˆåº¦ã‚¿ã‚¹ã‚¯
132 * TASK5: 中優å…
133ˆåº¦ã‚¿ã‚¹ã‚¯
134 * ALM1: アラームハンドラ
135 * SEM1: TA_NULL属性,初期資源数1,最大資源数1
136 *
137 * 【テストシーケンス】
138 *
139 * == TASK1(優å…
140ˆåº¦ï¼šä¸­ï¼‰==
141 * 1: loc_cpu()
142 * pol_sem(SEM1) -> E_CTX ... (C-2)
143 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-2)
144 * unl_cpu()
145 * 2: dis_dsp()
146 * pol_sem(SEM1) ... (C-3)
147 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-3)
148 * ena_dsp()
149 * 3: chg_ipm(TMAX_INTPRI)
150 * pol_sem(SEM1) -> E_TMOUT ... (C-4)(D)
151 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-4)
152 * chg_ipm(TIPM_ENAALL)
153 * 4: twai_sem(SEM1, TMO_NBLK) -> E_PAR ... (E-5)
154 * twai_sem(SEM1, TMO_POL) -> E_TMOUT ... (F)
155 * 5: sta_alm(ALM1, 10000U)
156 * 6: twai_sem(SEM1, TMO_FEVR) ... (G)
157 * == ALM1-1 ==
158 * 7: pol_sem(SEM1) -> E_CTX ... (C-1)
159 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-1)
160 * 8: loc_cpu()
161 * sig_sem(SEM1) -> E_CTX ... (A-1)
162 * unl_cpu()
163 * 9: sig_sem(SEM1) ... (B-1)
164 * RETURN
165 * == TASK1(続き)==
166 * 10: act_tsk(TASK3)
167 * 11: wai_sem(SEM1)
168 * == TASK3(優å…
169ˆåº¦ï¼šä½Žï¼‰==
170 * 12: sta_alm(ALM1, 10000U)
171 * call(wait_var())
172 * == ALM1-2 ==
173 * 13: sig_sem(SEM1) ... (B-2)
174 * call(signal_var())
175 * RETURN
176 * == TASK1(続き)==
177 * 14: wai_sem(SEM1)
178 * == TASK3(続き)==
179 * 15: sta_alm(ALM1, 10000U)
180 * dis_dsp()
181 * call(wait_var())
182 * == ALM1-3 ==
183 * 16: sig_sem(SEM1) ... (B-3)
184 * call(signal_var())
185 * RETURN
186 * == TASK3(続き)==
187 * 17: ena_dsp()
188 * == TASK1(続き)==
189 * 18: wai_sem(SEM1)
190 * == TASK3(続き)==
191 * 19: sta_alm(ALM1, 10000U)
192 * sus_tsk(TASK1)
193 * call(wait_var())
194 * == ALM1-4 ==
195 * 20: sig_sem(SEM1) ... (B-4)
196 * call(signal_var())
197 * RETURN
198 * == TASK3(続き)==
199 * 21: rsm_tsk(TASK1)
200 * == TASK1(続き)==
201 * 22: act_tsk(TASK2)
202 * == TASK2(優å…
203ˆåº¦ï¼šé«˜ï¼‰==
204 * 23: tslp_tsk(10000U) -> E_TMOUT
205 * == TASK1(続き)==
206 * 24: wai_sem(SEM1)
207 * == TASK3(続き)==
208 * 25: ext_tsk() -> noreturn
209 * == TASK2(続き)==
210 * 26: sta_alm(ALM1, 10000U)
211 * call(wait_var())
212 * == ALM1-5 ==
213 * 27: sig_sem(SEM1) ... (B-5)
214 * call(signal_var())
215 * RETURN
216 * == TASK2(続き)==
217 * 28: ext_tsk() -> noreturn
218 * == TASK1(続き)==
219 * 29: sta_alm(ALM1, 10000U)
220 * 30: twai_sem(SEM1, 100000U) -> E_RLWAI
221 * == ALM1-6 ==
222 * 31: rel_wai(TASK1)
223 * RETURN
224 * == TASK1(続き)==
225 * 32: sta_alm(ALM1, 100000U)
226 * 33: twai_sem(SEM1, 10000U) -> E_TMOUT ... (H)
227 * 34: stp_alm(ALM1)
228 * 35: END
229 */
230
231#include <kernel.h>
232#include <t_syslog.h>
233#include "syssvc/test_svc.h"
234#include "kernel_cfg.h"
235#include "test_sem2.h"
236
237static volatile bool_t flagvar;
238
239static void
240wait_var(void)
241{
242 flagvar = false;
243 while (!flagvar);
244}
245
246static void
247signal_var(void)
248{
249 flagvar = true;
250}
251
252/* DO NOT DELETE THIS LINE -- gentest depends on it. */
253
254static uint_t alarm1_count = 0;
255
256void
257alarm1_handler(intptr_t exinf)
258{
259 ER_UINT ercd;
260
261 switch (++alarm1_count) {
262 case 1:
263 check_point(7);
264 ercd = pol_sem(SEM1);
265 check_ercd(ercd, E_CTX);
266
267 ercd = twai_sem(SEM1, TMO_POL);
268 check_ercd(ercd, E_CTX);
269
270 check_point(8);
271 ercd = loc_cpu();
272 check_ercd(ercd, E_OK);
273
274 ercd = sig_sem(SEM1);
275 check_ercd(ercd, E_CTX);
276
277 ercd = unl_cpu();
278 check_ercd(ercd, E_OK);
279
280 check_point(9);
281 ercd = sig_sem(SEM1);
282 check_ercd(ercd, E_OK);
283
284 return;
285
286 check_point(0);
287
288 case 2:
289 check_point(13);
290 ercd = sig_sem(SEM1);
291 check_ercd(ercd, E_OK);
292
293 signal_var();
294
295 return;
296
297 check_point(0);
298
299 case 3:
300 check_point(16);
301 ercd = sig_sem(SEM1);
302 check_ercd(ercd, E_OK);
303
304 signal_var();
305
306 return;
307
308 check_point(0);
309
310 case 4:
311 check_point(20);
312 ercd = sig_sem(SEM1);
313 check_ercd(ercd, E_OK);
314
315 signal_var();
316
317 return;
318
319 check_point(0);
320
321 case 5:
322 check_point(27);
323 ercd = sig_sem(SEM1);
324 check_ercd(ercd, E_OK);
325
326 signal_var();
327
328 return;
329
330 check_point(0);
331
332 case 6:
333 check_point(31);
334 ercd = rel_wai(TASK1);
335 check_ercd(ercd, E_OK);
336
337 return;
338
339 check_point(0);
340
341 default:
342 check_point(0);
343 }
344 check_point(0);
345}
346
347void
348task1(intptr_t exinf)
349{
350 ER_UINT ercd;
351
352 test_start(__FILE__);
353
354 check_point(1);
355 ercd = loc_cpu();
356 check_ercd(ercd, E_OK);
357
358 ercd = pol_sem(SEM1);
359 check_ercd(ercd, E_CTX);
360
361 ercd = twai_sem(SEM1, TMO_POL);
362 check_ercd(ercd, E_CTX);
363
364 ercd = unl_cpu();
365 check_ercd(ercd, E_OK);
366
367 check_point(2);
368 ercd = dis_dsp();
369 check_ercd(ercd, E_OK);
370
371 ercd = pol_sem(SEM1);
372 check_ercd(ercd, E_OK);
373
374 ercd = twai_sem(SEM1, TMO_POL);
375 check_ercd(ercd, E_CTX);
376
377 ercd = ena_dsp();
378 check_ercd(ercd, E_OK);
379
380 check_point(3);
381 ercd = chg_ipm(TMAX_INTPRI);
382 check_ercd(ercd, E_OK);
383
384 ercd = pol_sem(SEM1);
385 check_ercd(ercd, E_TMOUT);
386
387 ercd = twai_sem(SEM1, TMO_POL);
388 check_ercd(ercd, E_CTX);
389
390 ercd = chg_ipm(TIPM_ENAALL);
391 check_ercd(ercd, E_OK);
392
393 check_point(4);
394 ercd = twai_sem(SEM1, TMO_NBLK);
395 check_ercd(ercd, E_PAR);
396
397 ercd = twai_sem(SEM1, TMO_POL);
398 check_ercd(ercd, E_TMOUT);
399
400 check_point(5);
401 ercd = sta_alm(ALM1, 10000U);
402 check_ercd(ercd, E_OK);
403
404 check_point(6);
405 ercd = twai_sem(SEM1, TMO_FEVR);
406 check_ercd(ercd, E_OK);
407
408 check_point(10);
409 ercd = act_tsk(TASK3);
410 check_ercd(ercd, E_OK);
411
412 check_point(11);
413 ercd = wai_sem(SEM1);
414 check_ercd(ercd, E_OK);
415
416 check_point(14);
417 ercd = wai_sem(SEM1);
418 check_ercd(ercd, E_OK);
419
420 check_point(18);
421 ercd = wai_sem(SEM1);
422 check_ercd(ercd, E_OK);
423
424 check_point(22);
425 ercd = act_tsk(TASK2);
426 check_ercd(ercd, E_OK);
427
428 check_point(24);
429 ercd = wai_sem(SEM1);
430 check_ercd(ercd, E_OK);
431
432 check_point(29);
433 ercd = sta_alm(ALM1, 10000U);
434 check_ercd(ercd, E_OK);
435
436 check_point(30);
437 ercd = twai_sem(SEM1, 100000U);
438 check_ercd(ercd, E_RLWAI);
439
440 check_point(32);
441 ercd = sta_alm(ALM1, 100000U);
442 check_ercd(ercd, E_OK);
443
444 check_point(33);
445 ercd = twai_sem(SEM1, 10000U);
446 check_ercd(ercd, E_TMOUT);
447
448 check_point(34);
449 ercd = stp_alm(ALM1);
450 check_ercd(ercd, E_OK);
451
452 check_finish(35);
453 check_point(0);
454}
455
456void
457task2(intptr_t exinf)
458{
459 ER_UINT ercd;
460
461 check_point(23);
462 ercd = tslp_tsk(10000U);
463 check_ercd(ercd, E_TMOUT);
464
465 check_point(26);
466 ercd = sta_alm(ALM1, 10000U);
467 check_ercd(ercd, E_OK);
468
469 wait_var();
470
471 check_point(28);
472 ercd = ext_tsk();
473
474 check_point(0);
475}
476
477void
478task3(intptr_t exinf)
479{
480 ER_UINT ercd;
481
482 check_point(12);
483 ercd = sta_alm(ALM1, 10000U);
484 check_ercd(ercd, E_OK);
485
486 wait_var();
487
488 check_point(15);
489 ercd = sta_alm(ALM1, 10000U);
490 check_ercd(ercd, E_OK);
491
492 ercd = dis_dsp();
493 check_ercd(ercd, E_OK);
494
495 wait_var();
496
497 check_point(17);
498 ercd = ena_dsp();
499 check_ercd(ercd, E_OK);
500
501 check_point(19);
502 ercd = sta_alm(ALM1, 10000U);
503 check_ercd(ercd, E_OK);
504
505 ercd = sus_tsk(TASK1);
506 check_ercd(ercd, E_OK);
507
508 wait_var();
509
510 check_point(21);
511 ercd = rsm_tsk(TASK1);
512 check_ercd(ercd, E_OK);
513
514 check_point(25);
515 ercd = ext_tsk();
516
517 check_point(0);
518}
Note: See TracBrowser for help on using the repository browser.