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