source: asp3_wo_tecs/trunk/extension/drift/test/hrt_drift1.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: 15.6 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_drift1.c 314 2015-02-08 14:54:01Z ertl-hiro $
53 */
54
55/*
56 * ドリフト調整機能のテスト(1)
57 *
58 * 【テストの目的】
59 *
60 * ドリフト調整機能を網羅
61的にテストする.å…
62·ä½“的には,ドリフト調整機能
63 * を追加することで追加・拡張された関数を中心にテストする.
64 *
65 * 【テスト項
66目】
67 *
68 * (A) set_timの要求ベーステスト
69 * (A-1) CPUロック状æ…
70‹ã‹ã‚‰ã®å‘¼å‡ºã—ï¼»NGKI3598ï¼½
71 * (A-2) driftがTMIN_DRIFTより小さい[NGKI3599]
72 * (A-3) driftがTMAX_DRIFTより大きい[NGKI3599]
73 * (A-4) ドリフト量がdriftで指定した値に設定される[NGKI3601]
74 * (B) update_current_evttim
75 * (B-1) ドリフト量が正で端数の繰り上がりがない時
76 * (B-2) ドリフト量が正で端数の繰り上がりがある時
77 * (B-3) ドリフト量が負で端数の繰り上がりがない時
78 * (B-4) ドリフト量が負で端数の繰り上がりがある時
79 * ※ (current_evttim_frac >= 2000000U)のパスは単体でテストしたい
80 * (C) calc_current_evttim_ub(tmevtb_enqueueからの呼び出し)
81 * (C-1) ドリフト量が正で端数の繰り上がりがない時
82 * (C-2) ドリフト量が正で端数の繰り上がりがある時
83 * (C-3) ドリフト量が負で端数の繰り上がりがない時
84 * (C-4) ドリフト量が負で端数の繰り上がりがある時
85 * (D) calc_current_evttim_ub(tmevt_lefttimからの呼び出し)
86 * (D-1) ドリフト量が正で端数の繰り上がりがない時
87 * (D-2) ドリフト量が正で端数の繰り上がりがある時
88 * (D-3) ドリフト量が負で端数の繰り上がりがない時
89 * (D-4) ドリフト量が負で端数の繰り上がりがある時
90 * (E) set_hrt_event
91 * (E-1) ドリフト量が正でタイムイベントヒープが空の時
92 * (E-2) ドリフト量が正でhrtcntがHRTCNT_BOUNDを超
93える時 … 別にテスト
94 * (E-3) ドリフト量が正でhrtcntがHRTCNT_BOUNDを超
95えない時
96 * (E-4) ドリフト量が負でタイムイベントヒープが空の時
97 * (E-5) ドリフト量が負でhrtcntがHRTCNT_BOUNDを超
98える時 … 別にテスト
99 * (E-6) ドリフト量が負でhrtcntがHRTCNT_BOUNDを超
100えない時
101 * ※ (c1 > HRTCNT_BOUND / 1000000U)のパスは単体でテストしたい
102 *
103 * 【使用リソース】
104 *
105 * 高分解能タイマモジュールの性質:HRT_CONFIG1
106 * TCYC_HRTCNT 未定義(2^32の意味)
107 * TSTEP_HRTCNT 1U
108 * HRTCNT_BOUND 4000000002U
109 *
110 * TASK1: 中優å…
111ˆåº¦ã‚¿ã‚¹ã‚¯ï¼Œãƒ¡ã‚¤ãƒ³ã‚¿ã‚¹ã‚¯ï¼Œæœ€åˆã‹ã‚‰èµ·å‹•
112 * ALM1: アラームハンドラ
113 *
114 * 【補足説明】
115 *
116 * 以下のテストシーケンスのコメント中で,「発生:xxx」とは,高分解能タ
117 * イマのカウント値がxxxになった時にタイムイベントが発生することを意味
118 * する.タイムイベントのイベント発生時刻ではない.
119 *
120 * 【テストシーケンス】
121 *
122 * == START ==
123 * // カーネル起動.高分解能タイマのカウント値とイベント時刻は10ずれる
124 * 1: [target_hrt_get_current -> 10U]
125 * 2: [target_hrt_set_event <- HRTCNT_EMPTY]
126 * == TASK1(優å…
127ˆåº¦ï¼šä¸­ï¼‰==
128 * // ドリフト量を+1%に設定
129 * // 現時点:hrtcnt=20,evttim=10,evttim_frac=0
130 * 3: set_dft(+10000)
131 * 4: [target_hrt_get_current -> 20U]
132 * 5: [target_hrt_set_event <- HRTCNT_EMPTY_P1P] ... (E-1)
133 * // タイムイベントを登録
134 * 6: sta_alm(ALM1, 100) ... (C-2)
135 * 7: [target_hrt_get_current -> 30U]
136 * // 現時点:hrtcnt=30,evttim=20,evttim_frac=100000
137 * // 大きい方に丸めた : evttim=21,evttim_frac=110000
138 * // 相対時間:100,イベント発生時刻:122
139 * // カウント値:(101900000 / 1010000)の切り上げ → 101
140 * 8: [target_hrt_set_event <- 101U] ... (E-3)
141 * // ここで時間が経過したことを想定
142 * // ドリフト調整が効く直前
143 * 9: get_tim(&systim) ... (B-1)
144 * 10: [target_hrt_get_current -> 119U]
145 * // 現時点:hrtcnt=119,evttim=109,evttim_frac=990000
146 * 11: assert(systim == 109U)
147 * // ここでドリフト調整が効く(システム時刻が2進む)
148 * 12: get_tim(&systim) ... (B-2)
149 * 13: [target_hrt_get_current -> 120U]
150 * // 現時点:hrtcnt=120,evttim=111,evttim_frac=0
151 * 14: assert(systim == 111U)
152 * // ここで時間が経過したことを想定
153 * 15: DO(target_raise_hrt_int(0U))
154 * == HRT_HANDLER ==
155 * 16: [target_hrt_get_current -> 131U] // ALM1が発生
156 * // 現時点:hrtcnt=131,evttim=122,evttim_frac=110000
157 * == ALM1-1(1回目)==
158 * 17: RETURN
159 * // タイムイベントがなくなった場合
160 * 18: [target_hrt_get_current -> 140U]
161 * 19: [target_hrt_set_event <- HRTCNT_EMPTY_P1P]
162 * == TASK1(続き)==
163 * // ここで時間が経過したことを想定
164 * // ドリフト調整が効く直前
165 * 20: get_tim(&systim) ... (B-1)
166 * 21: [target_hrt_get_current -> 219U]
167 * // 現時点:hrtcnt=219,evttim=210,evttim_frac=990000
168 * 22: assert(systim == 210U)
169 * // タイムイベントを登録
170 * 23: sta_alm(ALM1, 100U) ... (C-1)
171 * 24: [target_hrt_get_current -> 219U]
172 * // 現時点:hrtcnt=219,evttim=210,evttim_frac=990000
173 * // 大きい方に丸めた : evttim=212,evttim_frac=0
174 * // 相対時間:100,イベント発生時刻:312
175 * // カウント値:(101010000 / 1010000)の切り上げ → 101
176 * 25: [target_hrt_set_event <- 101U]
177 * // ここでドリフト調整が効く
178 * 26: get_tim(&systim) ... (B-2)
179 * 27: [target_hrt_get_current -> 220U]
180 * // 現時点:hrtcnt=220,evttim=212,evttim_frac=0
181 * 28: assert(systim == 212U)
182 *
183 * // ドリフト量を-1%に設定(端数が0になるタイミングで設定)
184 * 29: set_dft(-10000)
185 * 30: [target_hrt_get_current -> 220U]
186 * // 現時点:hrtcnt=220,evttim=212,evttim_frac=0
187 * // カウント値:(100000000 / 990000)の切り上げ → 102
188 * 31: [target_hrt_set_event <- 102U] ... (E-6)
189 * // ドリフト調整がすぐに効く
190 * 32: get_tim(&systim) ... (B-3)
191 * 33: [target_hrt_get_current -> 221U]
192 * // 現時点:hrtcnt=221,evttim=212,evttim_frac=990000
193 * 34: assert(systim == 212U)
194 * // ここで時間が経過したことを想定
195 * // ドリフト調整が次に効く直前
196 * 35: get_tim(&systim)
197 * 36: [target_hrt_get_current -> 320U] ... (B-4)
198 * // 現時点:hrtcnt=320,evttim=311,evttim_frac=0
199 * 37: assert(systim == 311U)
200 * // ここでドリフト調整が効く
201 * 38: get_tim(&systim)
202 * 39: [target_hrt_get_current -> 321U] ... (B-3)
203 * // 現時点:hrtcnt=321,evttim=311,evttim_frac=990000
204 * 40: assert(systim == 311U)
205 * 41: DO(target_raise_hrt_int(0U))
206 * == HRT_HANDLER ==
207 * 42: [target_hrt_get_current -> 322U] // ALM1が発生
208 * // 現時点:hrtcnt=322,evttim=312,evttim_frac=980000
209 * == ALM1-2(2回目)==
210 * 43: RETURN
211 * // タイムイベントがなくなった場合
212 * 44: [target_hrt_get_current -> 330U]
213 * // 現時点:hrtcnt=330,evttim=320,evttim_frac=900000
214 * 45: [target_hrt_set_event <- HRTCNT_EMPTY_M1P] ... (E-4)
215 * == TASK1(続き)==
216 * // ここで時間が経過したことを想定
217 *
218 * // ドリフト量を+1%に設定(端数が0.5になるタイミングで設定)
219 * 46: set_dft(+10000)
220 * 47: [target_hrt_get_current -> 370U]
221 * // 現時点:hrtcnt=370,evttim=360,evttim_frac=500000
222 * 48: [target_hrt_set_event <- HRTCNT_EMPTY_P1P]
223 * 49: get_tim(&systim)
224 * 50: [target_hrt_get_current -> 370U]
225 * // 現時点:hrtcnt=370,evttim=360,evttim_frac=500000
226 * 51: assert(systim == 360U)
227 * // ドリフト調整が効く直前
228 * 52: get_tim(&systim)
229 * 53: [target_hrt_get_current -> 419U]
230 * // 現時点:hrtcnt=419,evttim=409,evttim_frac=990000
231 * 54: assert(systim == 409U)
232 * // ここでドリフト調整が効く
233 * 55: get_tim(&systim)
234 * 56: [target_hrt_get_current -> 420U]
235 * // 現時点:hrtcnt=420,evttim=411,evttim_frac=0
236 * 57: assert(systim == 411U)
237 * 58: END
238 */
239
240#include <kernel.h>
241#include <t_syslog.h>
242#include "syssvc/test_svc.h"
243#include "kernel_cfg.h"
244#include "hrt_drift1.h"
245#include "target_timer.h"
246
247#if !defined(HRT_CONFIG1) || defined(HRT_CONFIG2)
248#error Compiler option "-DHRT_CONFIG1" is missing.
249#endif
250
251#define HRTCNT_EMPTY 4000000000U
252#define HRTCNT_EMPTY_P1P 3960396040U
253#define HRTCNT_EMPTY_M1P HRTCNT_BOUND
254
255#define target_hrt_get_current _kernel_target_hrt_get_current
256#define target_hrt_set_event _kernel_target_hrt_set_event
257#define target_hrt_raise_event _kernel_target_hrt_raise_event
258
259void
260target_hrt_raise_event(void)
261{
262}
263
264/* DO NOT DELETE THIS LINE -- gentest depends on it. */
265
266static uint_t alarm1_count = 0;
267
268void
269alarm1_handler(intptr_t exinf)
270{
271
272 switch (++alarm1_count) {
273 case 1:
274 check_point(17);
275 return;
276
277 check_point(0);
278
279 case 2:
280 check_point(43);
281 return;
282
283 check_point(0);
284
285 default:
286 check_point(0);
287 }
288 check_point(0);
289}
290
291void
292task1(intptr_t exinf)
293{
294 ER_UINT ercd;
295 SYSTIM systim;
296
297 check_point(3);
298 ercd = set_dft(+10000);
299 check_ercd(ercd, E_OK);
300
301 check_point(6);
302 ercd = sta_alm(ALM1, 100);
303 check_ercd(ercd, E_OK);
304
305 check_point(9);
306 ercd = get_tim(&systim);
307 check_ercd(ercd, E_OK);
308
309 check_point(11);
310 check_assert(systim == 109U);
311
312 check_point(12);
313 ercd = get_tim(&systim);
314 check_ercd(ercd, E_OK);
315
316 check_point(14);
317 check_assert(systim == 111U);
318
319 check_point(15);
320 target_raise_hrt_int(0U);
321
322 check_point(20);
323 ercd = get_tim(&systim);
324 check_ercd(ercd, E_OK);
325
326 check_point(22);
327 check_assert(systim == 210U);
328
329 check_point(23);
330 ercd = sta_alm(ALM1, 100U);
331 check_ercd(ercd, E_OK);
332
333 check_point(26);
334 ercd = get_tim(&systim);
335 check_ercd(ercd, E_OK);
336
337 check_point(28);
338 check_assert(systim == 212U);
339
340 check_point(29);
341 ercd = set_dft(-10000);
342 check_ercd(ercd, E_OK);
343
344 check_point(32);
345 ercd = get_tim(&systim);
346 check_ercd(ercd, E_OK);
347
348 check_point(34);
349 check_assert(systim == 212U);
350
351 check_point(35);
352 ercd = get_tim(&systim);
353 check_ercd(ercd, E_OK);
354
355 check_point(37);
356 check_assert(systim == 311U);
357
358 check_point(38);
359 ercd = get_tim(&systim);
360 check_ercd(ercd, E_OK);
361
362 check_point(40);
363 check_assert(systim == 311U);
364
365 check_point(41);
366 target_raise_hrt_int(0U);
367
368 check_point(46);
369 ercd = set_dft(+10000);
370 check_ercd(ercd, E_OK);
371
372 check_point(49);
373 ercd = get_tim(&systim);
374 check_ercd(ercd, E_OK);
375
376 check_point(51);
377 check_assert(systim == 360U);
378
379 check_point(52);
380 ercd = get_tim(&systim);
381 check_ercd(ercd, E_OK);
382
383 check_point(54);
384 check_assert(systim == 409U);
385
386 check_point(55);
387 ercd = get_tim(&systim);
388 check_ercd(ercd, E_OK);
389
390 check_point(57);
391 check_assert(systim == 411U);
392
393 check_finish(58);
394 check_point(0);
395}
396
397static uint_t target_hrt_get_current_count = 0;
398
399HRTCNT
400target_hrt_get_current(void)
401{
402
403 switch (++target_hrt_get_current_count) {
404 case 1:
405 test_start(__FILE__);
406
407 check_point(1);
408 return(10U);
409
410 check_point(0);
411
412 case 2:
413 check_point(4);
414 return(20U);
415
416 check_point(0);
417
418 case 3:
419 check_point(7);
420 return(30U);
421
422 check_point(0);
423
424 case 4:
425 check_point(10);
426 return(119U);
427
428 check_point(0);
429
430 case 5:
431 check_point(13);
432 return(120U);
433
434 check_point(0);
435
436 case 6:
437 check_point(16);
438 return(131U);
439
440 check_point(0);
441
442 case 7:
443 check_point(18);
444 return(140U);
445
446 check_point(0);
447
448 case 8:
449 check_point(21);
450 return(219U);
451
452 check_point(0);
453
454 case 9:
455 check_point(24);
456 return(219U);
457
458 check_point(0);
459
460 case 10:
461 check_point(27);
462 return(220U);
463
464 check_point(0);
465
466 case 11:
467 check_point(30);
468 return(220U);
469
470 check_point(0);
471
472 case 12:
473 check_point(33);
474 return(221U);
475
476 check_point(0);
477
478 case 13:
479 check_point(36);
480 return(320U);
481
482 check_point(0);
483
484 case 14:
485 check_point(39);
486 return(321U);
487
488 check_point(0);
489
490 case 15:
491 check_point(42);
492 return(322U);
493
494 check_point(0);
495
496 case 16:
497 check_point(44);
498 return(330U);
499
500 check_point(0);
501
502 case 17:
503 check_point(47);
504 return(370U);
505
506 check_point(0);
507
508 case 18:
509 check_point(50);
510 return(370U);
511
512 check_point(0);
513
514 case 19:
515 check_point(53);
516 return(419U);
517
518 check_point(0);
519
520 case 20:
521 check_point(56);
522 return(420U);
523
524 check_point(0);
525
526 default:
527 check_point(0);
528 }
529 check_point(0);
530 return(0U);
531}
532
533static uint_t target_hrt_set_event_count = 0;
534
535void
536target_hrt_set_event(HRTCNT hrtcnt)
537{
538
539 switch (++target_hrt_set_event_count) {
540 case 1:
541 check_point(2);
542 check_assert(hrtcnt == HRTCNT_EMPTY);
543
544 return;
545
546 check_point(0);
547
548 case 2:
549 check_point(5);
550 check_assert(hrtcnt == HRTCNT_EMPTY_P1P);
551
552 return;
553
554 check_point(0);
555
556 case 3:
557 check_point(8);
558 check_assert(hrtcnt == 101U);
559
560 return;
561
562 check_point(0);
563
564 case 4:
565 check_point(19);
566 check_assert(hrtcnt == HRTCNT_EMPTY_P1P);
567
568 return;
569
570 check_point(0);
571
572 case 5:
573 check_point(25);
574 check_assert(hrtcnt == 101U);
575
576 return;
577
578 check_point(0);
579
580 case 6:
581 check_point(31);
582 check_assert(hrtcnt == 102U);
583
584 return;
585
586 check_point(0);
587
588 case 7:
589 check_point(45);
590 check_assert(hrtcnt == HRTCNT_EMPTY_M1P);
591
592 return;
593
594 check_point(0);
595
596 case 8:
597 check_point(48);
598 check_assert(hrtcnt == HRTCNT_EMPTY_P1P);
599
600 return;
601
602 check_point(0);
603
604 default:
605 check_point(0);
606 }
607 check_point(0);
608}
Note: See TracBrowser for help on using the repository browser.