OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / test / test_sysstat1.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_sysstat1.c 1652 2009-10-10 18:01:05Z ertl-hiro $
38  */
39
40 /* 
41  *              システム状態に関するテスト(1)
42  *
43  *  テストシーケンス:
44  *
45  *      == TASK1(優先度:10)==
46  *      1:      初期状態のチェック
47  *      2:      loc_cpu() ... システム状態をランダムに変化させる
48  *              chg_ipm(TMAX_INTPRI) -> E_CTX
49  *      3:      unl_cpu()
50  *      4:      chg_ipm(TMAX_INTPRI)
51  *      5:      dis_dsp()
52  *      6:      ena_tex()
53  *      7:      chg_ipm(TIPM_ENAALL)
54  *      8:      ena_dsp()
55  *      9:      dis_tex()
56  *      10:     dis_dsp() ... タスク例外処理ルーチンを呼び出す準備
57  *              chg_ipm(TMIN_INTPRI)
58  *              ena_tex()
59  *      11:     ras_tex(TSK_SELF, 0x0001)
60  *      == TASK1タスク例外処理ルーチン(1回目)==
61  *      12:     初期状態のチェック
62  *      13:     ena_dsp() ... 3つの状態を変化させ,リターンで元にもどるか調べる
63  *              chg_ipm(TIPM_ENAALL)
64  *              ena_tex()
65  *              リターン
66  *      == TASK1(続き)==
67  *      14:     戻ってきた状態のチェック
68  *      15:     loc_cpu() ... CPUロック状態のままタスクを終了させる
69  *      16:     リターン(=タスク終了)
70  *      == TASK2(優先度:10)    ==
71  *      17:     初期状態のチェック
72  *      18:     終了
73  */
74
75 #include <kernel.h>
76 #include <test_lib.h>
77 #include <t_syslog.h>
78 #include "kernel_cfg.h"
79 #include "test_sysstat1.h"
80
81 void
82 tex_task1(TEXPTN texptn, intptr_t exinf)
83 {
84         ER              ercd;
85
86         switch (texptn) {
87         case 0x0001:
88                 check_point(12);
89                 check_state(false, false, TMIN_INTPRI, true, true, true);
90
91                 /*
92                  *  ディスパッチ許可,割込み優先度マスク変更,タスク例外処理許可
93                  */
94                 check_point(13);
95                 ercd = ena_dsp();
96                 check_ercd(ercd, E_OK);
97                 ercd = chg_ipm(TIPM_ENAALL);
98                 check_ercd(ercd, E_OK);
99                 ercd = ena_tex();
100                 check_ercd(ercd, E_OK);
101                 check_state(false, false, TIPM_ENAALL, false, false, false);
102                 break;
103
104         default:
105                 check_point(0);
106                 break;
107         }
108 }
109
110 void
111 task1(intptr_t exinf)
112 {
113         ER              ercd;
114
115         /*
116          *  初期状態のチェック
117          */
118         check_point(1);
119         check_state(false, false, TIPM_ENAALL, false, false, true);
120
121         /*
122          *  CPUロック状態のチェック
123          */
124         check_point(2);
125         ercd = loc_cpu();
126         check_ercd(ercd, E_OK);
127         check_state(false, true, TIPM_ENAALL, false, true, true);
128
129         /*
130          *  割込み優先度マスク変更のチェック
131          */
132         ercd = chg_ipm(TMAX_INTPRI);
133         check_ercd(ercd, E_CTX);
134         check_state(false, true, TIPM_ENAALL, false, true, true);
135
136         /*
137          *  CPUロック解除のチェック
138          */
139         check_point(3);
140         ercd = unl_cpu();
141         check_ercd(ercd, E_OK);
142         check_state(false, false, TIPM_ENAALL, false, false, true);
143
144         /*
145          *  割込み優先度マスク変更のチェック
146          */
147         check_point(4);
148         ercd = chg_ipm(TMAX_INTPRI);
149         check_ercd(ercd, E_OK);
150         check_state(false, false, TMAX_INTPRI, false, true, true);
151
152         /*
153          *  ディスパッチ禁止のチェック
154          */
155         check_point(5);
156         ercd = dis_dsp();
157         check_ercd(ercd, E_OK);
158         check_state(false, false, TMAX_INTPRI, true, true, true);
159
160         /*
161          *  タスク例外処理許可のチェック
162          */
163         check_point(6);
164         ercd = ena_tex();
165         check_ercd(ercd, E_OK);
166         check_state(false, false, TMAX_INTPRI, true, true, false);
167
168         /*
169          *  割込み優先度マスク全解除のチェック
170          */
171         check_point(7);
172         ercd = chg_ipm(TIPM_ENAALL);
173         check_ercd(ercd, E_OK);
174         check_state(false, false, TIPM_ENAALL, true, true, false);
175
176         /*
177          *  ディスパッチ許可のチェック
178          */
179         check_point(8);
180         ercd = ena_dsp();
181         check_ercd(ercd, E_OK);
182         check_state(false, false, TIPM_ENAALL, false, false, false);
183
184         /*
185          *  タスク例外処理禁止のチェック
186          */
187         check_point(9);
188         ercd = dis_tex();
189         check_ercd(ercd, E_OK);
190         check_state(false, false, TIPM_ENAALL, false, false, true);
191
192         /*
193          *  ディスパッチ禁止,割込み優先度マスク変更,タスク例外処理許可
194          */
195         check_point(10);
196         ercd = dis_dsp();
197         check_ercd(ercd, E_OK);
198         ercd = chg_ipm(TMIN_INTPRI);
199         check_ercd(ercd, E_OK);
200         ercd = ena_tex();
201         check_ercd(ercd, E_OK);
202         check_state(false, false, TMIN_INTPRI, true, true, false);
203
204         /*
205          *  タスク例外処理を要求
206          */
207         check_point(11);
208         ercd = ras_tex(TSK_SELF, 0x0001);
209         /* ここでタスク例外処理ルーチンが動作する */
210         check_ercd(ercd, E_OK);
211
212         /*
213          *  タスク例外処理からのリターンにより元の状態に戻っていることを
214          *  チェック
215          */
216         check_point(14);
217         check_state(false, false, TMIN_INTPRI, true, true, false);
218
219         /*
220          *  CPUロック状態に
221          */
222         check_point(15);
223         ercd = loc_cpu();
224         check_ercd(ercd, E_OK);
225
226         /*
227          *  そのままタスク終了
228          */
229         check_point(16);
230 }
231
232 void
233 task2(intptr_t exinf)
234 {
235         /*
236          *  初期状態のチェック
237          */
238         check_point(17);
239         check_state(false, false, TIPM_ENAALL, false, false, true);
240
241         check_finish(18);
242 }