OSDN Git Service

カーネルのターゲット非依存部1.7.0およびCFGをマージ
[toppersasp4lpc/asp.git] / asp / kernel / check.h
1 /*
2  *  TOPPERS/ASP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Advanced Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  *  Copyright (C) 2005-2007 by Embedded and Real-Time Systems Laboratory
9  *              Graduate School of Information Science, Nagoya Univ., JAPAN
10  * 
11  *  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12  *  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13  *  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  *      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31  *      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32  *      免責すること.
33  * 
34  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36  *  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37  *  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38  *  の責任を負わない.
39  * 
40  *  @(#) $Id: check.h 1940 2010-10-03 15:09:34Z ertl-hiro $
41  */
42
43 /*
44  *              エラーチェック用マクロ
45  */
46
47 #ifndef TOPPERS_CHECK_H
48 #define TOPPERS_CHECK_H
49
50 /*
51  *  優先度の範囲の判定
52  */
53 #define VALID_TPRI(tpri)        (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
54
55 #ifndef VALID_INTPRI_CHGIPM
56 #define VALID_INTPRI_CHGIPM(intpri) \
57                                 (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
58 #endif /* VALID_INTPRI_CHGIPM */
59
60 /*
61  *  タスク優先度のチェック(E_PAR)
62  */
63 #define CHECK_TPRI(tpri) {                                                                      \
64         if (!VALID_TPRI(tpri)) {                                                                \
65                 ercd = E_PAR;                                                                           \
66                 goto error_exit;                                                                        \
67         }                                                                                                               \
68 }
69
70 #define CHECK_TPRI_INI(tpri) {                                                          \
71         if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) {                \
72                 ercd = E_PAR;                                                                           \
73                 goto error_exit;                                                                        \
74         }                                                                                                               \
75 }
76
77 #define CHECK_TPRI_SELF(tpri) {                                                         \
78         if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) {               \
79                 ercd = E_PAR;                                                                           \
80                 goto error_exit;                                                                        \
81         }                                                                                                               \
82 }
83
84 /*
85  *  タイムアウト指定値のチェック(E_PAR)
86  */
87 #define CHECK_TMOUT(tmout) {                                                            \
88         if (!(TMO_FEVR <= (tmout))) {                                                   \
89                 ercd = E_PAR;                                                                           \
90                 goto error_exit;                                                                        \
91         }                                                                                                               \
92 }
93
94 /*
95  *  割込み優先度のチェック(E_PAR)
96  */
97 #define CHECK_INTPRI_CHGIPM(intpri) {                                           \
98         if (!VALID_INTPRI_CHGIPM(intpri)) {                                             \
99                 ercd = E_PAR;                                                                           \
100                 goto error_exit;                                                                        \
101         }                                                                                                               \
102 }
103
104 /*
105  *  割込み番号のチェック(E_PAR)
106  */
107 #define CHECK_INTNO_DISINT(intno) {                                                     \
108         if (!VALID_INTNO_DISINT(intno)) {                                               \
109                 ercd = E_PAR;                                                                           \
110                 goto error_exit;                                                                        \
111         }                                                                                                               \
112 }
113
114 /*
115  *  その他のパラメータエラーのチェック(E_PAR)
116  */
117 #define CHECK_PAR(exp) {                                                                        \
118         if (!(exp)) {                                                                                   \
119                 ercd = E_PAR;                                                                           \
120                 goto error_exit;                                                                        \
121         }                                                                                                               \
122 }
123
124 /*
125  *  オブジェクトIDの範囲の判定
126  */
127 #define VALID_TSKID(tskid)      (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
128 #define VALID_SEMID(semid)      (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
129 #define VALID_FLGID(flgid)      (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
130 #define VALID_DTQID(dtqid)      (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
131 #define VALID_PDQID(pdqid)      (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
132 #define VALID_MBXID(mbxid)      (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
133 #define VALID_MPFID(mpfid)      (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
134 #define VALID_CYCID(cycid)      (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
135 #define VALID_ALMID(almid)      (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
136
137 /*
138  *  オブジェクトIDのチェック(E_ID)
139  */
140 #define CHECK_TSKID(tskid) {                                                            \
141         if (!VALID_TSKID(tskid)) {                                                              \
142                 ercd = E_ID;                                                                            \
143                 goto error_exit;                                                                        \
144         }                                                                                                               \
145 }
146
147 #define CHECK_TSKID_SELF(tskid) {                                                       \
148         if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) {             \
149                 ercd = E_ID;                                                                            \
150                 goto error_exit;                                                                        \
151         }                                                                                                               \
152 }
153
154 #define CHECK_SEMID(semid) {                                                            \
155         if (!VALID_SEMID(semid)) {                                                              \
156                 ercd = E_ID;                                                                            \
157                 goto error_exit;                                                                        \
158         }                                                                                                               \
159 }
160
161 #define CHECK_FLGID(flgid) {                                                            \
162         if (!VALID_FLGID(flgid)) {                                                              \
163                 ercd = E_ID;                                                                            \
164                 goto error_exit;                                                                        \
165         }                                                                                                               \
166 }
167
168 #define CHECK_DTQID(dtqid) {                                                            \
169         if (!VALID_DTQID(dtqid)) {                                                              \
170                 ercd = E_ID;                                                                            \
171                 goto error_exit;                                                                        \
172         }                                                                                                               \
173 }
174
175 #define CHECK_PDQID(pdqid) {                                                            \
176         if (!VALID_PDQID(pdqid)) {                                                              \
177                 ercd = E_ID;                                                                            \
178                 goto error_exit;                                                                        \
179         }                                                                                                               \
180 }
181
182 #define CHECK_MBXID(mbxid) {                                                            \
183         if (!VALID_MBXID(mbxid)) {                                                              \
184                 ercd = E_ID;                                                                            \
185                 goto error_exit;                                                                        \
186         }                                                                                                               \
187 }
188
189 #define CHECK_MPFID(mpfid) {                                                            \
190         if (!VALID_MPFID(mpfid)) {                                                              \
191                 ercd = E_ID;                                                                            \
192                 goto error_exit;                                                                        \
193         }                                                                                                               \
194 }
195
196 #define CHECK_CYCID(cycid) {                                                            \
197         if (!VALID_CYCID(cycid)) {                                                              \
198                 ercd = E_ID;                                                                            \
199                 goto error_exit;                                                                        \
200         }                                                                                                               \
201 }
202
203 #define CHECK_ALMID(almid) {                                                            \
204         if (!VALID_ALMID(almid)) {                                                              \
205                 ercd = E_ID;                                                                            \
206                 goto error_exit;                                                                        \
207         }                                                                                                               \
208 }
209
210 /*
211  *  呼出しコンテキストのチェック(E_CTX)
212  */
213 #define CHECK_TSKCTX() {                                                                        \
214         if (sense_context()) {                                                                  \
215                 ercd = E_CTX;                                                                           \
216                 goto error_exit;                                                                        \
217         }                                                                                                               \
218 }
219
220 #define CHECK_INTCTX() {                                                                        \
221         if (!sense_context()) {                                                                 \
222                 ercd = E_CTX;                                                                           \
223                 goto error_exit;                                                                        \
224         }                                                                                                               \
225 }
226
227 /*
228  *  呼出しコンテキストとCPUロック状態のチェック(E_CTX)
229  */
230 #define CHECK_TSKCTX_UNL() {                                                            \
231         if (sense_context() || t_sense_lock()) {                                \
232                 ercd = E_CTX;                                                                           \
233                 goto error_exit;                                                                        \
234         }                                                                                                               \
235 }
236
237 #define CHECK_INTCTX_UNL() {                                                            \
238         if (!sense_context() || i_sense_lock()) {                               \
239                 ercd = E_CTX;                                                                           \
240                 goto error_exit;                                                                        \
241         }                                                                                                               \
242 }
243
244 /*
245  *  ディスパッチ保留状態でないかのチェック(E_CTX)
246  */
247 #define CHECK_DISPATCH() {                                                                      \
248         if (sense_context() || t_sense_lock() || !dspflg) {             \
249                 ercd = E_CTX;                                                                           \
250                 goto error_exit;                                                                        \
251         }                                                                                                               \
252 }
253
254 /*
255  *  その他のコンテキストエラーのチェック(E_CTX)
256  */
257 #define CHECK_CTX(exp) {                                                                        \
258         if (!(exp)) {                                                                                   \
259                 ercd = E_CTX;                                                                           \
260                 goto error_exit;                                                                        \
261         }                                                                                                               \
262 }
263
264 /*
265  *  自タスクを指定していないかのチェック(E_ILUSE)
266  */
267 #define CHECK_NONSELF(p_tcb) {                                                          \
268         if ((p_tcb) == p_runtsk) {                                                              \
269                 ercd = E_ILUSE;                                                                         \
270                 goto error_exit;                                                                        \
271         }                                                                                                               \
272 }
273
274 /*
275  *  その他の不正使用エラーのチェック(E_ILUSE)
276  */
277 #define CHECK_ILUSE(exp) {                                                                      \
278         if (!(exp)) {                                                                                   \
279                 ercd = E_ILUSE;                                                                         \
280                 goto error_exit;                                                                        \
281         }                                                                                                               \
282 }
283
284 #endif /* TOPPERS_CHECK_H */