source: rtos_arduino/trunk/asp_1.9.2/test/test_sem2.c@ 136

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

ライブラリとOS及びベーシックなサンプルの追加.

File size: 11.2 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2008-2013 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 2534 2013-10-13 12:27:37Z ertl-hiro $
53 */
54
55/*
56 * セマフォ機能のテスト(2)
57 *
58 * 【テストの目的】
59 *
60 * isig_semを,sig_semとの違いを中心にテストする.
61 * pol_sem,twai_semを,wai_semとの違いを中心にテストする.
62 *
63 * 【テスト項
64目】
65 *
66 * (A) isig_semの静的エラーのテスト
67 * (A-1) タスクコンテキストからの呼出し
68 * (A-2) CPUロック状æ…
69‹ã‹ã‚‰ã®å‘¼å‡ºã—
70 * (B) isig_semによりセマフォ待
71ち状æ…
72‹ã®ã‚¿ã‚¹ã‚¯ãŒå¾…
73ち解除される
74 * (B-1) アイドル状æ…
75‹ã‹ã‚‰ï¼Œå¾…
76ち解除されたタスクに切り換わる
77 * (B-2) 実行状æ…
78‹ã®ã‚¿ã‚¹ã‚¯ã‹ã‚‰ï¼Œå¾…
79ち解除されたタスクに切り換わる
80 * (B-3) ディスパッチ保留状æ…
81‹ã§ï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
82 * (B-4) 待
83ち解除されたタスクが強制待
84ち状æ…
85‹ã§ï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
86 * (B-5) 待
87ち解除されたタスクが優å…
88ˆåº¦ãŒä½Žãï¼Œåˆ‡ã‚Šæ›ã‚ã‚‰ãªã„
89 * (C) pol_semの静的エラーのテスト
90 * (C-1) 非タスクコンテキストからの呼出し
91 * (C-2) CPUロック状æ…
92‹ã‹ã‚‰ã®å‘¼å‡ºã—
93 * (C-3) ディスパッチ禁止状æ…
94‹ã‹ã‚‰ã®å‘¼å‡ºã—(E_CTXエラーにならない)
95 * (C-4) 割込み優å…
96ˆåº¦ãƒžã‚¹ã‚¯å…
97¨è§£é™¤ã§ãªã„状æ…
98‹ã‹ã‚‰ã®å‘¼å‡ºã—(E_CTXエラー
99 * にならない)
100 * (D) pol_semでポーリング失敗する
101 * (E) twai_semの静的エラーのテスト
102 * (E-1) 非タスクコンテキストからの呼出し
103 * (E-2) CPUロック状æ…
104‹ã‹ã‚‰ã®å‘¼å‡ºã—
105 * (E-3) ディスパッチ禁止状æ…
106‹ã‹ã‚‰ã®å‘¼å‡ºã—
107 * (E-4) 割込み優å…
108ˆåº¦ãƒžã‚¹ã‚¯å…
109¨è§£é™¤ã§ãªã„状æ…
110‹ã‹ã‚‰ã®å‘¼å‡ºã—
111 * (E-5) tmoutが不正
112 * (F) twai_semでtmout=TMO_POLの時にポーリング失敗する
113 * (G) twai_semでtmout=TMO_FEVRの時にセマフォ待
114ち状æ…
115‹ã«ãªã‚‹
116 * (H) twai_semでtmoutにタイムアウトを設定した時に,タイムアウト付きの
117 * セマフォ待
118ち状æ…
119‹ã«ãªã‚‹
120 *
121 * 【使用リソース】
122 *
123 * TASK1: 中優å…
124ˆåº¦ã‚¿ã‚¹ã‚¯ï¼ŒTA_ACT属性
125 * TASK2: 高優å…
126ˆåº¦ã‚¿ã‚¹ã‚¯
127 * TASK3: 低優å…
128ˆåº¦ã‚¿ã‚¹ã‚¯
129 * TASK4: 中優å…
130ˆåº¦ã‚¿ã‚¹ã‚¯
131 * TASK5: 中優å…
132ˆåº¦ã‚¿ã‚¹ã‚¯
133 * ALM1: アラームハンドラ
134 * SEM1: TA_NULL属性,初期資源数1,最大資源数1
135 *
136 * 【テストシーケンス】
137 *
138 * == TASK1(優å…
139ˆåº¦ï¼šä¸­ï¼‰==
140 * 1: isig_sem(SEM1) -> E_CTX ... (A-1)
141 * 2: loc_cpu()
142 * pol_sem(SEM1) -> E_CTX ... (C-2)
143 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-2)
144 * unl_cpu()
145 * 3: dis_dsp()
146 * pol_sem(SEM1) ... (C-3)
147 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-3)
148 * ena_dsp()
149 * 4: 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 * 5: twai_sem(SEM1, -2) -> E_PAR ... (E-5)
154 * twai_sem(SEM1, TMO_POL) -> E_TMOUT ... (F)
155 * 6: sta_alm(ALM1, 10)
156 * 7: twai_sem(SEM1, TMO_FEVR) ... (G)
157 * == ALM1-1 ==
158 * 8: pol_sem(SEM1) -> E_CTX ... (C-1)
159 * twai_sem(SEM1, TMO_POL) -> E_CTX ... (E-1)
160 * 9: iloc_cpu()
161 * isig_sem(SEM1) -> E_CTX ... (A-2)
162 * iunl_cpu()
163 * 10: isig_sem(SEM1) ... (B-1)
164 * RETURN
165 * == TASK1(続き)==
166 * 11: act_tsk(TASK3)
167 * 12: wai_sem(SEM1)
168 * == TASK3(優å…
169ˆåº¦ï¼šä½Žï¼‰==
170 * 13: sta_alm(ALM1, 10)
171 * call(wait_var())
172 * == ALM1-2 ==
173 * 14: isig_sem(SEM1) ... (B-2)
174 * call(signal_var())
175 * RETURN
176 * == TASK1(続き)==
177 * 15: wai_sem(SEM1)
178 * == TASK3(続き)==
179 * 16: sta_alm(ALM1, 10)
180 * dis_dsp()
181 * call(wait_var())
182 * == ALM1-3 ==
183 * 17: isig_sem(SEM1) ... (B-3)
184 * call(signal_var())
185 * RETURN
186 * == TASK3(続き)==
187 * 18: ena_dsp()
188 * == TASK1(続き)==
189 * 19: wai_sem(SEM1)
190 * == TASK3(続き)==
191 * 20: sta_alm(ALM1, 10)
192 * sus_tsk(TASK1)
193 * call(wait_var())
194 * == ALM1-4 ==
195 * 21: isig_sem(SEM1) ... (B-4)
196 * call(signal_var())
197 * RETURN
198 * == TASK3(続き)==
199 * 22: rsm_tsk(TASK1)
200 * == TASK1(続き)==
201 * 23: act_tsk(TASK2)
202 * == TASK2(優å…
203ˆåº¦ï¼šé«˜ï¼‰==
204 * 24: tslp_tsk(10) -> E_TMOUT
205 * == TASK1(続き)==
206 * 25: wai_sem(SEM1)
207 * == TASK3(続き)==
208 * 26: ext_tsk() -> noreturn
209 * == TASK2(続き)==
210 * 27: sta_alm(ALM1, 10)
211 * call(wait_var())
212 * == ALM1-5 ==
213 * 28: isig_sem(SEM1) ... (B-5)
214 * call(signal_var())
215 * RETURN
216 * == TASK2(続き)==
217 * 29: ext_tsk() -> noreturn
218 * == TASK1(続き)==
219 * 30: sta_alm(ALM1, 10)
220 * 31: twai_sem(SEM1, 100) -> E_RLWAI
221 * == ALM1-6 ==
222 * 32: irel_wai(TASK1)
223 * RETURN
224 * == TASK1(続き)==
225 * 33: sta_alm(ALM1, 100)
226 * 34: twai_sem(SEM1, 10) -> E_TMOUT ... (H)
227 * 35: stp_alm(ALM1)
228 * 36: END
229 */
230
231#include <kernel.h>
232#include <test_lib.h>
233#include <t_syslog.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(8);
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(9);
271 ercd = iloc_cpu();
272 check_ercd(ercd, E_OK);
273
274 ercd = isig_sem(SEM1);
275 check_ercd(ercd, E_CTX);
276
277 ercd = iunl_cpu();
278 check_ercd(ercd, E_OK);
279
280 check_point(10);
281 ercd = isig_sem(SEM1);
282 check_ercd(ercd, E_OK);
283
284 return;
285
286 check_point(0);
287
288 case 2:
289 check_point(14);
290 ercd = isig_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(17);
301 ercd = isig_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(21);
312 ercd = isig_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(28);
323 ercd = isig_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(32);
334 ercd = irel_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 = isig_sem(SEM1);
356 check_ercd(ercd, E_CTX);
357
358 check_point(2);
359 ercd = loc_cpu();
360 check_ercd(ercd, E_OK);
361
362 ercd = pol_sem(SEM1);
363 check_ercd(ercd, E_CTX);
364
365 ercd = twai_sem(SEM1, TMO_POL);
366 check_ercd(ercd, E_CTX);
367
368 ercd = unl_cpu();
369 check_ercd(ercd, E_OK);
370
371 check_point(3);
372 ercd = dis_dsp();
373 check_ercd(ercd, E_OK);
374
375 ercd = pol_sem(SEM1);
376 check_ercd(ercd, E_OK);
377
378 ercd = twai_sem(SEM1, TMO_POL);
379 check_ercd(ercd, E_CTX);
380
381 ercd = ena_dsp();
382 check_ercd(ercd, E_OK);
383
384 check_point(4);
385 ercd = chg_ipm(TMAX_INTPRI);
386 check_ercd(ercd, E_OK);
387
388 ercd = pol_sem(SEM1);
389 check_ercd(ercd, E_TMOUT);
390
391 ercd = twai_sem(SEM1, TMO_POL);
392 check_ercd(ercd, E_CTX);
393
394 ercd = chg_ipm(TIPM_ENAALL);
395 check_ercd(ercd, E_OK);
396
397 check_point(5);
398 ercd = twai_sem(SEM1, -2);
399 check_ercd(ercd, E_PAR);
400
401 ercd = twai_sem(SEM1, TMO_POL);
402 check_ercd(ercd, E_TMOUT);
403
404 check_point(6);
405 ercd = sta_alm(ALM1, 10);
406 check_ercd(ercd, E_OK);
407
408 check_point(7);
409 ercd = twai_sem(SEM1, TMO_FEVR);
410 check_ercd(ercd, E_OK);
411
412 check_point(11);
413 ercd = act_tsk(TASK3);
414 check_ercd(ercd, E_OK);
415
416 check_point(12);
417 ercd = wai_sem(SEM1);
418 check_ercd(ercd, E_OK);
419
420 check_point(15);
421 ercd = wai_sem(SEM1);
422 check_ercd(ercd, E_OK);
423
424 check_point(19);
425 ercd = wai_sem(SEM1);
426 check_ercd(ercd, E_OK);
427
428 check_point(23);
429 ercd = act_tsk(TASK2);
430 check_ercd(ercd, E_OK);
431
432 check_point(25);
433 ercd = wai_sem(SEM1);
434 check_ercd(ercd, E_OK);
435
436 check_point(30);
437 ercd = sta_alm(ALM1, 10);
438 check_ercd(ercd, E_OK);
439
440 check_point(31);
441 ercd = twai_sem(SEM1, 100);
442 check_ercd(ercd, E_RLWAI);
443
444 check_point(33);
445 ercd = sta_alm(ALM1, 100);
446 check_ercd(ercd, E_OK);
447
448 check_point(34);
449 ercd = twai_sem(SEM1, 10);
450 check_ercd(ercd, E_TMOUT);
451
452 check_point(35);
453 ercd = stp_alm(ALM1);
454 check_ercd(ercd, E_OK);
455
456 check_finish(36);
457 check_point(0);
458}
459
460void
461task2(intptr_t exinf)
462{
463 ER_UINT ercd;
464
465 check_point(24);
466 ercd = tslp_tsk(10);
467 check_ercd(ercd, E_TMOUT);
468
469 check_point(27);
470 ercd = sta_alm(ALM1, 10);
471 check_ercd(ercd, E_OK);
472
473 wait_var();
474
475 check_point(29);
476 ercd = ext_tsk();
477
478 check_point(0);
479}
480
481void
482task3(intptr_t exinf)
483{
484 ER_UINT ercd;
485
486 check_point(13);
487 ercd = sta_alm(ALM1, 10);
488 check_ercd(ercd, E_OK);
489
490 wait_var();
491
492 check_point(16);
493 ercd = sta_alm(ALM1, 10);
494 check_ercd(ercd, E_OK);
495
496 ercd = dis_dsp();
497 check_ercd(ercd, E_OK);
498
499 wait_var();
500
501 check_point(18);
502 ercd = ena_dsp();
503 check_ercd(ercd, E_OK);
504
505 check_point(20);
506 ercd = sta_alm(ALM1, 10);
507 check_ercd(ercd, E_OK);
508
509 ercd = sus_tsk(TASK1);
510 check_ercd(ercd, E_OK);
511
512 wait_var();
513
514 check_point(22);
515 ercd = rsm_tsk(TASK1);
516 check_ercd(ercd, E_OK);
517
518 check_point(26);
519 ercd = ext_tsk();
520
521 check_point(0);
522}
Note: See TracBrowser for help on using the repository browser.