source: UsbWattMeter/trunk/asp_dcre/kernel/check.h

Last change on this file was 167, checked in by coas-nagasima, 8 years ago

MIMEにSJISを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 12.2 KB
RevLine 
[164]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-2014 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 167 2016-03-08 11:37:45Z coas-nagasima $
41 */
42
43/*
44 * エラーチェック用マクロ
45 */
46
47#ifndef TOPPERS_CHECK_H
48#define TOPPERS_CHECK_H
49
50/*
51 * 予約属性エラーのチェック(E_PAR)
52 */
53#define CHECK_RSATR(atr, valid_atr) do { \
54 if (((atr) & ~(valid_atr)) != 0U) { \
55 ercd = E_RSATR; \
56 goto error_exit; \
57 } \
58} while (false)
59
60/*
61 * 優先度の範囲の判定
62 */
63#define VALID_TPRI(tpri) (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
64
65#define VALID_DPRI(dpri) (TMIN_DPRI <= (dpri) && (dpri) <= TMAX_DPRI)
66
67#define VALID_MPRI(mpri) (TMIN_MPRI <= (mpri) && (mpri) <= TMAX_MPRI)
68
69#define VALID_ISRPRI(isrpri) \
70 (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI)
71
72#ifndef VALID_INTPRI_CHGIPM
73#define VALID_INTPRI_CHGIPM(intpri) \
74 (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
75#endif /* VALID_INTPRI_CHGIPM */
76
77/*
78 * タスク優先度のチェック(E_PAR)
79 */
80#define CHECK_TPRI(tpri) do { \
81 if (!VALID_TPRI(tpri)) { \
82 ercd = E_PAR; \
83 goto error_exit; \
84 } \
85} while (false)
86
87#define CHECK_TPRI_INI(tpri) do { \
88 if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) { \
89 ercd = E_PAR; \
90 goto error_exit; \
91 } \
92} while (false)
93
94#define CHECK_TPRI_SELF(tpri) do { \
95 if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) { \
96 ercd = E_PAR; \
97 goto error_exit; \
98 } \
99} while (false)
100
101/*
102 * データ優先度のチェック(E_PAR)
103 */
104#define CHECK_DPRI(dpri) do { \
105 if (!VALID_DPRI(dpri)) { \
106 ercd = E_PAR; \
107 goto error_exit; \
108 } \
109} while (false)
110
111/*
112 * メッセージ優先度のチェック(E_PAR)
113 */
114#define CHECK_MPRI(mpri) do { \
115 if (!VALID_MPRI(mpri)) { \
116 ercd = E_PAR; \
117 goto error_exit; \
118 } \
119} while (false)
120
121/*
122 * 割込みサービスルーチン優先度のチェック(E_PAR)
123 */
124#define CHECK_ISRPRI(isrpri) do { \
125 if (!VALID_ISRPRI(isrpri)) { \
126 ercd = E_PAR; \
127 goto error_exit; \
128 } \
129} while (false)
130
131/*
132 * タイムアウト指定値のチェック(E_PAR)
133 */
134#define CHECK_TMOUT(tmout) do { \
135 if (!(TMO_FEVR <= (tmout))) { \
136 ercd = E_PAR; \
137 goto error_exit; \
138 } \
139} while (false)
140
141/*
142 * 割込み優先度のチェック(E_PAR)
143 */
144#define CHECK_INTPRI_CHGIPM(intpri) do { \
145 if (!VALID_INTPRI_CHGIPM(intpri)) { \
146 ercd = E_PAR; \
147 goto error_exit; \
148 } \
149} while (false)
150
151/*
152 * 割込み番号のチェック(E_PAR)
153 */
154#define CHECK_INTNO_CREISR(intno) do { \
155 if (!VALID_INTNO_CREISR(intno)) { \
156 ercd = E_PAR; \
157 goto error_exit; \
158 } \
159} while (false)
160
161#define CHECK_INTNO_DISINT(intno) do { \
162 if (!VALID_INTNO_DISINT(intno)) { \
163 ercd = E_PAR; \
164 goto error_exit; \
165 } \
166} while (false)
167
168/*
169 * アラインしているかの判定
170 */
171#define ALIGNED(val, align) ((((uintptr_t)(val)) & ((align) - 1U)) == 0U)
172
173#ifdef CHECK_FUNC_ALIGN
174#define FUNC_ALIGNED(func) ALIGNED(func, CHECK_FUNC_ALIGN)
175#else /* CHECK_FUNC_ALIGN */
176#define FUNC_ALIGNED(func) true
177#endif /* CHECK_FUNC_ALIGN */
178
179#ifdef CHECK_STKSZ_ALIGN
180#define STKSZ_ALIGNED(stksz) ALIGNED(stksz, CHECK_STKSZ_ALIGN)
181#else /* CHECK_STKSZ_ALIGN */
182#define STKSZ_ALIGNED(stksz) true
183#endif /* CHECK_STKSZ_ALIGN */
184
185#ifdef CHECK_STACK_ALIGN
186#define STACK_ALIGNED(stack) ALIGNED(stack, CHECK_STACK_ALIGN)
187#else /* CHECK_STACK_ALIGN */
188#define STACK_ALIGNED(stack) true
189#endif /* CHECK_STACK_ALIGN */
190
191#ifdef CHECK_MPF_ALIGN
192#define MPF_ALIGNED(mpf) ALIGNED(mpf, CHECK_MPF_ALIGN)
193#else /* CHECK_MPF_ALIGN */
194#define MPF_ALIGNED(mpf) true
195#endif /* CHECK_MPF_ALIGN */
196
197#ifdef CHECK_MB_ALIGN
198#define MB_ALIGNED(mb) ALIGNED(mb, CHECK_MB_ALIGN)
199#else /* CHECK_MB_ALIGN */
200#define MB_ALIGNED(mb) true
201#endif /* CHECK_MB_ALIGN */
202
203/*
204 * NULLでないことのチェック
205 */
206#ifdef CHECK_FUNC_NONNULL
207#define FUNC_NONNULL(func) ((func) != NULL)
208#else /* CHECK_FUNC_NONNULL */
209#define FUNC_NONNULL(func) true
210#endif /* CHECK_FUNC_NONNULL */
211
212/*
213 * 関数の先頭番地のチェック(E_PAR)
214 */
215#define CHECK_ALIGN_FUNC(func) do { \
216 if (!FUNC_ALIGNED(func)) { \
217 ercd = E_PAR; \
218 goto error_exit; \
219 } \
220} while (false)
221
222#define CHECK_NONNULL_FUNC(func) do { \
223 if (!FUNC_NONNULL(func)) { \
224 ercd = E_PAR; \
225 goto error_exit; \
226 } \
227} while (false)
228
229/*
230 * スタックサイズのチェック(E_PAR)
231 */
232#define CHECK_ALIGN_STKSZ(stksz) do { \
233 if (!STKSZ_ALIGNED(stksz)) { \
234 ercd = E_PAR; \
235 goto error_exit; \
236 } \
237} while (false)
238
239/*
240 * スタックの先頭番地のチェック(E_PAR)
241 */
242#define CHECK_ALIGN_STACK(stack) do { \
243 if (!STACK_ALIGNED(stack)) { \
244 ercd = E_PAR; \
245 goto error_exit; \
246 } \
247} while (false)
248
249/*
250 * 固定長メモリプール領域の先頭番地のチェック(E_PAR)
251 */
252#define CHECK_ALIGN_MPF(mpf) do { \
253 if (!MPF_ALIGNED(mpf)) { \
254 ercd = E_PAR; \
255 goto error_exit; \
256 } \
257} while (false)
258
259/*
260 * 管理領域の先頭番地のチェック(E_PAR)
261 */
262#define CHECK_ALIGN_MB(mb) do { \
263 if (!MB_ALIGNED(mb)) { \
264 ercd = E_PAR; \
265 goto error_exit; \
266 } \
267} while (false)
268
269/*
270 * その他のパラメータエラーのチェック(E_PAR)
271 */
272#define CHECK_PAR(exp) do { \
273 if (!(exp)) { \
274 ercd = E_PAR; \
275 goto error_exit; \
276 } \
277} while (false)
278
279/*
280 * オブジェクトIDの範囲の判定
281 */
282#define VALID_TSKID(tskid) (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
283#define VALID_SEMID(semid) (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
284#define VALID_FLGID(flgid) (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
285#define VALID_DTQID(dtqid) (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
286#define VALID_PDQID(pdqid) (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
287#define VALID_MBXID(mbxid) (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
288#define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
289#define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
290#define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
291#define VALID_ISRID(isrid) (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid)
292
293/*
294 * オブジェクトIDのチェック(E_ID)
295 */
296#define CHECK_TSKID(tskid) do { \
297 if (!VALID_TSKID(tskid)) { \
298 ercd = E_ID; \
299 goto error_exit; \
300 } \
301} while (false)
302
303#define CHECK_TSKID_SELF(tskid) do { \
304 if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \
305 ercd = E_ID; \
306 goto error_exit; \
307 } \
308} while (false)
309
310#define CHECK_SEMID(semid) do { \
311 if (!VALID_SEMID(semid)) { \
312 ercd = E_ID; \
313 goto error_exit; \
314 } \
315} while (false)
316
317#define CHECK_FLGID(flgid) do { \
318 if (!VALID_FLGID(flgid)) { \
319 ercd = E_ID; \
320 goto error_exit; \
321 } \
322} while (false)
323
324#define CHECK_DTQID(dtqid) do { \
325 if (!VALID_DTQID(dtqid)) { \
326 ercd = E_ID; \
327 goto error_exit; \
328 } \
329} while (false)
330
331#define CHECK_PDQID(pdqid) do { \
332 if (!VALID_PDQID(pdqid)) { \
333 ercd = E_ID; \
334 goto error_exit; \
335 } \
336} while (false)
337
338#define CHECK_MBXID(mbxid) do { \
339 if (!VALID_MBXID(mbxid)) { \
340 ercd = E_ID; \
341 goto error_exit; \
342 } \
343} while (false)
344
345#define CHECK_MPFID(mpfid) do { \
346 if (!VALID_MPFID(mpfid)) { \
347 ercd = E_ID; \
348 goto error_exit; \
349 } \
350} while (false)
351
352#define CHECK_CYCID(cycid) do { \
353 if (!VALID_CYCID(cycid)) { \
354 ercd = E_ID; \
355 goto error_exit; \
356 } \
357} while (false)
358
359#define CHECK_ALMID(almid) do { \
360 if (!VALID_ALMID(almid)) { \
361 ercd = E_ID; \
362 goto error_exit; \
363 } \
364} while (false)
365
366#define CHECK_ISRID(isrid) do { \
367 if (!VALID_ISRID(isrid)) { \
368 ercd = E_ID; \
369 goto error_exit; \
370 } \
371} while (false)
372
373/*
374 * 呼出しコンテキストのチェック(E_CTX)
375 */
376#define CHECK_TSKCTX() do { \
377 if (sense_context()) { \
378 ercd = E_CTX; \
379 goto error_exit; \
380 } \
381} while (false)
382
383#define CHECK_INTCTX() do { \
384 if (!sense_context()) { \
385 ercd = E_CTX; \
386 goto error_exit; \
387 } \
388} while (false)
389
390/*
391 * 呼出しコンテキストとCPUロック状態のチェック(E_CTX)
392 */
393#define CHECK_TSKCTX_UNL() do { \
394 if (sense_context() || t_sense_lock()) { \
395 ercd = E_CTX; \
396 goto error_exit; \
397 } \
398} while (false)
399
400#define CHECK_INTCTX_UNL() do { \
401 if (!sense_context() || i_sense_lock()) { \
402 ercd = E_CTX; \
403 goto error_exit; \
404 } \
405} while (false)
406
407/*
408 * ディスパッチ保留状態でないかのチェック(E_CTX)
409 */
410#define CHECK_DISPATCH() do { \
411 if (sense_context() || t_sense_lock() || !dspflg) { \
412 ercd = E_CTX; \
413 goto error_exit; \
414 } \
415} while (false)
416
417/*
418 * その他のコンテキストエラーのチェック(E_CTX)
419 */
420#define CHECK_CTX(exp) do { \
421 if (!(exp)) { \
422 ercd = E_CTX; \
423 goto error_exit; \
424 } \
425} while (false)
426
427/*
428 * 自タスクを指定していないかのチェック(E_ILUSE)
429 */
430#define CHECK_NONSELF(p_tcb) do { \
431 if ((p_tcb) == p_runtsk) { \
432 ercd = E_ILUSE; \
433 goto error_exit; \
434 } \
435} while (false)
436
437/*
438 * その他の不正使用エラーのチェック(E_ILUSE)
439 */
440#define CHECK_ILUSE(exp) do { \
441 if (!(exp)) { \
442 ercd = E_ILUSE; \
443 goto error_exit; \
444 } \
445} while (false)
446
447/*
448 * 未サポート機能エラーのチェック(E_NOSPT)
449 */
450#define CHECK_NOSPT(exp) do { \
451 if (!(exp)) { \
452 ercd = E_NOSPT; \
453 goto error_exit; \
454 } \
455} while (false)
456
457/*
458 * 静的なオブジェクト状態エラーのチェック(E_OBJ)
459 */
460#define CHECK_OBJ(exp) do { \
461 if (!(exp)) { \
462 ercd = E_OBJ; \
463 goto error_exit; \
464 } \
465} while (false)
466
467#endif /* TOPPERS_CHECK_H */
Note: See TracBrowser for help on using the repository browser.