source: asp3_wo_tecs/trunk/extension/ovrhdr/test/test_ovrhdr1.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: 11.2 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 444 2015-08-13 04:39:19Z 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に対して,残りプロセッサ時間20000μ秒で,オーバラン
81 * // ハンドラを動作開始する
82 * sta_ovr(TASK2, 20000U)
83 * ref_ovr(TASK2, &rovr)
84 * assert(rovr.ovrstat == TOVR_STA)
85 * assert(rovr.leftotm == 20000U)
86 * sta_ovr(TASK3, 20000U)
87 * // 10000μ秒後にALM1を動作させる
88 * sta_alm(ALM1, 10000U)
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(5000U <= rovr.leftotm && rovr.leftotm <= 15000U)
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(40000U <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 50000U)
132 * ref_ovr(TASK2, &rovr)
133 * assert(rovr.ovrstat == TOVR_STP)
134 * sta_ovr(TASK2, 20000U)
135 * sta_alm(ALM1, 10000U)
136 * DO(hrtcnt1 = fch_hrt())
137 * wup_tsk(TASK2)
138 * == TASK2(続き)==
139 * // dispatch_rでオーバランタイマが動作開始する
140 * 11: wup_tsk(TASK3)
141 * DO(while(!task2_flag3))
142 * == ALM1-2(2回目)==
143 * // TASK2の実行途中でALM1が動作する
144 * // 割込みå…
145¥å£å‡¦ç†ã§ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãŒåœæ­¢ã™ã‚‹
146 * 12: DO(task2_flag3 = true)
147 * RETURN
148 * == TASK2(続き)==
149 * 13: rot_rdq(HIGH_PRIORITY)
150 * // dispatch_rでオーバランタイマが停止する
151 * == TASK3(続き)==
152 * 14: sta_alm(ALM1, 10000U)
153 * sta_ovr(TSK_SELF, 20000U)
154 * // sta_ovrでオーバランタイマが動作開始する
155 * // TASK2の残りプロセッサ時間を20000μ秒に設定しなおす
156 * sta_ovr(TASK2, 20000U)
157 * 15: DO(while(!task3_flag2))
158 * == ALM1-3(3回目)==
159 * // TASK3の実行途中でALM1が動作する
160 * // 割込みå…
161¥å£å‡¦ç†ã§ã‚ªãƒ¼ãƒãƒ©ãƒ³ã‚¿ã‚¤ãƒžãŒåœæ­¢ã™ã‚‹
162 * 16: DO(task3_flag2 = true)
163 * RETURN
164 * == TASK3(続き)==
165 * // TASK3の残りプロセッサ時間を20000μ秒に設定しなおす
166 * 17: sta_ovr(TSK_SELF, 20000U)
167 * // sta_ovrでオーバランタイマが停止&動作開始する
168 * DO(while(!task3_flag3))
169 * == OVR-3(3回目)==
170 * // TASK3の残りプロセッサ時間がなくなる
171 * 18: DO(task3_flag3 = true)
172 * sta_ovr(TSK_SELF, 20000U) -> E_ID
173 * // TASK3の残りプロセッサ時間を20000μ秒に設定しなおす
174 * sta_ovr(TASK3, 10000U)
175 * RETURN
176 * == TASK3(続き)==
177 * 19: DO(while(!task3_flag4))
178 * == OVR-4(4回目)==
179 * // TASK3の残りプロセッサ時間がなくなる
180 * 20: DO(task3_flag4 = true)
181 * rot_rdq(HIGH_PRIORITY)
182 * RETURN
183 * == TASK2(続き)==
184 * // dispatch_rでオーバランタイマが動作開始する
185 * 21: DO(while(!task2_flag4))
186 * == OVR-5(5回目)==
187 * // TASK2の残りプロセッサ時間がなくなる
188 * 22: DO(task2_flag4 = true)
189 * RETURN
190 * == TASK2(続き)==
191 * 23: slp_tsk()
192 * == TASK3(続き)==
193 * 24: slp_tsk()
194 * == TASK1(続き)==
195 * 25: DO(hrtcnt2 = fch_hrt())
196 * assert(70000U <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 80000U)
197 * 26: END
198 */
199
200#include <kernel.h>
201#include <t_syslog.h>
202#include "syssvc/test_svc.h"
203#include "kernel_cfg.h"
204#include "test_ovrhdr1.h"
205
206volatile bool_t task2_flag1 = false;
207volatile bool_t task2_flag2 = false;
208volatile bool_t task2_flag3 = false;
209volatile bool_t task2_flag4 = false;
210volatile bool_t task3_flag1 = false;
211volatile bool_t task3_flag2 = false;
212volatile bool_t task3_flag3 = false;
213volatile bool_t task3_flag4 = false;
214
215HRTCNT hrtcnt1, hrtcnt2;
216
217/* DO NOT DELETE THIS LINE -- gentest depends on it. */
218
219static uint_t alarm1_count = 0;
220
221void
222alarm1_handler(intptr_t exinf)
223{
224 ER_UINT ercd;
225
226 switch (++alarm1_count) {
227 case 1:
228 check_point(3);
229 ercd = rot_rdq(HIGH_PRIORITY);
230 check_ercd(ercd, E_OK);
231
232 return;
233
234 check_point(0);
235
236 case 2:
237 check_point(12);
238 task2_flag3 = true;
239
240 return;
241
242 check_point(0);
243
244 case 3:
245 check_point(16);
246 task3_flag2 = true;
247
248 return;
249
250 check_point(0);
251
252 default:
253 check_point(0);
254 }
255 check_point(0);
256}
257
258static uint_t overrun_count = 0;
259
260void
261overrun_handler(ID tskid, intptr_t exinf)
262{
263 ER_UINT ercd;
264
265 switch (++overrun_count) {
266 case 1:
267 check_point(5);
268 check_assert(tskid == TASK3);
269
270 task3_flag1 = true;
271
272 return;
273
274 check_point(0);
275
276 case 2:
277 check_point(8);
278 check_assert(tskid == TASK2);
279
280 task2_flag2 = true;
281
282 return;
283
284 check_point(0);
285
286 case 3:
287 check_point(18);
288 task3_flag3 = true;
289
290 ercd = sta_ovr(TSK_SELF, 20000U);
291 check_ercd(ercd, E_ID);
292
293 ercd = sta_ovr(TASK3, 10000U);
294 check_ercd(ercd, E_OK);
295
296 return;
297
298 check_point(0);
299
300 case 4:
301 check_point(20);
302 task3_flag4 = true;
303
304 ercd = rot_rdq(HIGH_PRIORITY);
305 check_ercd(ercd, E_OK);
306
307 return;
308
309 check_point(0);
310
311 case 5:
312 check_point(22);
313 task2_flag4 = true;
314
315 return;
316
317 check_point(0);
318
319 default:
320 check_point(0);
321 }
322 check_point(0);
323}
324
325void
326task1(intptr_t exinf)
327{
328 T_ROVR rovr;
329 ER_UINT ercd;
330
331 test_start(__FILE__);
332
333 check_point(1);
334 ercd = ref_ovr(TASK2, &rovr);
335 check_ercd(ercd, E_OK);
336
337 check_assert(rovr.ovrstat == TOVR_STP);
338
339 ercd = sta_ovr(TASK2, 20000U);
340 check_ercd(ercd, E_OK);
341
342 ercd = ref_ovr(TASK2, &rovr);
343 check_ercd(ercd, E_OK);
344
345 check_assert(rovr.ovrstat == TOVR_STA);
346
347 check_assert(rovr.leftotm == 20000U);
348
349 ercd = sta_ovr(TASK3, 20000U);
350 check_ercd(ercd, E_OK);
351
352 ercd = sta_alm(ALM1, 10000U);
353 check_ercd(ercd, E_OK);
354
355 hrtcnt1 = fch_hrt();
356
357 ercd = act_tsk(TASK2);
358 check_ercd(ercd, E_OK);
359
360 check_point(10);
361 hrtcnt2 = fch_hrt();
362
363 check_assert(40000U <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 50000U);
364
365 ercd = ref_ovr(TASK2, &rovr);
366 check_ercd(ercd, E_OK);
367
368 check_assert(rovr.ovrstat == TOVR_STP);
369
370 ercd = sta_ovr(TASK2, 20000U);
371 check_ercd(ercd, E_OK);
372
373 ercd = sta_alm(ALM1, 10000U);
374 check_ercd(ercd, E_OK);
375
376 hrtcnt1 = fch_hrt();
377
378 ercd = wup_tsk(TASK2);
379 check_ercd(ercd, E_OK);
380
381 check_point(25);
382 hrtcnt2 = fch_hrt();
383
384 check_assert(70000U <= hrtcnt2 - hrtcnt1 && hrtcnt2 - hrtcnt1 <= 80000U);
385
386 check_finish(26);
387 check_point(0);
388}
389
390void
391task2(intptr_t exinf)
392{
393 ER_UINT ercd;
394
395 check_point(2);
396 ercd = act_tsk(TASK3);
397 check_ercd(ercd, E_OK);
398
399 while(!task2_flag1);
400
401 check_point(7);
402 while(!task2_flag2);
403
404 check_point(9);
405 ercd = slp_tsk();
406 check_ercd(ercd, E_OK);
407
408 check_point(11);
409 ercd = wup_tsk(TASK3);
410 check_ercd(ercd, E_OK);
411
412 while(!task2_flag3);
413
414 check_point(13);
415 ercd = rot_rdq(HIGH_PRIORITY);
416 check_ercd(ercd, E_OK);
417
418 check_point(21);
419 while(!task2_flag4);
420
421 check_point(23);
422 ercd = slp_tsk();
423 check_ercd(ercd, E_OK);
424
425 check_point(0);
426}
427
428void
429task3(intptr_t exinf)
430{
431 T_ROVR rovr;
432 ER_UINT ercd;
433
434 check_point(4);
435 ercd = ref_ovr(TASK2, &rovr);
436 check_ercd(ercd, E_OK);
437
438 check_assert(rovr.ovrstat == TOVR_STA);
439
440 check_assert(5000U <= rovr.leftotm && rovr.leftotm <= 15000U);
441
442 while(!task3_flag1);
443
444 check_point(6);
445 task2_flag1 = true;
446
447 ercd = slp_tsk();
448 check_ercd(ercd, E_OK);
449
450 check_point(14);
451 ercd = sta_alm(ALM1, 10000U);
452 check_ercd(ercd, E_OK);
453
454 ercd = sta_ovr(TSK_SELF, 20000U);
455 check_ercd(ercd, E_OK);
456
457 ercd = sta_ovr(TASK2, 20000U);
458 check_ercd(ercd, E_OK);
459
460 check_point(15);
461 while(!task3_flag2);
462
463 check_point(17);
464 ercd = sta_ovr(TSK_SELF, 20000U);
465 check_ercd(ercd, E_OK);
466
467 while(!task3_flag3);
468
469 check_point(19);
470 while(!task3_flag4);
471
472 check_point(24);
473 ercd = slp_tsk();
474 check_ercd(ercd, E_OK);
475
476 check_point(0);
477}
Note: See TracBrowser for help on using the repository browser.