OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / test / test_cpuexc10.c
1 /*
2  *  TOPPERS Software
3  *      Toyohashi Open Platform for Embedded Real-Time Systems
4  * 
5  *  Copyright (C) 2007-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_cpuexc10.c 1577 2009-05-31 14:30:51Z ertl-hiro $
38  */
39
40 /* 
41  *              CPU例外処理のテスト(10)
42  *
43  * 【テストの目的】
44  *
45  *  割込み優先度マスク=TMIN_INTPRI-1,ディスパッチ許可状態,タスク例外
46  *  許可状態で発生したCPU例外におけるシステム状態のテスト.タスク例外に
47  *  よりリカバリーできることもテストする.
48  *
49  *  このテストは,割込み優先度マスクをTMIN_INTPRI-1に設定できる場合のみ
50  *  実施する.
51  *
52  * 【テスト項目】
53  *
54  *  いずれも,割込み優先度マスク=TMIN_INTPRI-1,ディスパッチ許可状態,
55  *  タスク例外許可状態で発生したCPU例外において,
56  *
57  *      (A) CPU例外ハンドラ実行開始時にCPUロックフラグが変化しないこと
58  *      (B) CPU例外ハンドラ実行開始時に割込み優先度マスクが変化しないこと
59  *              !CPU例外ハンドラ中で割込み優先度マスクを読めないため,テストで
60  *              きない.
61  *      (C) CPU例外ハンドラ実行開始時にディスパッチ禁止フラグが変化しないこと
62  *      (D) CPU例外ハンドラ実行開始時にタスク例外処理禁止フラグが変化しないこと
63  *      (E) CPU例外ハンドラリターン時にCPUロックフラグが元に戻ること
64  *      (F) CPU例外ハンドラリターン時に割込み優先度マスクが元に戻ること
65  *      (G) CPU例外ハンドラリターン時にディスパッチ禁止フラグが変化しないこと
66  *      (H) CPU例外ハンドラリターン時にタスク例外処理禁止フラグが変化しないこと
67  *      (I) xsns_xpnがfalseを返すこと.ただし,trueを返すことも許されている
68  *      (J) xsns_dpnがtrueを返すこと
69  *      (L) タスク例外によるリカバリーができること
70  *
71  * 【使用リソース】
72  *
73  *      TASK1: TA_ACT,中優先度,タスク例外処理ルーチン登録
74  *      CPUEXC1: TA_NULL
75  *
76  * 【テストシーケンス】
77  *
78  *      == TASK1(中優先度,1回目)==
79  *      1:      状態のチェック
80  *              chg_ipm(TMIN_INTPRI-1)
81  *              ena_tex()
82  *      2:      状態のチェック
83  *              RAISE_CPU_EXCEPTION
84  *      == CPUEXC1 ==
85  *      3:      状態のチェック                           ... (A),(C),(D)
86  *              xsns_xpn() == false                     ... (I)
87  *              !trueであってもテストプログラムを続行する
88  *              xsns_dpn() == true                      ... (J)
89  *  4:  iras_tex(TASK1, 1U)
90  *              iloc_cpu()
91  *      リターン
92  *      == TASK1のタスク例外処理ルーチン ==
93  *      5:      状態のチェック                           ... (E),(F),(G),(H)
94  *      6:      act_tsk(TASK1)                          ... (L)
95  *      7:      ext_tsk()                                       ... (L)
96  *      == TASK1(中優先度,2回目)==
97  *      8:      状態のチェック                           ... (L)
98  *      9:      テスト終了
99  */
100
101 #include <kernel.h>
102 #include <test_lib.h>
103 #include <t_syslog.h>
104 #include "kernel_cfg.h"
105 #include "test_cpuexc.h"
106
107 int_t   task1_count = 0;
108
109 void
110 task1(intptr_t exinf)
111 {
112         ER              ercd;
113
114         switch (++task1_count) {
115         case 1:
116                 check_point(1);
117                 check_state(false, false, TIPM_ENAALL, false, false, true);
118                 ercd = chg_ipm(TMAX_INTPRI - 1);
119                 if (ercd == E_PAR) {
120                         syslog_0(LOG_NOTICE, "This test program is not necessary.");
121                         ext_ker();
122                 }
123                 check_ercd(ercd, E_OK);
124                 ercd = ena_tex();
125                 check_ercd(ercd, E_OK);
126
127                 check_point(2);
128                 check_state(false, false, TMAX_INTPRI - 1, false, true, false);
129                 RAISE_CPU_EXCEPTION;
130
131                 check_point(0);
132                 break;
133
134         case 2:
135                 check_point(8);
136                 check_state(false, false, TIPM_ENAALL, false, false, true);
137
138                 check_finish(9);
139                 break;
140
141         default:
142                 check_point(0);
143                 break;
144         }
145 }
146
147 void
148 tex_task1(TEXPTN texptn, intptr_t exinf)
149 {
150         ER              ercd;
151
152         check_point(5);
153         check_state(false, false, TMAX_INTPRI - 1, false, true, true);
154
155         check_point(6);
156         ercd = act_tsk(TASK1);
157         check_ercd(ercd, E_OK);
158
159         check_point(7);
160         ercd = ext_tsk();
161         check_ercd(ercd, E_OK);
162
163         check_point(0);
164 }
165
166 void
167 task2(intptr_t exinf)
168 {
169         check_point(0);
170 }
171
172 void
173 alarm1_handler(intptr_t exinf)
174 {
175         check_point(0);
176 }
177
178 void
179 cpuexc_handler(void *p_excinf)
180 {
181         ER              ercd;
182
183         check_point(3);
184         check_state_i(true, false, false, true, false);
185         if (xsns_xpn(p_excinf) == true) {
186                 syslog_0(LOG_WARNING, "xsns_xpn returns true.");
187         }
188         check_assert(xsns_dpn(p_excinf) == true);
189
190         check_point(4);
191         ercd = iras_tex(TASK1, 1U);
192         check_ercd(ercd, E_OK);
193         ercd = iloc_cpu();
194         check_ercd(ercd, E_OK);
195 }