source: rubycfg_asp/trunk/asp_dcre/test/test_tex2.c@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 12.0 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2007-2013 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_tex2.c 313 2017-07-23 04:50:32Z coas-nagasima $
53 */
54
55/*
56 * タスク例外処理に関するテスト(2)
57 *
58 * 【テストの目的】
59 *
60 * 割込みハンドラ(アラームハンドラ)およびCPU例外ハンドラからタスク例
61 * 外処理ルーチンを起動する処理を網羅
62的にテストする.
63 *
64 * 【テスト項
65目】
66 *
67 * (A) iras_texのエラー検出
68 * (A-1) 対象タスクが休止状æ…
69‹
70 * (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない
71 * (B) 割込みハンドラから呼ばれたiras_texの正常処理
72 * (B-1) 対象タスクが実行状æ…
73‹ã®ã‚¿ã‚¹ã‚¯ã‹ã¤ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理許可
74 * (B-2) 対象タスクが実行状æ…
75‹ã®ã‚¿ã‚¹ã‚¯ã§ãªã„
76 * (B-3) 対象タスクが実行状æ…
77‹ã®ã‚¿ã‚¹ã‚¯ã ãŒã‚¿ã‚¹ã‚¯ä¾‹å¤–処理禁止
78 * (C) CPU例外ハンドラから呼ばれたiras_texの正常処理
79 * (C-1) 対象タスクが実行状æ…
80‹ã®ã‚¿ã‚¹ã‚¯ã‹ã¤ã‚¿ã‚¹ã‚¯ä¾‹å¤–処理許可
81 * (C-2) 対象タスクが実行状æ…
82‹ã®ã‚¿ã‚¹ã‚¯ã§ãªã„
83 * (C-3) 対象タスクが実行状æ…
84‹ã®ã‚¿ã‚¹ã‚¯ã ãŒã‚¿ã‚¹ã‚¯ä¾‹å¤–処理禁止
85 * → 実施しない(ターゲット非依存に実現できない)
86 * (D) 割込みハンドラの出口処理による起動
87 * (D-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
88 * 求あり
89 * (E) CPU例外ハンドラの出口処理による起動
90 * (E-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
91 * 求あり
92 * (F) sns_texで実行状æ…
93‹ã®ã‚¿ã‚¹ã‚¯ãŒãªã„
94 *
95 * 【使用リソース】
96 *
97 * TASK1: メインのタスク.実行状æ…
98‹ã®ã‚¿ã‚¹ã‚¯ã«å¯¾ã—てタスク例外処理を要求す
99 * る対象タスク
100 * TASK2: 実行状æ…
101‹ã§ãªã„タスクに対してタスク例外処理を要求する対象タスク
102 * TASK3: タスク例外処理ルーチンが定義されていないタスク
103 * TASK4: 休止状æ…
104‹ã®ã‚¿ã‚¹ã‚¯
105 * ALM1: アラームハンドラ1
106 * ALM2: アラームハンドラ2
107 * ALM3: アラームハンドラ3
108 * CPUEXC: CPU例外ハンドラ
109 *
110 * 【テストシーケンス】
111 *
112 * == TASK1(優å…
113ˆåº¦ï¼š10)==
114 * 1: state(false, false, TIPM_ENAALL, false, false, true)
115 * ref_tex(TSK_SELF, &rtex)
116 * assert((rtex.texstat & TTEX_DIS) != 0U)
117 * assert(rtex.pndptn == 0U)
118 * 2: sta_alm(ALM1, 1U)
119 * DO(while (!(alm1_flag))) ... アラームハンドラ1の実行を待
120つ
121 * == ALM1 ==
122 * 3: state_i(true, false, false, true, true)
123 * iras_tex(TASK3, 0x0001) -> E_OBJ ... (A-2)
124 * iras_tex(TASK4, 0x0001) -> E_OBJ ... (A-1)
125 * iras_tex(TASK2, 0x0001) ... (B-2)
126 * iras_tex(TASK1, 0x0001) ... (B-3)
127 * DO(alm1_flag = true)
128 * RETURN
129 * == TASK1(続き)==
130 * 4: ena_tex()
131 * == TASK1-TEX-1(1回目)==
132 * 5: assert(texptn == 0x0001)
133 * state(false, false, TIPM_ENAALL, false, false, true)
134 * 6: dis_dsp() ... 4つの状æ…
135‹ã‚’それぞれ変化させる
136 * chg_ipm(TMAX_INTPRI)
137 * ena_tex()
138 * loc_cpu()
139 * state(false, true, TMAX_INTPRI, true, true, false)
140 * RETURN
141 * == TASK1(続き)==
142 * 7: state(false, false, TIPM_ENAALL, false, false, false)
143 * ref_tex(TSK_SELF, &rtex)
144 * assert((rtex.texstat & TTEX_ENA) != 0U)
145 * assert(rtex.pndptn == 0U)
146 * 8: sta_alm(ALM2, 1U)
147 * DO(while (!(alm2_flag)))
148 * == ALM2 ==
149 * 9: state_i(true, false, false, true, false)
150 * iras_tex(TASK1, 0x0002) ... (B-1)
151 * DO(alm2_flag = true)
152 * RETURN ... (D-1)
153 * == TASK1-TEX-2(2回目)==
154 * 10: assert(texptn == 0x0002)
155 * state(false, false, TIPM_ENAALL, false, false, true)
156 * RETURN
157 * == TASK1(続き)==
158 * 11: sus_tsk(TASK2)
159 * sus_tsk(TASK3)
160 * 12: sta_alm(ALM3, 10U)
161 * 13: dly_tsk(50U)
162 * == ALM3 ==
163 * 14: state_i(true, false, false, true, true) ... (F)[sns_tex()を含む]
164 * iget_tid(&tskid)
165 * assert(tskid == TSK_NONE)
166 * iras_tex(TASK1, 0x0004)
167 * DO(alm3_flag = true)
168 * RETURN
169 * == TASK1-TEX-3(3回目)==
170 * 15: assert(texptn == 0x0004)
171 * state(false, false, TIPM_ENAALL, false, false, true)
172 * RETURN
173 * == TASK1(続き)==
174 * 16: rsm_tsk(TASK2)
175 * rsm_tsk(TASK3)
176 * dis_dsp()
177 * 17: DO(RAISE_CPU_EXCEPTION)
178 * == CPUEXC ==
179 * 18: state_i(true, false, true, true, false)
180 * assert(xsns_xpn(p_excinf) == false)
181 * iras_tex(TASK3, 0x0010) -> E_OBJ ... (A-2)
182 * iras_tex(TASK4, 0x0010) -> E_OBJ ... (A-1)
183 * iras_tex(TASK2, 0x0010) ... (C-2)
184 * iras_tex(TASK1, 0x0010) ... (C-1)
185 * RETURN ... (E-1)
186 * == TASK1-TEX-4(4回目)==
187 * 19: assert(texptn == 0x0010)
188 * state(false, false, TIPM_ENAALL, true, true, true)
189 * 20: ext_tsk()
190 * == TASK2(優å…
191ˆåº¦ï¼š10)==
192 * 21: state(false, false, TIPM_ENAALL, false, false, true)
193 * 22: ena_tex()
194 * == TASK2-TEX ==
195 * 23: assert(texptn == 0x0011)
196 * state(false, false, TIPM_ENAALL, false, false, true)
197 * RETURN
198 * == TASK2(続き)==
199 * 24: sus_tsk(TASK3)
200 * 25: END
201 */
202
203#include <kernel.h>
204#include <test_lib.h>
205#include <t_syslog.h>
206#include "kernel_cfg.h"
207#include "test_tex2.h"
208
209volatile bool_t alm1_flag = false;
210volatile bool_t alm2_flag = false;
211volatile bool_t alm3_flag = false;
212
213/*
214 * task3,task4とtex_task4は生成されない
215 */
216
217void
218task3(intptr_t exinf)
219{
220 check_point(0);
221}
222
223void
224task4(intptr_t exinf)
225{
226 check_point(0);
227}
228
229void
230tex_task4(TEXPTN texptn, intptr_t exinf)
231{
232 check_point(0);
233}
234
235/* DO NOT DELETE THIS LINE -- gentest depends on it. */
236
237void
238alarm1_handler(intptr_t exinf)
239{
240 ER_UINT ercd;
241
242 check_point(3);
243 check_state_i(true, false, false, true, true);
244
245 ercd = iras_tex(TASK3, 0x0001);
246 check_ercd(ercd, E_OBJ);
247
248 ercd = iras_tex(TASK4, 0x0001);
249 check_ercd(ercd, E_OBJ);
250
251 ercd = iras_tex(TASK2, 0x0001);
252 check_ercd(ercd, E_OK);
253
254 ercd = iras_tex(TASK1, 0x0001);
255 check_ercd(ercd, E_OK);
256
257 alm1_flag = true;
258
259 return;
260
261 check_point(0);
262}
263
264void
265alarm2_handler(intptr_t exinf)
266{
267 ER_UINT ercd;
268
269 check_point(9);
270 check_state_i(true, false, false, true, false);
271
272 ercd = iras_tex(TASK1, 0x0002);
273 check_ercd(ercd, E_OK);
274
275 alm2_flag = true;
276
277 return;
278
279 check_point(0);
280}
281
282void
283alarm3_handler(intptr_t exinf)
284{
285 ID tskid;
286 ER_UINT ercd;
287
288 check_point(14);
289 check_state_i(true, false, false, true, true);
290
291 ercd = iget_tid(&tskid);
292 check_ercd(ercd, E_OK);
293
294 check_assert(tskid == TSK_NONE);
295
296 ercd = iras_tex(TASK1, 0x0004);
297 check_ercd(ercd, E_OK);
298
299 alm3_flag = true;
300
301 return;
302
303 check_point(0);
304}
305
306void
307cpuexc_handler(void *p_excinf)
308{
309 ER_UINT ercd;
310
311 check_point(18);
312 check_state_i(true, false, true, true, false);
313
314 check_assert(xsns_xpn(p_excinf) == false);
315
316 ercd = iras_tex(TASK3, 0x0010);
317 check_ercd(ercd, E_OBJ);
318
319 ercd = iras_tex(TASK4, 0x0010);
320 check_ercd(ercd, E_OBJ);
321
322 ercd = iras_tex(TASK2, 0x0010);
323 check_ercd(ercd, E_OK);
324
325 ercd = iras_tex(TASK1, 0x0010);
326 check_ercd(ercd, E_OK);
327
328 return;
329
330 check_point(0);
331}
332
333void
334task1(intptr_t exinf)
335{
336 ER_UINT ercd;
337 T_RTEX rtex;
338
339 test_start(__FILE__);
340
341 check_point(1);
342 check_state(false, false, TIPM_ENAALL, false, false, true);
343
344 ercd = ref_tex(TSK_SELF, &rtex);
345 check_ercd(ercd, E_OK);
346
347 check_assert((rtex.texstat & TTEX_DIS) != 0U);
348
349 check_assert(rtex.pndptn == 0U);
350
351 check_point(2);
352 ercd = sta_alm(ALM1, 1U);
353 check_ercd(ercd, E_OK);
354
355 while (!(alm1_flag));
356
357 check_point(4);
358 ercd = ena_tex();
359 check_ercd(ercd, E_OK);
360
361 check_point(7);
362 check_state(false, false, TIPM_ENAALL, false, false, false);
363
364 ercd = ref_tex(TSK_SELF, &rtex);
365 check_ercd(ercd, E_OK);
366
367 check_assert((rtex.texstat & TTEX_ENA) != 0U);
368
369 check_assert(rtex.pndptn == 0U);
370
371 check_point(8);
372 ercd = sta_alm(ALM2, 1U);
373 check_ercd(ercd, E_OK);
374
375 while (!(alm2_flag));
376
377 check_point(11);
378 ercd = sus_tsk(TASK2);
379 check_ercd(ercd, E_OK);
380
381 ercd = sus_tsk(TASK3);
382 check_ercd(ercd, E_OK);
383
384 check_point(12);
385 ercd = sta_alm(ALM3, 10U);
386 check_ercd(ercd, E_OK);
387
388 check_point(13);
389 ercd = dly_tsk(50U);
390 check_ercd(ercd, E_OK);
391
392 check_point(16);
393 ercd = rsm_tsk(TASK2);
394 check_ercd(ercd, E_OK);
395
396 ercd = rsm_tsk(TASK3);
397 check_ercd(ercd, E_OK);
398
399 ercd = dis_dsp();
400 check_ercd(ercd, E_OK);
401
402 check_point(17);
403 RAISE_CPU_EXCEPTION;
404
405 check_point(0);
406}
407
408static uint_t tex_task1_count = 0;
409
410void
411tex_task1(TEXPTN texptn, intptr_t exinf)
412{
413 ER_UINT ercd;
414
415 switch (++tex_task1_count) {
416 case 1:
417 check_point(5);
418 check_assert(texptn == 0x0001);
419
420 check_state(false, false, TIPM_ENAALL, false, false, true);
421
422 check_point(6);
423 ercd = dis_dsp();
424 check_ercd(ercd, E_OK);
425
426 ercd = chg_ipm(TMAX_INTPRI);
427 check_ercd(ercd, E_OK);
428
429 ercd = ena_tex();
430 check_ercd(ercd, E_OK);
431
432 ercd = loc_cpu();
433 check_ercd(ercd, E_OK);
434
435 check_state(false, true, TMAX_INTPRI, true, true, false);
436
437 return;
438
439 check_point(0);
440
441 case 2:
442 check_point(10);
443 check_assert(texptn == 0x0002);
444
445 check_state(false, false, TIPM_ENAALL, false, false, true);
446
447 return;
448
449 check_point(0);
450
451 case 3:
452 check_point(15);
453 check_assert(texptn == 0x0004);
454
455 check_state(false, false, TIPM_ENAALL, false, false, true);
456
457 return;
458
459 check_point(0);
460
461 case 4:
462 check_point(19);
463 check_assert(texptn == 0x0010);
464
465 check_state(false, false, TIPM_ENAALL, true, true, true);
466
467 check_point(20);
468 ercd = ext_tsk();
469 check_ercd(ercd, E_OK);
470
471 check_point(0);
472
473 default:
474 check_point(0);
475 }
476 check_point(0);
477}
478
479void
480task2(intptr_t exinf)
481{
482 ER_UINT ercd;
483
484 check_point(21);
485 check_state(false, false, TIPM_ENAALL, false, false, true);
486
487 check_point(22);
488 ercd = ena_tex();
489 check_ercd(ercd, E_OK);
490
491 check_point(24);
492 ercd = sus_tsk(TASK3);
493 check_ercd(ercd, E_OK);
494
495 check_finish(25);
496 check_point(0);
497}
498
499void
500tex_task2(TEXPTN texptn, intptr_t exinf)
501{
502
503 check_point(23);
504 check_assert(texptn == 0x0011);
505
506 check_state(false, false, TIPM_ENAALL, false, false, true);
507
508 return;
509
510 check_point(0);
511}
Note: See TracBrowser for help on using the repository browser.