source: azure_iot_hub_f767zi/trunk/asp_baseplatform/test/test_tex1.c@ 457

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

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 15.4 KB
Line 
1/*
2 * TOPPERS Software
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 *
5 * Copyright (C) 2006-2013 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 *
8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * $Id$
38 */
39
40/*
41 * タスク例外処理に関するテスト(1)
42 *
43 * 【テストの目的】
44 *
45 * タスクからタスク例外処理ルーチンを起動する処理を網羅的にテストする.
46 *
47 * 【テスト項目】
48 *
49 * (A) ras_texのエラー検出
50 * (A-1) 対象タスクが休止状態[NGKI1413]
51 * (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない[NGKI1414]
52 * (B) dis_texのエラー検出
53 * (B-1) 自タスクのタスク例外処理ルーチンが定義されていない[NGKI1421]
54 * (C) ena_texのエラー検出
55 * (C-1) 自タスクのタスク例外処理ルーチンが定義されていない[NGKI1426]
56 * (D) ref_texのエラー検出
57 * (D-1) 対象タスクが休止状態[NGKI1439]
58 * (D-2) 対象タスクのタスク例外処理ルーチンが定義されていない[NGKI1440]
59 * (E) ras_texの正常処理[NGKI1415]
60 * (E-1) 対象タスクが自タスク,タスク例外処理許可,かつ割込み優先
61 * 度マスク全解除状態で,すぐに実行開始
62 * (E-2) 対象タスクが自タスクでない
63 * (E-3) 対象タスクが自タスクだが,タスク例外処理禁止
64 * (E-4) 対象タスクが自タスクでタスク例外処理許可だが,割込み優先
65 * 度マスクが全解除でない
66 * (F) ena_texの正常処理[NGKI1427]
67 * (F-1) タスク例外処理要求があり,かつ割込み優先度マスク全解除状
68 * 態で,すぐに実行開始
69 * (F-2) タスク例外処理要求がない
70 * (F-3) タスク例外処理要求があるが,割込み優先度マスクが全解除で
71 * ない
72 * (G) chg_ipmの正常処理
73 * (G-1) タスク例外処理要求があり,かつタスク例外処理許可で,すぐ
74 * に実行開始
75 * (G-2) タスク例外処理要求がない
76 * (G-3) タスク例外処理要求があるが,タスク例外処理禁止
77 * (G-4) タスク例外処理要求があるが,割込み優先度マスクが全解除で
78 * ない
79 * (H) タスクディスパッチャによる起動
80 * (H-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
81 * 求あり
82 * (I) タスク例外処理ルーチンからのリターンによる起動(連続起動)
83 * (J) タスク例外処理ルーチンからの戻り時による状態復帰
84 * (J-1) タスクに戻ってくる時
85 * (J-2) タスク例外処理ルーチンが連続起動される時
86 * (K) タスク例外処理ルーチンの多重起動
87 * (L) タスク例外処理ルーチンからの戻り時のタスク切換え
88 *
89 * 【使用リソース】
90 *
91 * TASK1: メインのタスク.自タスクに対してタスク例外処理を要求する
92 * TASK2: 他タスクに対してタスク例外処理を要求する対象タスク
93 * TASK3: タスク例外処理ルーチンが定義されていないタスク
94 * TASK4: 休止状態のタスク
95 *
96 * 【テストシーケンス】
97 *
98 * == TASK1(優先度:10)==
99 * 1: state(false, false, TIPM_ENAALL, false, false, true)
100 * ref_tex(TSK_SELF, &rtex)
101 * assert((rtex.texstat & TTEX_DIS) != 0U)
102 * assert(rtex.pndptn == 0U)
103 * ras_tex(TASK3, 0x0001) -> E_OBJ ... (A-2)
104 * ras_tex(TASK4, 0x0001) -> E_OBJ ... (A-1)
105 * ref_tex(TASK3, &rtex) -> E_OBJ ... (D-2)
106 * ref_tex(TASK4, &rtex) -> E_OBJ ... (D-1)
107 * 2: ena_tex() ... (F-2)
108 * state(false, false, TIPM_ENAALL, false, false, false)
109 * ref_tex(TSK_SELF, &rtex)
110 * assert((rtex.texstat & TTEX_ENA) != 0U)
111 * assert(rtex.pndptn == 0U)
112 * 3: ras_tex(TSK_SELF, 0x0001) ... (E-1)
113 * == TASK1-TEX-1(1回目)==
114 * 4: assert(texptn == 0x0001)
115 * state(false, false, TIPM_ENAALL, false, false, true)
116 * 5: dis_dsp() ... 4つの状態をそれぞれ変化させる
117 * chg_ipm(TMAX_INTPRI)
118 * ena_tex()
119 * loc_cpu()
120 * state(false, true, TMAX_INTPRI, true, true, false)
121 * RETURN
122 * == TASK1(続き)==
123 * 6: state(false, false, TIPM_ENAALL, false, false, false) ... (J-1)
124 * 7: dis_dsp() ... ディスパッチ禁止,タスク例外処理禁止
125 * dis_tex()
126 * state(false, false, TIPM_ENAALL, true, true, true)
127 * 8: ras_tex(TASK1, 0x0002) ... (E-3)
128 * ref_tex(TSK_SELF, &rtex)
129 * assert((rtex.texstat & TTEX_DIS) != 0)
130 * assert(rtex.pndptn == 0x0002)
131 * 9: ena_tex() ... (F-1)
132 * == TASK1-TEX-2(2回目)==
133 * 10: assert(texptn == 0x0002)
134 * state(false, false, TIPM_ENAALL, true, true, true)
135 * 11: ras_tex(TASK1, 0x0001) ... (E-3)
136 * ras_tex(TASK1, 0x0002) ... (E-3)
137 * 12: ena_dsp() ... 3つの状態をそれぞれ変化させる
138 * chg_ipm(TMAX_INTPRI)
139 * loc_cpu()
140 * state(false, true, TMAX_INTPRI, false, true, true)
141 * RETURN ... (I)
142 * == TASK1-TEX-3(3回目)==
143 * 13: assert(texptn == 0x0003)
144 * state(false, false, TIPM_ENAALL, true, true, true) ... (J-2)
145 * 14: ena_dsp() ... ディスパッチ許可,タスク例外許可
146 * chg_ipm(TMAX_INTPRI)
147 * ena_tex()
148 * state(false, false, TMAX_INTPRI, false, true, false)
149 * chg_ipm(TIPM_ENAALL) ... (G-2)
150 * chg_ipm(TMAX_INTPRI)
151 * 15: ras_tex(TSK_SELF, 0x0004) ... (E-4)
152 * chg_ipm(TMAX_INTPRI) ... (G-4)
153 * dis_tex()
154 * chg_ipm(TIPM_ENAALL) ... (G-3)
155 * chg_ipm(TMAX_INTPRI)
156 * ena_tex() ... (F-3)
157 * 16: chg_ipm(TIPM_ENAALL) ... (G-1)(K)
158 * == TASK1-TEX-4(4回目)==
159 * 17: assert(texptn == 0x0004)
160 * state(false, false, TIPM_ENAALL, false, false, true)
161 * 18: dis_dsp() ... 3つの状態をそれぞれ変化させる
162 * chg_ipm(TMAX_INTPRI)
163 * loc_cpu()
164 * state(false, true, TMAX_INTPRI, true, true, true)
165 * RETURN
166 * == TASK1-TEX-3(3回目続き)==
167 * 19: state(false, false, TIPM_ENAALL, false, false, false)
168 * RETURN
169 * == TASK1(続き)==
170 * 20: state(false, false, TIPM_ENAALL, true, true, false) ... (J-1)
171 * 21: ena_dsp()
172 * rot_rdq(TPRI_SELF)
173 * == TASK2(優先度:10) ==
174 * 22: state(false, false, TIPM_ENAALL, false, false, true)
175 * 23: ena_tex()
176 * state(false, false, TIPM_ENAALL, false, false, false)
177 * rot_rdq(TPRI_SELF)
178 * == TASK3(優先度:10) ==
179 * 24: state(false, false, TIPM_ENAALL, false, false, true)
180 * 25: ena_tex() -> E_OBJ ... (C-1)
181 * state(false, false, TIPM_ENAALL, false, false, true)
182 * 26: dis_tex() -> E_OBJ ... (B-1)
183 * state(false, false, TIPM_ENAALL, false, false, true)
184 * ext_tsk()
185 * == TASK1(続き)==
186 * 27: ras_tex(TASK2, 0x0001) ... (E-2)
187 * ref_tex(TASK2, &rtex)
188 * 28: rot_rdq(TPRI_SELF) ... (H-1)
189 * == TASK2-TEX-1(1回目)==
190 * 29: assert(texptn == 0x0001)
191 * state(false, false, TIPM_ENAALL, false, false, true)
192 * RETURN
193 * == TASK2(続き)==
194 * 30: ras_tex(TSK_SELF, 0x0002)
195 * == TASK2-TEX-2(2回目)==
196 * 31: assert(texptn == 0x0002)
197 * state(false, false, TIPM_ENAALL, false, false, true)
198 * 32: dis_dsp()
199 * rot_rdq(TPRI_SELF)
200 * 33: RETURN
201 * == TASK1(続き)==
202 * 34: RETURN
203 * == TASK2(続き)==
204 * 35: END
205 */
206
207#include <kernel.h>
208#include <test_lib.h>
209#include <t_syslog.h>
210#include "kernel_cfg.h"
211#include "test_tex1.h"
212
213/*
214 * task4とtex_task4は生成されない
215 */
216
217void
218task4(intptr_t exinf)
219{
220 check_point(0);
221}
222
223void
224tex_task4(TEXPTN texptn, intptr_t exinf)
225{
226 check_point(0);
227}
228
229/* DO NOT DELETE THIS LINE -- gentest depends on it. */
230
231void
232task1(intptr_t exinf)
233{
234 ER_UINT ercd;
235 T_RTEX rtex;
236
237 test_start(__FILE__);
238
239 check_point(1);
240 check_state(false, false, TIPM_ENAALL, false, false, true);
241
242 ercd = ref_tex(TSK_SELF, &rtex);
243 check_ercd(ercd, E_OK);
244
245 check_assert((rtex.texstat & TTEX_DIS) != 0U);
246
247 check_assert(rtex.pndptn == 0U);
248
249 ercd = ras_tex(TASK3, 0x0001);
250 check_ercd(ercd, E_OBJ);
251
252 ercd = ras_tex(TASK4, 0x0001);
253 check_ercd(ercd, E_OBJ);
254
255 ercd = ref_tex(TASK3, &rtex);
256 check_ercd(ercd, E_OBJ);
257
258 ercd = ref_tex(TASK4, &rtex);
259 check_ercd(ercd, E_OBJ);
260
261 check_point(2);
262 ercd = ena_tex();
263 check_ercd(ercd, E_OK);
264
265 check_state(false, false, TIPM_ENAALL, false, false, false);
266
267 ercd = ref_tex(TSK_SELF, &rtex);
268 check_ercd(ercd, E_OK);
269
270 check_assert((rtex.texstat & TTEX_ENA) != 0U);
271
272 check_assert(rtex.pndptn == 0U);
273
274 check_point(3);
275 ercd = ras_tex(TSK_SELF, 0x0001);
276 check_ercd(ercd, E_OK);
277
278 check_point(6);
279 check_state(false, false, TIPM_ENAALL, false, false, false);
280
281 check_point(7);
282 ercd = dis_dsp();
283 check_ercd(ercd, E_OK);
284
285 ercd = dis_tex();
286 check_ercd(ercd, E_OK);
287
288 check_state(false, false, TIPM_ENAALL, true, true, true);
289
290 check_point(8);
291 ercd = ras_tex(TASK1, 0x0002);
292 check_ercd(ercd, E_OK);
293
294 ercd = ref_tex(TSK_SELF, &rtex);
295 check_ercd(ercd, E_OK);
296
297 check_assert((rtex.texstat & TTEX_DIS) != 0);
298
299 check_assert(rtex.pndptn == 0x0002);
300
301 check_point(9);
302 ercd = ena_tex();
303 check_ercd(ercd, E_OK);
304
305 check_point(20);
306 check_state(false, false, TIPM_ENAALL, true, true, false);
307
308 check_point(21);
309 ercd = ena_dsp();
310 check_ercd(ercd, E_OK);
311
312 ercd = rot_rdq(TPRI_SELF);
313 check_ercd(ercd, E_OK);
314
315 check_point(27);
316 ercd = ras_tex(TASK2, 0x0001);
317 check_ercd(ercd, E_OK);
318
319 ercd = ref_tex(TASK2, &rtex);
320 check_ercd(ercd, E_OK);
321
322 check_point(28);
323 ercd = rot_rdq(TPRI_SELF);
324 check_ercd(ercd, E_OK);
325
326 check_point(34);
327 return;
328
329 check_point(0);
330}
331
332static uint_t tex_task1_count = 0;
333
334void
335tex_task1(TEXPTN texptn, intptr_t exinf)
336{
337 ER_UINT ercd;
338
339 switch (++tex_task1_count) {
340 case 1:
341 check_point(4);
342 check_assert(texptn == 0x0001);
343
344 check_state(false, false, TIPM_ENAALL, false, false, true);
345
346 check_point(5);
347 ercd = dis_dsp();
348 check_ercd(ercd, E_OK);
349
350 ercd = chg_ipm(TMAX_INTPRI);
351 check_ercd(ercd, E_OK);
352
353 ercd = ena_tex();
354 check_ercd(ercd, E_OK);
355
356 ercd = loc_cpu();
357 check_ercd(ercd, E_OK);
358
359 check_state(false, true, TMAX_INTPRI, true, true, false);
360
361 return;
362
363 check_point(0);
364
365 case 2:
366 check_point(10);
367 check_assert(texptn == 0x0002);
368
369 check_state(false, false, TIPM_ENAALL, true, true, true);
370
371 check_point(11);
372 ercd = ras_tex(TASK1, 0x0001);
373 check_ercd(ercd, E_OK);
374
375 ercd = ras_tex(TASK1, 0x0002);
376 check_ercd(ercd, E_OK);
377
378 check_point(12);
379 ercd = ena_dsp();
380 check_ercd(ercd, E_OK);
381
382 ercd = chg_ipm(TMAX_INTPRI);
383 check_ercd(ercd, E_OK);
384
385 ercd = loc_cpu();
386 check_ercd(ercd, E_OK);
387
388 check_state(false, true, TMAX_INTPRI, false, true, true);
389
390 return;
391
392 check_point(0);
393
394 case 3:
395 check_point(13);
396 check_assert(texptn == 0x0003);
397
398 check_state(false, false, TIPM_ENAALL, true, true, true);
399
400 check_point(14);
401 ercd = ena_dsp();
402 check_ercd(ercd, E_OK);
403
404 ercd = chg_ipm(TMAX_INTPRI);
405 check_ercd(ercd, E_OK);
406
407 ercd = ena_tex();
408 check_ercd(ercd, E_OK);
409
410 check_state(false, false, TMAX_INTPRI, false, true, false);
411
412 ercd = chg_ipm(TIPM_ENAALL);
413 check_ercd(ercd, E_OK);
414
415 ercd = chg_ipm(TMAX_INTPRI);
416 check_ercd(ercd, E_OK);
417
418 check_point(15);
419 ercd = ras_tex(TSK_SELF, 0x0004);
420 check_ercd(ercd, E_OK);
421
422 ercd = chg_ipm(TMAX_INTPRI);
423 check_ercd(ercd, E_OK);
424
425 ercd = dis_tex();
426 check_ercd(ercd, E_OK);
427
428 ercd = chg_ipm(TIPM_ENAALL);
429 check_ercd(ercd, E_OK);
430
431 ercd = chg_ipm(TMAX_INTPRI);
432 check_ercd(ercd, E_OK);
433
434 ercd = ena_tex();
435 check_ercd(ercd, E_OK);
436
437 check_point(16);
438 ercd = chg_ipm(TIPM_ENAALL);
439 check_ercd(ercd, E_OK);
440
441 check_point(19);
442 check_state(false, false, TIPM_ENAALL, false, false, false);
443
444 return;
445
446 check_point(0);
447
448 case 4:
449 check_point(17);
450 check_assert(texptn == 0x0004);
451
452 check_state(false, false, TIPM_ENAALL, false, false, true);
453
454 check_point(18);
455 ercd = dis_dsp();
456 check_ercd(ercd, E_OK);
457
458 ercd = chg_ipm(TMAX_INTPRI);
459 check_ercd(ercd, E_OK);
460
461 ercd = loc_cpu();
462 check_ercd(ercd, E_OK);
463
464 check_state(false, true, TMAX_INTPRI, true, true, true);
465
466 return;
467
468 check_point(0);
469
470 default:
471 check_point(0);
472 }
473 check_point(0);
474}
475
476void
477task2(intptr_t exinf)
478{
479 ER_UINT ercd;
480
481 check_point(22);
482 check_state(false, false, TIPM_ENAALL, false, false, true);
483
484 check_point(23);
485 ercd = ena_tex();
486 check_ercd(ercd, E_OK);
487
488 check_state(false, false, TIPM_ENAALL, false, false, false);
489
490 ercd = rot_rdq(TPRI_SELF);
491 check_ercd(ercd, E_OK);
492
493 check_point(30);
494 ercd = ras_tex(TSK_SELF, 0x0002);
495 check_ercd(ercd, E_OK);
496
497 check_finish(35);
498 check_point(0);
499}
500
501static uint_t tex_task2_count = 0;
502
503void
504tex_task2(TEXPTN texptn, intptr_t exinf)
505{
506 ER_UINT ercd;
507
508 switch (++tex_task2_count) {
509 case 1:
510 check_point(29);
511 check_assert(texptn == 0x0001);
512
513 check_state(false, false, TIPM_ENAALL, false, false, true);
514
515 return;
516
517 check_point(0);
518
519 case 2:
520 check_point(31);
521 check_assert(texptn == 0x0002);
522
523 check_state(false, false, TIPM_ENAALL, false, false, true);
524
525 check_point(32);
526 ercd = dis_dsp();
527 check_ercd(ercd, E_OK);
528
529 ercd = rot_rdq(TPRI_SELF);
530 check_ercd(ercd, E_OK);
531
532 check_point(33);
533 return;
534
535 check_point(0);
536
537 default:
538 check_point(0);
539 }
540 check_point(0);
541}
542
543void
544task3(intptr_t exinf)
545{
546 ER_UINT ercd;
547
548 check_point(24);
549 check_state(false, false, TIPM_ENAALL, false, false, true);
550
551 check_point(25);
552 ercd = ena_tex();
553 check_ercd(ercd, E_OBJ);
554
555 check_state(false, false, TIPM_ENAALL, false, false, true);
556
557 check_point(26);
558 ercd = dis_tex();
559 check_ercd(ercd, E_OBJ);
560
561 check_state(false, false, TIPM_ENAALL, false, false, true);
562
563 ercd = ext_tsk();
564 check_ercd(ercd, E_OK);
565
566 check_point(0);
567}
Note: See TracBrowser for help on using the repository browser.