source: asp3_wo_tecs/trunk/test/hrt_systim4.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: 10.1 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_systim4.c 310 2015-02-08 13:46:46Z ertl-hiro $
53 */
54
55/*
56 * システム時刻管理機能のテスト(4)
57 *
58 * 【テストの目的】
59 *
60 * 高分解能タイマモジュールの性質が異なる場合のテスト.高分解能タイマ
61 * モジュールの性質を表す3つの定数を参ç…
62§ã—ている箇所を網羅
63的にテストす
64 * る.
65 *
66 * 【テスト項
67目】
68 *
69 * (A) update_current_evttimでTCYC_HRTCNTを参ç…
70§ã—ている箇所のテスト
71 * (A-1) カウント値が周回していない場合
72 * (A-2) カウント値が周回している場合
73 * (A-3) カウント値が前回と同じ場合(境界のケース)
74 * (B) calc_current_evttim_ub(TSTEP_HRTCNTを参ç…
75§ã—ている)を呼び出し
76 * ている処理のテスト
77 * (B-1) tmevtb_enqueueでのタイムイベントの発生時刻の計算
78 * (B-2) tmevt_lefttimでのタイムイベントが発生するまでの時間の計算
79 * (C) set_hrt_eventでHRTCNT_BOUNDを参ç…
80§ã—ている箇所のテスト
81 * (C-1) 登録されているタイムイベントがない時
82 * (C-2) å…
83ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã¾ã§ã®æ™‚間がHRTCNT_BOUNDを超
84える時
85 * (C-3) å…
86ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã¾ã§ã®æ™‚間がHRTCNT_BOUND以下の時
87 *
88 * 【使用リソース】
89 *
90 * 高分解能タイマモジュールの性質:HRT_CONFIG2
91 * TCYC_HRTCNT (0x10000U * 10U)
92 * TSTEP_HRTCNT 10U
93 * HRTCNT_BOUND (0x10000U * 9U)
94 *
95 * TASK1: 中優å…
96ˆåº¦ã‚¿ã‚¹ã‚¯ï¼Œãƒ¡ã‚¤ãƒ³ã‚¿ã‚¹ã‚¯ï¼Œæœ€åˆã‹ã‚‰èµ·å‹•
97 * ALM1: アラームハンドラ
98 * ALM2: アラームハンドラ
99 * ALM3: アラームハンドラ
100 *
101 * 【補足説明】
102 *
103 * 以下のテストシーケンスのコメント中で,「発生:xxx」とは,高分解能タ
104 * イマのカウント値がxxxになった時にタイムイベントが発生することを意味
105 * する.タイムイベントのイベント発生時刻ではない.
106 *
107 * 【テストシーケンス】
108 *
109 * == START ==
110 * // カーネル起動.高分解能タイマのカウント値とイベント時刻は10ずれる
111 * 1: [target_hrt_get_current -> 10U]
112 * 2: [target_hrt_set_event <- HRTCNT_EMPTY]
113 * == TASK1(優å…
114ˆåº¦ï¼šä¸­ï¼‰==
115 * // タイムイベントを2つ登録
116 * 3: sta_alm(ALM1, 100U)
117 * 4: [target_hrt_get_current -> 20U] ... (A-1) // 発生:130
118 * 5: [target_hrt_set_event <- 110U] ... (B-1)(C-3)
119 * 6: sta_alm(ALM2, 105U)
120 * 7: [target_hrt_get_current -> 20U] ... (A-3) // 発生:135
121 * 8: DO(target_raise_hrt_int(1U))
122 * slp_tsk()
123 * == HRT_HANDLER ==
124 * 9: [target_hrt_get_current -> 130U] // ALM1が発生
125 * == ALM1-1(1回目)==
126 * 10: wup_tsk(TASK1)
127 * RETURN
128 * 11: [target_hrt_get_current -> 130U] ... (A-3)
129 * 12: [target_hrt_set_event <- 5U] ... (B-1)
130 * == TASK1(続き)== // ALM2までの時間は5
131 * 13: DO(target_raise_hrt_int(0U))
132 * == HRT_HANDLER ==
133 * 14: [target_hrt_get_current -> 140U] // ALM2が発生
134 * == ALM2-1(1回目)==
135 * 15: RETURN
136 * // タイムイベントがなくなった場合
137 * 16: [target_hrt_get_current -> 150U]
138 * 17: [target_hrt_set_event <- HRTCNT_EMPTY] ... (C-1)
139 * == TASK1(続き)==
140 * // 発生時刻までの長いタイムイベントを登録
141 * 18: sta_alm(ALM1, 1000000U)
142 * 19: [target_hrt_get_current -> 160U] // 発生:1000170
143 * 20: [target_hrt_set_event <- HRTCNT_BOUND] ... (C-2)
144 * 21: ref_alm(ALM1, &ralm)
145 * 22: [target_hrt_get_current -> 170U]
146 * 23: assert(ralm.lefttim == 999990U)
147 * // ここで長い時間が経過したと想定
148 * 24: DO(target_raise_hrt_int(0U))
149 * == HRT_HANDLER ==
150 * 25: [target_hrt_get_current -> 600000U]
151 * 26: [target_hrt_set_event <- 400170U]
152 * == TASK1(続き)==
153 * // ここで長い時間が経過したと想定
154 * 27: DO(target_raise_hrt_int(0U))
155 * == HRT_HANDLER ==
156 * 28: [target_hrt_get_current -> 344810U] ... (A-2) // ALM1が発生
157 * == ALM1-2(2回目)==
158 * 29: RETURN
159 * 30: [target_hrt_get_current -> 344810U]
160 * 31: [target_hrt_set_event <- HRTCNT_EMPTY]
161 * == TASK1(続き)==
162 * 32: END
163 */
164
165#include <kernel.h>
166#include <t_syslog.h>
167#include "syssvc/test_svc.h"
168#include "kernel_cfg.h"
169#include "hrt_systim4.h"
170#include "target_timer.h"
171
172#if defined(HRT_CONFIG1) || !defined(HRT_CONFIG2)
173#error Compiler option "-DHRT_CONFIG2" is missing.
174#endif
175
176#define HRTCNT_EMPTY HRTCNT_BOUND
177
178#define target_hrt_get_current _kernel_target_hrt_get_current
179#define target_hrt_set_event _kernel_target_hrt_set_event
180#define target_hrt_raise_event _kernel_target_hrt_raise_event
181
182void
183target_hrt_raise_event(void)
184{
185}
186
187/* DO NOT DELETE THIS LINE -- gentest depends on it. */
188
189static uint_t alarm1_count = 0;
190
191void
192alarm1_handler(intptr_t exinf)
193{
194 ER_UINT ercd;
195
196 switch (++alarm1_count) {
197 case 1:
198 check_point(10);
199 ercd = wup_tsk(TASK1);
200 check_ercd(ercd, E_OK);
201
202 return;
203
204 check_point(0);
205
206 case 2:
207 check_point(29);
208 return;
209
210 check_point(0);
211
212 default:
213 check_point(0);
214 }
215 check_point(0);
216}
217
218static uint_t alarm2_count = 0;
219
220void
221alarm2_handler(intptr_t exinf)
222{
223
224 switch (++alarm2_count) {
225 case 1:
226 check_point(15);
227 return;
228
229 check_point(0);
230
231 default:
232 check_point(0);
233 }
234 check_point(0);
235}
236
237void
238task1(intptr_t exinf)
239{
240 ER_UINT ercd;
241 T_RALM ralm;
242
243 check_point(3);
244 ercd = sta_alm(ALM1, 100U);
245 check_ercd(ercd, E_OK);
246
247 check_point(6);
248 ercd = sta_alm(ALM2, 105U);
249 check_ercd(ercd, E_OK);
250
251 check_point(8);
252 target_raise_hrt_int(1U);
253
254 ercd = slp_tsk();
255 check_ercd(ercd, E_OK);
256
257 check_point(13);
258 target_raise_hrt_int(0U);
259
260 check_point(18);
261 ercd = sta_alm(ALM1, 1000000U);
262 check_ercd(ercd, E_OK);
263
264 check_point(21);
265 ercd = ref_alm(ALM1, &ralm);
266 check_ercd(ercd, E_OK);
267
268 check_point(23);
269 check_assert(ralm.lefttim == 999990U);
270
271 check_point(24);
272 target_raise_hrt_int(0U);
273
274 check_point(27);
275 target_raise_hrt_int(0U);
276
277 check_finish(32);
278 check_point(0);
279}
280
281static uint_t target_hrt_get_current_count = 0;
282
283HRTCNT
284target_hrt_get_current(void)
285{
286
287 switch (++target_hrt_get_current_count) {
288 case 1:
289 test_start(__FILE__);
290
291 check_point(1);
292 return(10U);
293
294 check_point(0);
295
296 case 2:
297 check_point(4);
298 return(20U);
299
300 check_point(0);
301
302 case 3:
303 check_point(7);
304 return(20U);
305
306 check_point(0);
307
308 case 4:
309 check_point(9);
310 return(130U);
311
312 check_point(0);
313
314 case 5:
315 check_point(11);
316 return(130U);
317
318 check_point(0);
319
320 case 6:
321 check_point(14);
322 return(140U);
323
324 check_point(0);
325
326 case 7:
327 check_point(16);
328 return(150U);
329
330 check_point(0);
331
332 case 8:
333 check_point(19);
334 return(160U);
335
336 check_point(0);
337
338 case 9:
339 check_point(22);
340 return(170U);
341
342 check_point(0);
343
344 case 10:
345 check_point(25);
346 return(600000U);
347
348 check_point(0);
349
350 case 11:
351 check_point(28);
352 return(344810U);
353
354 check_point(0);
355
356 case 12:
357 check_point(30);
358 return(344810U);
359
360 check_point(0);
361
362 default:
363 check_point(0);
364 }
365 check_point(0);
366 return(0U);
367}
368
369static uint_t target_hrt_set_event_count = 0;
370
371void
372target_hrt_set_event(HRTCNT hrtcnt)
373{
374
375 switch (++target_hrt_set_event_count) {
376 case 1:
377 check_point(2);
378 check_assert(hrtcnt == HRTCNT_EMPTY);
379
380 return;
381
382 check_point(0);
383
384 case 2:
385 check_point(5);
386 check_assert(hrtcnt == 110U);
387
388 return;
389
390 check_point(0);
391
392 case 3:
393 check_point(12);
394 check_assert(hrtcnt == 5U);
395
396 return;
397
398 check_point(0);
399
400 case 4:
401 check_point(17);
402 check_assert(hrtcnt == HRTCNT_EMPTY);
403
404 return;
405
406 check_point(0);
407
408 case 5:
409 check_point(20);
410 check_assert(hrtcnt == HRTCNT_BOUND);
411
412 return;
413
414 check_point(0);
415
416 case 6:
417 check_point(26);
418 check_assert(hrtcnt == 400170U);
419
420 return;
421
422 check_point(0);
423
424 case 7:
425 check_point(31);
426 check_assert(hrtcnt == HRTCNT_EMPTY);
427
428 return;
429
430 check_point(0);
431
432 default:
433 check_point(0);
434 }
435 check_point(0);
436}
Note: See TracBrowser for help on using the repository browser.