source: asp3_wo_tecs/trunk/test/hrt_systim3.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: 14.4 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: hrt_systim3.c 310 2015-02-08 13:46:46Z ertl-hiro $
53 */
54
55/*
56 * システム時刻管理機能のテスト(3)
57 *
58 * 【テストの目的】
59 *
60 * 周期ハンドラの起動タイミングをテストする.
61 *
62 * また,以下の関数のC1カバレッジを達成する.
63 * tmevtb_dequeue
64 * tmevtb_lefttim
65 *
66 * 【テスト項
67目】
68 *
69 * (A) 周期ハンドラの起動タイミングの確認
70 * (A-1) TA_STA属性で,起動位相(初回の起動時刻)が0の場合
71 * (A-2) TA_STA属性で,起動位相(初回の起動時刻)が0でない場合
72 * (A-3) sta_cycで,起動位相(初回の起動時刻)が0の場合
73 * (A-4) sta_cycで,起動位相(初回の起動時刻)が0でない場合
74 * (A-5) 決められた周期で再起動されること
75 * (B) tmevtb_dequeueの実行/分岐パスの網羅
76
77 * (B-1) signal_time中からの呼び出し
78 * (B-2) å…
79ˆé ­ä»¥å¤–のタイムイベントを削除した場合
80 * (B-3) å…
81ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã‚’削除した場合
82 * (C) tmevtb_lefttimの実行/分岐パスの網羅
83
84 * (C-1) イベントの発生時刻を過ぎている場合
85 * (C-2) イベントの発生時刻を過ぎていない場合
86 *
87 * 【使用リソース】
88 *
89 * 高分解能タイマモジュールの性質:HRT_CONFIG1
90 * TCYC_HRTCNT 未定義(2^32の意味)
91 * TSTEP_HRTCNT 1U
92 * HRTCNT_BOUND 4000000002U
93 *
94 * TASK1: 中優å…
95ˆåº¦ã‚¿ã‚¹ã‚¯ï¼Œãƒ¡ã‚¤ãƒ³ã‚¿ã‚¹ã‚¯ï¼Œæœ€åˆã‹ã‚‰èµ·å‹•
96 * ALM1: アラームハンドラ
97 * CYC1: 周期ハンドラ(周期:1000,初期位相:0)
98 * CYC2: 周期ハンドラ(周期:500,初期位相:499)
99 *
100 * 【補足説明】
101 *
102 * タイムイベントが登録されていない時に高分解能タイマに設定する相対は,
103 * ドリフト調整機能を持たない場合はHRTCNT_BOUNDであるのに対して,ドリ
104 * フト調整機能を持つ場合はTMAX_RELTIMをイベント時刻の伸縮率で割った値
105 * とHRTCNT_BOUNDの小さい方の値(このテストでは,ドリフト量を設定せず,
106 * HRTCNT_BOUND>TMAX_RELTIMであるため,TMAX_RELTIMに一致)となる.そ
107 * こで,HRTCNT_EMPTYをこの値に定義し,ドリフト調整機能の有無によらず
108 * 同じテストシーケンスが使えるようにする.
109 *
110 * 以下のテストシーケンスのコメント中で,「発生:xxx」とは,高分解能タ
111 * イマのカウント値がxxxになった時にタイムイベントが発生することを意味
112 * する.タイムイベントのイベント発生時刻ではない.
113 *
114 * 【テストシーケンス】
115 *
116 * == START ==
117 * // カーネル起動.高分解能タイマのカウント値とイベント時刻は10ずれる
118 * 1: [target_hrt_get_current -> 10U] // CYC1の次回発生:10
119 * 2: [target_hrt_raise_event] // CYC2の次回発生:509
120 * == TASK1(優å…
121ˆåº¦ï¼šä¸­ï¼‰==
122 * 3: DO(target_raise_hrt_int(0U))
123 * == HRT_HANDLER ==
124 * 4: [target_hrt_get_current -> 10U] ... (A-1) // CYC1の発生
125 * == CYC1-1(1回目)== // CYC1の次回発生:1010
126 * 5: RETURN
127 * 6: [target_hrt_get_current -> 20U]
128 * 7: [target_hrt_set_event <- 489U]
129 * == TASK1(続き)==
130 * // ここで時間が経過したことを想定
131 * 8: DO(target_raise_hrt_int(0U))
132 * == HRT_HANDLER ==
133 * 9: [target_hrt_get_current -> 509U] ... (A-2) // CYC2の発生
134 * == CYC2-1(1回目)== // CYC2の次回発生:1009
135 * 10: RETURN
136 * 11: [target_hrt_get_current -> 519U]
137 * 12: [target_hrt_set_event <- 490U]
138 * == TASK1(続き)==
139 * // ここで時間が経過したことを想定
140 * 13: DO(target_raise_hrt_int(0U))
141 * == HRT_HANDLER ==
142 * 14: [target_hrt_get_current -> 1009U] ... (A-5) // CYC2の発生
143 * == CYC2-2(2回目)== // CYC2の次回発生:1509
144 * 15: RETURN
145 * 16: [target_hrt_get_current -> 1010U] ... (A-5) // CYC1の発生
146 * == CYC1-2(2回目)== // CYC1の次回発生:2010
147 * 17: RETURN
148 * 18: [target_hrt_get_current -> 1020U]
149 * 19: [target_hrt_set_event <- 489U]
150 * == TASK1(続き)==
151 * 20: ref_cyc(CYC1, &rcyc) ... (C-2)
152 * 21: [target_hrt_get_current -> 1030U]
153 * 22: assert(rcyc.lefttim == 979U)
154 * 23: stp_cyc(CYC1) ... (B-2)
155 * 24: stp_cyc(CYC2) ... (B-3)
156 * 25: [target_hrt_get_current -> 1040U]
157 * 26: [target_hrt_set_event <- HRTCNT_EMPTY]
158 * 27: sta_cyc(CYC1) ... (A-3)
159 * 28: [target_hrt_get_current -> 1050U] // CYC1の発生:1051
160 * 29: [target_hrt_set_event <- 1U]
161 * 30: DO(target_raise_hrt_int(0U))
162 * == HRT_HANDLER ==
163 * 31: [target_hrt_get_current -> 1051U] // CYC1が発生
164 * == CYC1-3(3回目)== // CYC1の次回発生:2051
165 * 32: RETURN
166 * 33: [target_hrt_get_current -> 1052U]
167 * 34: [target_hrt_set_event <- 999U]
168 * == TASK1(続き)==
169 * 35: sta_cyc(CYC2) ... (A-4)
170 * 36: [target_hrt_get_current -> 1060U] // CYC2の発生:1560
171 * 37: [target_hrt_set_event <- 500U]
172 * // ここで時間が経過したことを想定
173 * 38: ref_cyc(CYC2, &rcyc) ... (C-2)
174 * 39: [target_hrt_get_current -> 1558U]
175 * 40: assert(rcyc.lefttim == 1U)
176 * // 以下のシーケンスは,タイマ割込みの受付が遅
177れた場合にしか発生しない.
178 * 41: ref_cyc(CYC2, &rcyc) ... (C-1)
179 * 42: [target_hrt_get_current -> 1561U] // CYC2の発生時刻を
180 * 43: assert(rcyc.lefttim == 0U) // 過ぎている
181 * 44: DO(target_raise_hrt_int(0U))
182 * == HRT_HANDLER ==
183 * 45: [target_hrt_get_current -> 1562U] // CYC2が発生
184 * == CYC2-3(3回目)== // CYC2の次回発生:2060
185 * 46: RETURN
186 * 47: [target_hrt_get_current -> 1563U]
187 * 48: [target_hrt_set_event <- 488U]
188 * == TASK1(続き)==
189 * // ここで時間が経過したことを想定
190 * 49: sta_alm(ALM1, 100U)
191 * 50: [target_hrt_get_current -> 1620U] // ALM1の発生:1721
192 * 51: [target_hrt_set_event <- 101U]
193 * 52: sta_alm(ALM2, 200U)
194 * 53: [target_hrt_get_current -> 1630U] // ALM2の発生:1831
195 * // ここで時間が経過したことを想定
196 * 54: DO(target_raise_hrt_int(0U))
197 * == HRT_HANDLER ==
198 * 55: [target_hrt_get_current -> 1721] // ALM1が発生
199 * == ALM1-1(1回目)==
200 * 56: stp_alm(ALM2) ... (B-1)
201 * RETURN
202 * 57: [target_hrt_get_current -> 1730U]
203 * 58: [target_hrt_set_event <- 321U]
204 * == TASK1(続き)==
205 * 59: END
206 */
207
208#include <kernel.h>
209#include <t_syslog.h>
210#include "syssvc/test_svc.h"
211#include "kernel_cfg.h"
212#include "hrt_systim3.h"
213#include "target_timer.h"
214
215#if !defined(HRT_CONFIG1) || defined(HRT_CONFIG2)
216#error Compiler option "-DHRT_CONFIG1" is missing.
217#endif
218
219#ifdef TOPPERS_SUPPORT_DRIFT
220#define HRTCNT_EMPTY TMAX_RELTIM
221#else /* TOPPERS_SUPPORT_DRIFT */
222#define HRTCNT_EMPTY HRTCNT_BOUND
223#endif /* TOPPERS_SUPPORT_DRIFT */
224
225#define target_hrt_get_current _kernel_target_hrt_get_current
226#define target_hrt_set_event _kernel_target_hrt_set_event
227#define target_hrt_raise_event _kernel_target_hrt_raise_event
228
229void
230alarm2_handler(intptr_t exinf)
231{
232}
233
234/* DO NOT DELETE THIS LINE -- gentest depends on it. */
235
236static uint_t alarm1_count = 0;
237
238void
239alarm1_handler(intptr_t exinf)
240{
241 ER_UINT ercd;
242
243 switch (++alarm1_count) {
244 case 1:
245 check_point(56);
246 ercd = stp_alm(ALM2);
247 check_ercd(ercd, E_OK);
248
249 return;
250
251 check_point(0);
252
253 default:
254 check_point(0);
255 }
256 check_point(0);
257}
258
259static uint_t cyclic1_count = 0;
260
261void
262cyclic1_handler(intptr_t exinf)
263{
264
265 switch (++cyclic1_count) {
266 case 1:
267 check_point(5);
268 return;
269
270 check_point(0);
271
272 case 2:
273 check_point(17);
274 return;
275
276 check_point(0);
277
278 case 3:
279 check_point(32);
280 return;
281
282 check_point(0);
283
284 default:
285 check_point(0);
286 }
287 check_point(0);
288}
289
290static uint_t cyclic2_count = 0;
291
292void
293cyclic2_handler(intptr_t exinf)
294{
295
296 switch (++cyclic2_count) {
297 case 1:
298 check_point(10);
299 return;
300
301 check_point(0);
302
303 case 2:
304 check_point(15);
305 return;
306
307 check_point(0);
308
309 case 3:
310 check_point(46);
311 return;
312
313 check_point(0);
314
315 default:
316 check_point(0);
317 }
318 check_point(0);
319}
320
321void
322task1(intptr_t exinf)
323{
324 ER_UINT ercd;
325 T_RCYC rcyc;
326
327 check_point(3);
328 target_raise_hrt_int(0U);
329
330 check_point(8);
331 target_raise_hrt_int(0U);
332
333 check_point(13);
334 target_raise_hrt_int(0U);
335
336 check_point(20);
337 ercd = ref_cyc(CYC1, &rcyc);
338 check_ercd(ercd, E_OK);
339
340 check_point(22);
341 check_assert(rcyc.lefttim == 979U);
342
343 check_point(23);
344 ercd = stp_cyc(CYC1);
345 check_ercd(ercd, E_OK);
346
347 check_point(24);
348 ercd = stp_cyc(CYC2);
349 check_ercd(ercd, E_OK);
350
351 check_point(27);
352 ercd = sta_cyc(CYC1);
353 check_ercd(ercd, E_OK);
354
355 check_point(30);
356 target_raise_hrt_int(0U);
357
358 check_point(35);
359 ercd = sta_cyc(CYC2);
360 check_ercd(ercd, E_OK);
361
362 check_point(38);
363 ercd = ref_cyc(CYC2, &rcyc);
364 check_ercd(ercd, E_OK);
365
366 check_point(40);
367 check_assert(rcyc.lefttim == 1U);
368
369 check_point(41);
370 ercd = ref_cyc(CYC2, &rcyc);
371 check_ercd(ercd, E_OK);
372
373 check_point(43);
374 check_assert(rcyc.lefttim == 0U);
375
376 check_point(44);
377 target_raise_hrt_int(0U);
378
379 check_point(49);
380 ercd = sta_alm(ALM1, 100U);
381 check_ercd(ercd, E_OK);
382
383 check_point(52);
384 ercd = sta_alm(ALM2, 200U);
385 check_ercd(ercd, E_OK);
386
387 check_point(54);
388 target_raise_hrt_int(0U);
389
390 check_finish(59);
391 check_point(0);
392}
393
394static uint_t target_hrt_get_current_count = 0;
395
396HRTCNT
397target_hrt_get_current(void)
398{
399
400 switch (++target_hrt_get_current_count) {
401 case 1:
402 test_start(__FILE__);
403
404 check_point(1);
405 return(10U);
406
407 check_point(0);
408
409 case 2:
410 check_point(4);
411 return(10U);
412
413 check_point(0);
414
415 case 3:
416 check_point(6);
417 return(20U);
418
419 check_point(0);
420
421 case 4:
422 check_point(9);
423 return(509U);
424
425 check_point(0);
426
427 case 5:
428 check_point(11);
429 return(519U);
430
431 check_point(0);
432
433 case 6:
434 check_point(14);
435 return(1009U);
436
437 check_point(0);
438
439 case 7:
440 check_point(16);
441 return(1010U);
442
443 check_point(0);
444
445 case 8:
446 check_point(18);
447 return(1020U);
448
449 check_point(0);
450
451 case 9:
452 check_point(21);
453 return(1030U);
454
455 check_point(0);
456
457 case 10:
458 check_point(25);
459 return(1040U);
460
461 check_point(0);
462
463 case 11:
464 check_point(28);
465 return(1050U);
466
467 check_point(0);
468
469 case 12:
470 check_point(31);
471 return(1051U);
472
473 check_point(0);
474
475 case 13:
476 check_point(33);
477 return(1052U);
478
479 check_point(0);
480
481 case 14:
482 check_point(36);
483 return(1060U);
484
485 check_point(0);
486
487 case 15:
488 check_point(39);
489 return(1558U);
490
491 check_point(0);
492
493 case 16:
494 check_point(42);
495 return(1561U);
496
497 check_point(0);
498
499 case 17:
500 check_point(45);
501 return(1562U);
502
503 check_point(0);
504
505 case 18:
506 check_point(47);
507 return(1563U);
508
509 check_point(0);
510
511 case 19:
512 check_point(50);
513 return(1620U);
514
515 check_point(0);
516
517 case 20:
518 check_point(53);
519 return(1630U);
520
521 check_point(0);
522
523 case 21:
524 check_point(55);
525 return(1721);
526
527 check_point(0);
528
529 case 22:
530 check_point(57);
531 return(1730U);
532
533 check_point(0);
534
535 default:
536 check_point(0);
537 }
538 check_point(0);
539 return(0U);
540}
541
542static uint_t target_hrt_raise_event_count = 0;
543
544void
545target_hrt_raise_event(void)
546{
547
548 switch (++target_hrt_raise_event_count) {
549 case 1:
550 check_point(2);
551 return;
552
553 check_point(0);
554
555 default:
556 check_point(0);
557 }
558 check_point(0);
559}
560
561static uint_t target_hrt_set_event_count = 0;
562
563void
564target_hrt_set_event(HRTCNT hrtcnt)
565{
566
567 switch (++target_hrt_set_event_count) {
568 case 1:
569 check_point(7);
570 check_assert(hrtcnt == 489U);
571
572 return;
573
574 check_point(0);
575
576 case 2:
577 check_point(12);
578 check_assert(hrtcnt == 490U);
579
580 return;
581
582 check_point(0);
583
584 case 3:
585 check_point(19);
586 check_assert(hrtcnt == 489U);
587
588 return;
589
590 check_point(0);
591
592 case 4:
593 check_point(26);
594 check_assert(hrtcnt == HRTCNT_EMPTY);
595
596 return;
597
598 check_point(0);
599
600 case 5:
601 check_point(29);
602 check_assert(hrtcnt == 1U);
603
604 return;
605
606 check_point(0);
607
608 case 6:
609 check_point(34);
610 check_assert(hrtcnt == 999U);
611
612 return;
613
614 check_point(0);
615
616 case 7:
617 check_point(37);
618 check_assert(hrtcnt == 500U);
619
620 return;
621
622 check_point(0);
623
624 case 8:
625 check_point(48);
626 check_assert(hrtcnt == 488U);
627
628 return;
629
630 check_point(0);
631
632 case 9:
633 check_point(51);
634 check_assert(hrtcnt == 101U);
635
636 return;
637
638 check_point(0);
639
640 case 10:
641 check_point(58);
642 check_assert(hrtcnt == 321U);
643
644 return;
645
646 check_point(0);
647
648 default:
649 check_point(0);
650 }
651 check_point(0);
652}
Note: See TracBrowser for help on using the repository browser.