source: asp3_wo_tecs/trunk/extension/ovrhdr/test/test_ovrhdr1.c@ 306

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

3.1.0を反映

File size: 11.7 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2014-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_ovrhdr1.c 738 2016-04-05 14:19:24Z ertl-hiro $
53 */
54
55/*
56 * オーバランハンドラ機能のテスト(1)
57 *
58 * 【テストの目的】
59 *
60 * 【テスト項
61目】
62 *
63 * 【使用リソース】
64 *
65 * TASK1: 中優å…
66ˆåº¦ã‚¿ã‚¹ã‚¯ï¼Œãƒ¡ã‚¤ãƒ³ã‚¿ã‚¹ã‚¯ï¼Œæœ€åˆã‹ã‚‰èµ·å‹•
67 * TASK2: 高優å…
68ˆåº¦ã‚¿ã‚¹ã‚¯
69 * TASK3: 高優å…
70ˆåº¦ã‚¿ã‚¹ã‚¯
71 * ALM1: アラームハンドラ
72 * OVR: オーバランハンドラ
73 *
74 * 【テストシーケンス】
75 *
76 * == TASK1(優å…
77ˆåº¦ï¼šä¸­ï¼‰==
78 * 1: ref_ovr(TASK2, &rovr)
79 * assert(rovr.ovrstat == TOVR_STP)
80 * // TASK2, TASK3に対して,残りプロセッサ時間(4 * TEST_TIME_CP)
81 * // μ秒で,オーバランハンドラを動作開始する
82 * sta_ovr(TASK2, 4 * TEST_TIME_CP)
83 * ref_ovr(TASK2, &rovr)
84 * assert(rovr.ovrstat == TOVR_STA)
85 * assert(rovr.leftotm == 4 * TEST_TIME_CP)
86 * sta_ovr(TASK3, 4 * TEST_TIME_CP)
87 * // (2 * TEST_TIME_CP)μ秒後にALM1を動作させる
88 * sta_alm(ALM1, 2 * TEST_TIME_CP) ... ALM1-1が実行開始するまで
89 * DO(hrtcnt1 = fch_hrt())
90 * act_tsk(TASK2)
91 * == TASK2(優å…
92ˆåº¦ï¼šé«˜ï¼‰==
93 * // start_rでオーバランタイマが動作開始する
94 * 2: act_tsk(TASK3)
95 * DO(while(!task2_flag1))
96 * == ALM1-1(1回目)==
97 * // TASK2の実行途中でALM1が動作する
98 * // 割込みå…
99¥å£å‡¦ç†ã§ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãŒåœæ­¢ã™ã‚‹
100 * 3: rot_rdq(HIGH_PRIORITY)
101 * RETURN
102 * == TASK3(優å…
103ˆåº¦ï¼šé«˜ï¼‰==
104 * // start_rでオーバランタイマが動作開始する
105 * // TASK2のオーバランハンドラ状æ…
106‹ã‚’確認する
107 * 4: ref_ovr(TASK2, &rovr)
108 * assert(rovr.ovrstat == TOVR_STA)
109 * assert(TEST_TIME_CP <= rovr.leftotm && rovr.leftotm <= 3 * TEST_TIME_CP)
110 * DO(while(!task3_flag1))
111 * == OVR-1(1回目)==
112 * // TASK3の残りプロセッサ時間がなくなる
113 * 5: assert(tskid == TASK3)
114 * DO(task3_flag1 = true)
115 * RETURN
116 * == TASK3(続き)==
117 * 6: DO(task2_flag1 = true)
118 * slp_tsk()
119 * == TASK2(続き)==
120 * // 割込み出口処理でオーバランタイマが動作開始する
121 * 7: DO(while(!task2_flag2))
122 * == OVR-2(2回目)==
123 * // TASK2の残りプロセッサ時間がなくなる
124 * 8: assert(tskid == TASK2)
125 * DO(task2_flag2 = true)
126 * RETURN
127 * == TASK2(続き)==
128 * 9: slp_tsk()
129 * == TASK1(続き)==
130 * 10: DO(hrtcnt2 = fch_hrt())
131 * assert(8 * TEST_TIME_CP <= hrtcnt2 - hrtcnt1 \
132 * && hrtcnt2 - hrtcnt1 <= 12 * TEST_TIME_CP)
133 * ref_ovr(TASK2, &rovr)
134 * assert(rovr.ovrstat == TOVR_STP)
135 * sta_ovr(TASK2, 4 * TEST_TIME_CP)
136 * sta_alm(ALM1, 2 * TEST_TIME_CP) ... ALM1-2が実行開始するまで
137 * DO(hrtcnt1 = fch_hrt())
138 * wup_tsk(TASK2)
139 * == TASK2(続き)==
140 * // dispatch_rでオーバランタイマが動作開始する
141 * 11: wup_tsk(TASK3)
142 * DO(while(!task2_flag3))
143 * == ALM1-2(2回目)==
144 * // TASK2の実行途中でALM1が動作する
145 * // 割込みå…
146¥å£å‡¦ç†ã§ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãŒåœæ­¢ã™ã‚‹
147 * 12: DO(task2_flag3 = true)
148 * RETURN
149 * == TASK2(続き)==
150 * 13: rot_rdq(HIGH_PRIORITY)
151 * // dispatch_rでオーバランタイマが停止する
152 * == TASK3(続き)==
153 * 14: sta_alm(ALM1, 2 * TEST_TIME_CP) ... ALM1-3が実行開始するまで
154 * sta_ovr(TSK_SELF, 4 * TEST_TIME_CP)
155 * // sta_ovrでオーバランタイマが動作開始する
156 * // TASK2の残りプロセッサ時間を(4 * TEST_TIME_CP)μ秒に設定しなおす
157 * sta_ovr(TASK2, 4 * TEST_TIME_CP)
158 * 15: DO(while(!task3_flag2))
159 * == ALM1-3(3回目)==
160 * // TASK3の実行途中でALM1が動作する
161 * // 割込みå…
162¥å£å‡¦ç†ã§ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãŒåœæ­¢ã™ã‚‹
163 * 16: DO(task3_flag2 = true)
164 * RETURN
165 * == TASK3(続き)==
166 * // TASK3の残りプロセッサ時間を(4 * TEST_TIME_CP)μ秒に設定しなおす
167 * 17: sta_ovr(TSK_SELF, 4 * TEST_TIME_CP)
168 * // sta_ovrでオーバランタイマが停止&動作開始する
169 * DO(while(!task3_flag3))
170 * == OVR-3(3回目)==
171 * // TASK3の残りプロセッサ時間がなくなる
172 * 18: DO(task3_flag3 = true)
173 * sta_ovr(TSK_SELF, 4 * TEST_TIME_CP) -> E_ID
174 * // TASK3の残りプロセッサ時間を(4 * TEST_TIME_CP)μ秒に設定しなおす
175 * sta_ovr(TASK3, 2 * TEST_TIME_CP)
176 * RETURN
177 * == TASK3(続き)==
178 * 19: DO(while(!task3_flag4))
179 * == OVR-4(4回目)==
180 * // TASK3の残りプロセッサ時間がなくなる
181 * 20: DO(task3_flag4 = true)
182 * rot_rdq(HIGH_PRIORITY)
183 * RETURN
184 * == TASK2(続き)==
185 * // dispatch_rでオーバランタイマが動作開始する
186 * 21: DO(while(!task2_flag4))
187 * == OVR-5(5回目)==
188 * // TASK2の残りプロセッサ時間がなくなる
189 * 22: DO(task2_flag4 = true)
190 * RETURN
191 * == TASK2(続き)==
192 * 23: slp_tsk()
193 * == TASK3(続き)==
194 * 24: slp_tsk()
195 * == TASK1(続き)==
196 * 25: DO(hrtcnt2 = fch_hrt())
197 * assert(14 * TEST_TIME_CP <= hrtcnt2 - hrtcnt1 \
198 * && hrtcnt2 - hrtcnt1 <= 19 * TEST_TIME_CP)
199 * 26: END
200 */
201
202#include <kernel.h>
203#include <t_syslog.h>
204#include "syssvc/test_svc.h"
205#include "kernel_cfg.h"
206#include "test_ovrhdr1.h"
207
208volatile bool_t task2_flag1 = false;
209volatile bool_t task2_flag2 = false;
210volatile bool_t task2_flag3 = false;
211volatile bool_t task2_flag4 = false;
212volatile bool_t task3_flag1 = false;
213volatile bool_t task3_flag2 = false;
214volatile bool_t task3_flag3 = false;
215volatile bool_t task3_flag4 = false;
216
217HRTCNT hrtcnt1, hrtcnt2;
218
219/* DO NOT DELETE THIS LINE -- gentest depends on it. */
220
221static uint_t alarm1_count = 0;
222
223void
224alarm1_handler(intptr_t exinf)
225{
226 ER_UINT ercd;
227
228 switch (++alarm1_count) {
229 case 1:
230 check_point(3);
231 ercd = rot_rdq(HIGH_PRIORITY);
232 check_ercd(ercd, E_OK);
233
234 return;
235
236 check_point(0);
237
238 case 2:
239 check_point(12);
240 task2_flag3 = true;
241
242 return;
243
244 check_point(0);
245
246 case 3:
247 check_point(16);
248 task3_flag2 = true;
249
250 return;
251
252 check_point(0);
253
254 default:
255 check_point(0);
256 }
257 check_point(0);
258}
259
260static uint_t overrun_count = 0;
261
262void
263overrun_handler(ID tskid, intptr_t exinf)
264{
265 ER_UINT ercd;
266
267 switch (++overrun_count) {
268 case 1:
269 check_point(5);
270 check_assert(tskid == TASK3);
271
272 task3_flag1 = true;
273
274 return;
275
276 check_point(0);
277
278 case 2:
279 check_point(8);
280 check_assert(tskid == TASK2);
281
282 task2_flag2 = true;
283
284 return;
285
286 check_point(0);
287
288 case 3:
289 check_point(18);
290 task3_flag3 = true;
291
292 ercd = sta_ovr(TSK_SELF, 4 * TEST_TIME_CP);
293 check_ercd(ercd, E_ID);
294
295 ercd = sta_ovr(TASK3, 2 * TEST_TIME_CP);
296 check_ercd(ercd, E_OK);
297
298 return;
299
300 check_point(0);
301
302 case 4:
303 check_point(20);
304 task3_flag4 = true;
305
306 ercd = rot_rdq(HIGH_PRIORITY);
307 check_ercd(ercd, E_OK);
308
309 return;
310
311 check_point(0);
312
313 case 5:
314 check_point(22);
315 task2_flag4 = true;
316
317 return;
318
319 check_point(0);
320
321 default:
322 check_point(0);
323 }
324 check_point(0);
325}
326
327void
328task1(intptr_t exinf)
329{
330 ER_UINT ercd;
331 T_ROVR rovr;
332
333 test_start(__FILE__);
334
335 check_point(1);
336 ercd = ref_ovr(TASK2, &rovr);
337 check_ercd(ercd, E_OK);
338
339 check_assert(rovr.ovrstat == TOVR_STP);
340
341 ercd = sta_ovr(TASK2, 4 * TEST_TIME_CP);
342 check_ercd(ercd, E_OK);
343
344 ercd = ref_ovr(TASK2, &rovr);
345 check_ercd(ercd, E_OK);
346
347 check_assert(rovr.ovrstat == TOVR_STA);
348
349 check_assert(rovr.leftotm == 4 * TEST_TIME_CP);
350
351 ercd = sta_ovr(TASK3, 4 * TEST_TIME_CP);
352 check_ercd(ercd, E_OK);
353
354 ercd = sta_alm(ALM1, 2 * TEST_TIME_CP);
355 check_ercd(ercd, E_OK);
356
357 hrtcnt1 = fch_hrt();
358
359 ercd = act_tsk(TASK2);
360 check_ercd(ercd, E_OK);
361
362 check_point(10);
363 hrtcnt2 = fch_hrt();
364
365 check_assert(8 * TEST_TIME_CP <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 12 * TEST_TIME_CP);
366
367 ercd = ref_ovr(TASK2, &rovr);
368 check_ercd(ercd, E_OK);
369
370 check_assert(rovr.ovrstat == TOVR_STP);
371
372 ercd = sta_ovr(TASK2, 4 * TEST_TIME_CP);
373 check_ercd(ercd, E_OK);
374
375 ercd = sta_alm(ALM1, 2 * TEST_TIME_CP);
376 check_ercd(ercd, E_OK);
377
378 hrtcnt1 = fch_hrt();
379
380 ercd = wup_tsk(TASK2);
381 check_ercd(ercd, E_OK);
382
383 check_point(25);
384 hrtcnt2 = fch_hrt();
385
386 check_assert(14 * TEST_TIME_CP <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 19 * TEST_TIME_CP);
387
388 check_finish(26);
389 check_point(0);
390}
391
392void
393task2(intptr_t exinf)
394{
395 ER_UINT ercd;
396
397 check_point(2);
398 ercd = act_tsk(TASK3);
399 check_ercd(ercd, E_OK);
400
401 while(!task2_flag1);
402
403 check_point(7);
404 while(!task2_flag2);
405
406 check_point(9);
407 ercd = slp_tsk();
408 check_ercd(ercd, E_OK);
409
410 check_point(11);
411 ercd = wup_tsk(TASK3);
412 check_ercd(ercd, E_OK);
413
414 while(!task2_flag3);
415
416 check_point(13);
417 ercd = rot_rdq(HIGH_PRIORITY);
418 check_ercd(ercd, E_OK);
419
420 check_point(21);
421 while(!task2_flag4);
422
423 check_point(23);
424 ercd = slp_tsk();
425 check_ercd(ercd, E_OK);
426
427 check_point(0);
428}
429
430void
431task3(intptr_t exinf)
432{
433 ER_UINT ercd;
434 T_ROVR rovr;
435
436 check_point(4);
437 ercd = ref_ovr(TASK2, &rovr);
438 check_ercd(ercd, E_OK);
439
440 check_assert(rovr.ovrstat == TOVR_STA);
441
442 check_assert(TEST_TIME_CP <= rovr.leftotm && rovr.leftotm <= 3 * TEST_TIME_CP);
443
444 while(!task3_flag1);
445
446 check_point(6);
447 task2_flag1 = true;
448
449 ercd = slp_tsk();
450 check_ercd(ercd, E_OK);
451
452 check_point(14);
453 ercd = sta_alm(ALM1, 2 * TEST_TIME_CP);
454 check_ercd(ercd, E_OK);
455
456 ercd = sta_ovr(TSK_SELF, 4 * TEST_TIME_CP);
457 check_ercd(ercd, E_OK);
458
459 ercd = sta_ovr(TASK2, 4 * TEST_TIME_CP);
460 check_ercd(ercd, E_OK);
461
462 check_point(15);
463 while(!task3_flag2);
464
465 check_point(17);
466 ercd = sta_ovr(TSK_SELF, 4 * TEST_TIME_CP);
467 check_ercd(ercd, E_OK);
468
469 while(!task3_flag3);
470
471 check_point(19);
472 while(!task3_flag4);
473
474 check_point(24);
475 ercd = slp_tsk();
476 check_ercd(ercd, E_OK);
477
478 check_point(0);
479}
Note: See TracBrowser for help on using the repository browser.