OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / test / test_tex1.c
1 /*
2  *  TOPPERS Software
3  *      Toyohashi Open Platform for Embedded Real-Time Systems
4  * 
5  *  Copyright (C) 2006-2009 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: test_tex1.c 1577 2009-05-31 14:30:51Z ertl-hiro $
38  */
39
40 /* 
41  *              タスク例外処理に関するテスト(1)
42  *
43  * 【テストの目的】
44  *
45  *  タスクからタスク例外処理ルーチンを起動する処理を網羅的にテストする.
46  *
47  * 【テスト項目】
48  *
49  *      (A) ras_tex,ref_texのエラー検出
50  *              (A-1) 対象タスクが休止状態
51  *              (A-2) 対象タスクのタスク例外処理ルーチンが定義されていない
52  *      (B) dis_tex,ena_texのエラー検出
53  *              (B-1) 自タスクのタスク例外処理ルーチンが定義されていない
54  *      (C) ras_texの正常処理
55  *              (C-1) 対象タスクが自タスクかつタスク例外処理許可で,すぐに起動
56  *              (C-2) 対象タスクが自タスクでない
57  *              (C-3) 対象タスクが自タスクだがタスク例外処理禁止
58  *      (D) ena_texの正常処理
59  *              (D-1) タスク例外処理要求があり,すぐに起動
60  *              (D-2) タスク例外処理要求がない
61  *      (E) タスクディスパッチャによる起動
62  *              (E-1) ディスパッチ後のタスクがタスク例外許可でタスク例外処理要
63  *                        求あり
64  *      (F) タスク例外処理ルーチンからのリターンによる起動(連続起動)
65  *      (G) タスク例外処理ルーチンからの戻り時による状態復帰
66  *              (G-1) タスクに戻ってくる時
67  *              (G-2) タスク例外処理ルーチンが連続起動される時
68  *      (H) タスク例外処理ルーチンの多重起動
69  *      (I) タスク例外処理ルーチンからの戻り時のタスク切換え
70  *
71  * 【使用リソース】
72  *
73  *      TASK1: メインのタスク.自タスクに対してタスク例外処理を要求する
74  *      TASK2: 他タスクに対してタスク例外処理を要求する対象タスク
75  *      TASK3: タスク例外処理ルーチンが定義されていないタスク
76  *      TASK4: 休止状態のタスク
77  *
78  * 【テストシーケンス】
79  *
80  *      == TASK1(優先度:10)==
81  *      1:      初期状態のチェック
82  *              ref_tex(TSK_SELF, &rtex)
83  *              ras_tex(TASK3, 0x0001)          ... (A-2)
84  *              ras_tex(TASK4, 0x0001)          ... (A-1)
85  *              ref_tex(TASK3, &rtex)           ... (A-2)
86  *              ref_tex(TASK4, &rtex)           ... (A-1)
87  *      2:      ena_tex()                                       ... (D-2)
88  *              ref_tex(TSK_SELF, &rtex)
89  *      3:      ras_tex(TSK_SELF, 0x0001)       ... (C-1)
90  *      == TASK1タスク例外処理ルーチン(1回目)==
91  *      4:      初期状態のチェック
92  *      5:      dis_dsp() ... 4つの状態をそれぞれ変化させる
93  *              chg_ipm(TMAX_INTPRI)
94  *              ena_tex()
95  *              loc_cpu()
96  *              リターン
97  *      == TASK1(続き)==
98  *      6:      戻ってきた状態のチェック    ... (G-1)
99  *      7:      dis_dsp() ... 3つの状態をそれぞれ変化させる
100  *              chg_ipm(TMIN_INTPRI)
101  *              dis_tex()
102  *      8:      ras_tex(TASK1, 0x0002)          ... (C-3)
103  *              ref_tex(TSK_SELF, &rtex)
104  *      9:      ena_tex()                                       ... (D-1)
105  *      == TASK1タスク例外処理ルーチン(2回目)==
106  *      10:     初期状態のチェック
107  *      11:     ras_tex(TASK1, 0x0001)          ... (C-3)
108  *              ras_tex(TASK1, 0x0002)          ... (C-3)
109  *      12:     ena_dsp() ... 3つの状態をそれぞれ変化させる
110  *              chg_ipm(TMAX_INTPRI)
111  *              loc_cpu()
112  *              リターン                                    ... (F)
113  *      == TASK1タスク例外処理ルーチン(3回目)==
114  *      13:     初期状態のチェック
115  *      14:     ena_dsp() ... 3つの状態をそれぞれ変化させる
116  *              chg_ipm(TMAX_INTPRI)
117  *              ena_tex()
118  *      15: ras_tex(TSK_SELF, 0x0004)   ... (H)
119  *      == TASK1タスク例外処理ルーチン(4回目)==
120  *      16:     初期状態のチェック
121  *      17:     dis_dsp() ... 3つの状態をそれぞれ変化させる
122  *              chg_ipm(TIPM_ENAALL)
123  *              loc_cpu()
124  *              リターン
125  *      == TASK1タスク例外処理ルーチン(3回目続き)==
126  *      18:     戻ってきた状態のチェック    ... (G-2)
127  *              リターン
128  *      == TASK1(続き)==
129  *      19:     戻ってきた状態のチェック    ... (G-1)
130  *      20: ena_dsp()
131  *              chg_ipm(TIPM_ENAALL)
132  *              rot_rdq(TPRI_SELF)
133  *      == TASK2(優先度:10)    ==
134  *      21:     初期状態のチェック
135  *      22:     ena_tex()
136  *              rot_rdq(TPRI_SELF)
137  *      == TASK3(優先度:10)    ==
138  *      23:     初期状態のチェック
139  *      24:     ena_tex()
140  *      25:     dis_tex()                                       ... (B-1)
141  *              ext_tsk()                                       ... (B-1)
142  *      == TASK1(続き)==
143  *      26: ras_tex(TASK2, 0x0001)              ... (C-2)
144  *              ref_tex(TASK2, &rtex)
145  *      27:     rot_rdq(TPRI_SELF)                      ... (E-1)
146  *      == TASK2タスク例外処理ルーチン(1回目)==
147  *      28:     初期状態のチェック
148  *              リターン
149  *      == TASK2(続き)==
150  *      29: ras_tex(TSK_SELF, 0x0002)
151  *      == TASK2タスク例外処理ルーチン(2回目)==
152  *      30:     初期状態のチェック
153  *      31:     dis_dsp
154  *              rot_rdq(TPRI_SELF)
155  *      32:     リターン                                    ... (I)
156  *      == TASK1(続き)==
157  *      33:     リターン(タスク終了)
158  *      == TASK2(続き)==
159  *      34:     テスト終了
160  */
161
162 #include <kernel.h>
163 #include <test_lib.h>
164 #include <t_syslog.h>
165 #include "kernel_cfg.h"
166 #include "test_tex1.h"
167
168 void
169 tex_task1(TEXPTN texptn, intptr_t exinf)
170 {
171         ER              ercd;
172
173         switch (texptn) {
174         case 0x0001:
175                 check_point(4);
176                 check_state(false, false, TIPM_ENAALL, false, false, true);
177
178                 /*
179                  *  ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可
180                  */
181                 check_point(5);
182                 ercd = dis_dsp();
183                 check_ercd(ercd, E_OK);
184                 ercd = chg_ipm(TMAX_INTPRI);
185                 check_ercd(ercd, E_OK);
186                 ercd = ena_tex();
187                 check_ercd(ercd, E_OK);
188                 ercd = loc_cpu();
189                 check_ercd(ercd, E_OK);
190                 check_state(false, true, TMAX_INTPRI, true, true, false);
191                 break;
192
193         case 0x0002:
194                 check_point(10);
195                 check_state(false, false, TMIN_INTPRI, true, true, true);
196
197                 /*
198                  *  タスク例外処理を要求
199                  */
200                 check_point(11);
201                 ercd = ras_tex(TSK_SELF, 0x0001);
202                 check_ercd(ercd, E_OK);
203                 ercd = ras_tex(TSK_SELF, 0x0002);
204                 check_ercd(ercd, E_OK);
205
206                 /*
207                  *  ディスパッチ許可,割込み優先度マスク変更,CPUロック
208                  */
209                 check_point(12);
210                 ercd = ena_dsp();
211                 check_ercd(ercd, E_OK);
212                 ercd = chg_ipm(TMAX_INTPRI);
213                 check_ercd(ercd, E_OK);
214                 ercd = loc_cpu();
215                 check_ercd(ercd, E_OK);
216                 check_state(false, true, TMAX_INTPRI, false, true, true);
217                 break;
218
219         case 0x0003:
220                 check_point(13);
221                 check_state(false, false, TMIN_INTPRI, true, true, true);
222
223                 /*
224                  *  ディスパッチ許可,割込み優先度マスク変更,タスク例外許可
225                  */
226                 check_point(14);
227                 ercd = ena_dsp();
228                 check_ercd(ercd, E_OK);
229                 ercd = chg_ipm(TMAX_INTPRI);
230                 check_ercd(ercd, E_OK);
231                 ercd = ena_tex();
232                 check_ercd(ercd, E_OK);
233                 check_state(false, false, TMAX_INTPRI, false, true, false);
234
235                 /*
236                  *  タスク例外処理を要求
237                  */
238                 check_point(15);
239                 ercd = ras_tex(TSK_SELF, 0x0004);
240                 /* ここでタスク例外処理ルーチンが動作する */
241                 check_ercd(ercd, E_OK);
242
243                 /*
244                  *  タスク例外処理からのリターンにより元の状態に戻っていること
245                  *  をチェック
246                  */
247                 check_point(18);
248                 check_state(false, false, TMAX_INTPRI, false, true, false);
249                 break;
250
251         case 0x0004:
252                 check_point(16);
253                 check_state(false, false, TMAX_INTPRI, false, true, true);
254
255                 /*
256                  *  ディスパッチ禁止,割込み優先度マスク変更,CPUロック
257                  */
258                 check_point(17);
259                 ercd = dis_dsp();
260                 check_ercd(ercd, E_OK);
261                 ercd = chg_ipm(TIPM_ENAALL);
262                 check_ercd(ercd, E_OK);
263                 ercd = loc_cpu();
264                 check_ercd(ercd, E_OK);
265                 check_state(false, true, TIPM_ENAALL, true, true, true);
266                 break;
267
268         default:
269                 check_point(0);
270                 break;
271         }
272 }
273
274 void
275 task1(intptr_t exinf)
276 {
277         ER              ercd;
278         T_RTEX  rtex;
279
280         /*
281          *  初期状態のチェック
282          */
283         check_point(1);
284         check_state(false, false, TIPM_ENAALL, false, false, true);
285         ercd = ref_tex(TSK_SELF, &rtex);
286         check_ercd(ercd, E_OK);
287         check_assert((rtex.texstat & TTEX_DIS) != 0);
288         check_assert(rtex.pndptn == 0);
289
290         /*
291          *  ras_texのエラー検出
292          */
293         ercd = ras_tex(TASK3, 0x0001);
294         check_ercd(ercd, E_OBJ);
295         ercd = ras_tex(TASK4, 0x0001);
296         check_ercd(ercd, E_OBJ);
297
298         /*
299          *  ref_texのエラー検出
300          */
301         ercd = ref_tex(TASK3, &rtex);
302         check_ercd(ercd, E_OBJ);
303         ercd = ref_tex(TASK4, &rtex);
304         check_ercd(ercd, E_OBJ);
305
306         /*
307          *  タスク例外処理の許可
308          */
309         check_point(2);
310         ercd = ena_tex();
311         check_ercd(ercd, E_OK);
312         check_state(false, false, TIPM_ENAALL, false, false, false);
313         ercd = ref_tex(TSK_SELF, &rtex);
314         check_ercd(ercd, E_OK);
315         check_assert((rtex.texstat & TTEX_ENA) != 0);
316         check_assert(rtex.pndptn == 0);
317
318         /*
319          *  タスク例外処理を要求
320          */
321         check_point(3);
322         ercd = ras_tex(TSK_SELF, 0x0001);
323         /* ここでタスク例外処理ルーチンが動作する */
324         check_ercd(ercd, E_OK);
325
326         /*
327          *  タスク例外処理からのリターンにより元の状態に戻っていることを
328          *  チェック
329          */
330         check_point(6);
331         check_state(false, false, TIPM_ENAALL, false, false, false);
332
333         /*
334          *  ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理禁止
335          */
336         check_point(7);
337         ercd = dis_dsp();
338         check_ercd(ercd, E_OK);
339         ercd = chg_ipm(TMIN_INTPRI);
340         check_ercd(ercd, E_OK);
341         ercd = dis_tex();
342         check_ercd(ercd, E_OK);
343         check_state(false, false, TMIN_INTPRI, true, true, true);
344
345         /*
346          *  タスク例外処理を要求
347          */
348         check_point(8);
349         ercd = ras_tex(TASK1, 0x0002);
350         check_ercd(ercd, E_OK);
351         ercd = ref_tex(TSK_SELF, &rtex);
352         check_ercd(ercd, E_OK);
353         check_assert((rtex.texstat & TTEX_DIS) != 0);
354         check_assert(rtex.pndptn == 0x0002);
355
356         /*
357          *  タスク例外処理を許可
358          */
359         check_point(9);
360         ercd = ena_tex();
361         /* ここでタスク例外処理ルーチンが動作する */
362         check_ercd(ercd, E_OK);
363
364         /*
365          *  タスク例外処理からのリターンにより元の状態に戻っていることを
366          *  チェック
367          */
368         check_point(19);
369         check_state(false, false, TMIN_INTPRI, true, true, false);
370
371         /*
372          *  タスク2に切り換える
373          */
374         check_point(20);
375         ercd = ena_dsp();
376         check_ercd(ercd, E_OK);
377         ercd = chg_ipm(TIPM_ENAALL);
378         check_ercd(ercd, E_OK);
379         ercd = rot_rdq(TPRI_SELF);
380         /* ここで他のタスクが動作する */
381         check_ercd(ercd, E_OK);
382
383         /*
384          *  タスク2に対してタスク例外処理を要求
385          */
386         check_point(26);
387         ercd = ras_tex(TASK2, 0x0001);
388         check_ercd(ercd, E_OK);
389         ercd = ref_tex(TASK2, &rtex);
390         check_ercd(ercd, E_OK);
391         check_assert((rtex.texstat & TTEX_ENA) != 0);
392         check_assert(rtex.pndptn == 0x0001);
393
394         /*
395          *  タスク2に切り換える
396          */
397         check_point(27);
398         ercd = rot_rdq(TPRI_SELF);
399         /* ここで他のタスクが動作する */
400         check_ercd(ercd, E_OK);
401
402         /*
403          *  タスク終了
404          */
405         check_point(33);
406 }
407
408 void
409 tex_task2(TEXPTN texptn, intptr_t exinf)
410 {
411         ER              ercd;
412
413         switch (texptn) {
414         case 0x0001:
415                 check_point(28);
416                 check_state(false, false, TIPM_ENAALL, false, false, true);
417                 break;
418
419         case 0x0002:
420                 check_point(30);
421                 check_state(false, false, TIPM_ENAALL, false, false, true);
422
423                 /*
424                  *  ディスパッチを禁止して,タスク切換えを要求する.
425                  */
426                 check_point(31);
427                 ercd = dis_dsp();
428                 check_ercd(ercd, E_OK);
429                 ercd = rot_rdq(TPRI_SELF);
430                 check_ercd(ercd, E_OK);
431
432                 /*
433                  *  タスク例外処理ルーチンからのリターンで,タスク切換えが発生
434                  *  する.
435                  */
436                 check_point(32);
437                 break;
438
439         default:
440                 check_point(0);
441                 break;
442         }
443 }
444
445 void
446 task2(intptr_t exinf)
447 {
448         ER              ercd;
449
450         /*
451          *  初期状態のチェック
452          */
453         check_point(21);
454         check_state(false, false, TIPM_ENAALL, false, false, true);
455
456         /*
457          *  タスク例外処理の許可
458          */
459         check_point(22);
460         ercd = ena_tex();
461         check_ercd(ercd, E_OK);
462         check_state(false, false, TIPM_ENAALL, false, false, false);
463
464         /*
465          *  タスク3に切り換える
466          */
467         ercd = rot_rdq(TPRI_SELF);
468         /* ここで他のタスクが動作する */
469         check_ercd(ercd, E_OK);
470
471         /*
472          *  タスク例外処理を要求
473          */
474         check_point(29);
475         ercd = ras_tex(TSK_SELF, 0x0002);
476         /* ここでタスク例外処理ルーチンが動作する */
477         check_ercd(ercd, E_OK);
478
479         /*
480          *  テスト終了
481          */
482         check_finish(34);
483 }
484
485 void
486 task3(intptr_t exinf)
487 {
488         ER              ercd;
489
490         /*
491          *  初期状態のチェック
492          */
493         check_point(23);
494         check_state(false, false, TIPM_ENAALL, false, false, true);
495
496         /*
497          *  タスク例外処理の許可
498          */
499         check_point(24);
500         ercd = ena_tex();
501         check_ercd(ercd, E_OBJ);
502         check_state(false, false, TIPM_ENAALL, false, false, true);
503
504         /*
505          *  タスク例外処理の禁止
506          */
507         check_point(25);
508         ercd = dis_tex();
509         check_ercd(ercd, E_OBJ);
510         check_state(false, false, TIPM_ENAALL, false, false, true);
511
512         /*
513          *  タスク終了
514          */
515         ercd = ext_tsk();
516         check_point(0);
517 }
518
519 void
520 task4(intptr_t exinf)
521 {
522         check_point(0);
523 }
524
525 void
526 tex_task4(TEXPTN texptn, intptr_t exinf)
527 {
528         check_point(0);
529 }