source: rubycfg_asp/trunk/asp_dcre/kernel/check.h@ 313

Last change on this file since 313 was 313, checked in by coas-nagasima, 7 years ago

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr
File size: 13.3 KB
Line 
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 * 上記著作権者
12は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * @(#) $Id: check.h 313 2017-07-23 04:50:32Z coas-nagasima $
56 */
57
58/*
59 * エラーチェック用マクロ
60 */
61
62#ifndef TOPPERS_CHECK_H
63#define TOPPERS_CHECK_H
64
65/*
66 * 予約属性エラーのチェック(E_PAR)
67 */
68#define CHECK_RSATR(atr, valid_atr) do { \
69 if (((atr) & ~(valid_atr)) != 0U) { \
70 ercd = E_RSATR; \
71 goto error_exit; \
72 } \
73} while (false)
74
75/*
76 * 優å…
77ˆåº¦ã®ç¯„囲の判定
78 */
79#define VALID_TPRI(tpri) (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI)
80
81#define VALID_DPRI(dpri) (TMIN_DPRI <= (dpri) && (dpri) <= TMAX_DPRI)
82
83#define VALID_MPRI(mpri) (TMIN_MPRI <= (mpri) && (mpri) <= TMAX_MPRI)
84
85#define VALID_ISRPRI(isrpri) \
86 (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI)
87
88#ifndef VALID_INTPRI_CHGIPM
89#define VALID_INTPRI_CHGIPM(intpri) \
90 (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
91#endif /* VALID_INTPRI_CHGIPM */
92
93/*
94 * タスク優å…
95ˆåº¦ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
96 */
97#define CHECK_TPRI(tpri) do { \
98 if (!VALID_TPRI(tpri)) { \
99 ercd = E_PAR; \
100 goto error_exit; \
101 } \
102} while (false)
103
104#define CHECK_TPRI_INI(tpri) do { \
105 if (!(VALID_TPRI(tpri) || (tpri) == TPRI_INI)) { \
106 ercd = E_PAR; \
107 goto error_exit; \
108 } \
109} while (false)
110
111#define CHECK_TPRI_SELF(tpri) do { \
112 if (!(VALID_TPRI(tpri) || (tpri) == TPRI_SELF)) { \
113 ercd = E_PAR; \
114 goto error_exit; \
115 } \
116} while (false)
117
118/*
119 * データ優å…
120ˆåº¦ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
121 */
122#define CHECK_DPRI(dpri) do { \
123 if (!VALID_DPRI(dpri)) { \
124 ercd = E_PAR; \
125 goto error_exit; \
126 } \
127} while (false)
128
129/*
130 * メッセージ優å…
131ˆåº¦ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
132 */
133#define CHECK_MPRI(mpri) do { \
134 if (!VALID_MPRI(mpri)) { \
135 ercd = E_PAR; \
136 goto error_exit; \
137 } \
138} while (false)
139
140/*
141 * 割込みサービスルーチン優å…
142ˆåº¦ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
143 */
144#define CHECK_ISRPRI(isrpri) do { \
145 if (!VALID_ISRPRI(isrpri)) { \
146 ercd = E_PAR; \
147 goto error_exit; \
148 } \
149} while (false)
150
151/*
152 * タイムアウト指定値のチェック(E_PAR)
153 */
154#define CHECK_TMOUT(tmout) do { \
155 if (!(TMO_FEVR <= (tmout))) { \
156 ercd = E_PAR; \
157 goto error_exit; \
158 } \
159} while (false)
160
161/*
162 * 割込み優å…
163ˆåº¦ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
164 */
165#define CHECK_INTPRI_CHGIPM(intpri) do { \
166 if (!VALID_INTPRI_CHGIPM(intpri)) { \
167 ercd = E_PAR; \
168 goto error_exit; \
169 } \
170} while (false)
171
172/*
173 * 割込み番号のチェック(E_PAR)
174 */
175#define CHECK_INTNO_CREISR(intno) do { \
176 if (!VALID_INTNO_CREISR(intno)) { \
177 ercd = E_PAR; \
178 goto error_exit; \
179 } \
180} while (false)
181
182#define CHECK_INTNO_DISINT(intno) do { \
183 if (!VALID_INTNO_DISINT(intno)) { \
184 ercd = E_PAR; \
185 goto error_exit; \
186 } \
187} while (false)
188
189/*
190 * アラインしているかの判定
191 */
192#define ALIGNED(val, align) ((((uintptr_t)(val)) & ((align) - 1U)) == 0U)
193
194#ifdef CHECK_FUNC_ALIGN
195#define FUNC_ALIGNED(func) ALIGNED(func, CHECK_FUNC_ALIGN)
196#else /* CHECK_FUNC_ALIGN */
197#define FUNC_ALIGNED(func) true
198#endif /* CHECK_FUNC_ALIGN */
199
200#ifdef CHECK_STKSZ_ALIGN
201#define STKSZ_ALIGNED(stksz) ALIGNED(stksz, CHECK_STKSZ_ALIGN)
202#else /* CHECK_STKSZ_ALIGN */
203#define STKSZ_ALIGNED(stksz) true
204#endif /* CHECK_STKSZ_ALIGN */
205
206#ifdef CHECK_STACK_ALIGN
207#define STACK_ALIGNED(stack) ALIGNED(stack, CHECK_STACK_ALIGN)
208#else /* CHECK_STACK_ALIGN */
209#define STACK_ALIGNED(stack) true
210#endif /* CHECK_STACK_ALIGN */
211
212#ifdef CHECK_MPF_ALIGN
213#define MPF_ALIGNED(mpf) ALIGNED(mpf, CHECK_MPF_ALIGN)
214#else /* CHECK_MPF_ALIGN */
215#define MPF_ALIGNED(mpf) true
216#endif /* CHECK_MPF_ALIGN */
217
218#ifdef CHECK_MB_ALIGN
219#define MB_ALIGNED(mb) ALIGNED(mb, CHECK_MB_ALIGN)
220#else /* CHECK_MB_ALIGN */
221#define MB_ALIGNED(mb) true
222#endif /* CHECK_MB_ALIGN */
223
224/*
225 * NULLでないことのチェック
226 */
227#ifdef CHECK_FUNC_NONNULL
228#define FUNC_NONNULL(func) ((func) != NULL)
229#else /* CHECK_FUNC_NONNULL */
230#define FUNC_NONNULL(func) true
231#endif /* CHECK_FUNC_NONNULL */
232
233/*
234 * 関数のå…
235ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
236 */
237#define CHECK_ALIGN_FUNC(func) do { \
238 if (!FUNC_ALIGNED(func)) { \
239 ercd = E_PAR; \
240 goto error_exit; \
241 } \
242} while (false)
243
244#define CHECK_NONNULL_FUNC(func) do { \
245 if (!FUNC_NONNULL(func)) { \
246 ercd = E_PAR; \
247 goto error_exit; \
248 } \
249} while (false)
250
251/*
252 * スタックサイズのチェック(E_PAR)
253 */
254#define CHECK_ALIGN_STKSZ(stksz) do { \
255 if (!STKSZ_ALIGNED(stksz)) { \
256 ercd = E_PAR; \
257 goto error_exit; \
258 } \
259} while (false)
260
261/*
262 * スタックのå…
263ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
264 */
265#define CHECK_ALIGN_STACK(stack) do { \
266 if (!STACK_ALIGNED(stack)) { \
267 ercd = E_PAR; \
268 goto error_exit; \
269 } \
270} while (false)
271
272/*
273 * 固定長メモリプール領域のå…
274ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
275 */
276#define CHECK_ALIGN_MPF(mpf) do { \
277 if (!MPF_ALIGNED(mpf)) { \
278 ercd = E_PAR; \
279 goto error_exit; \
280 } \
281} while (false)
282
283/*
284 * 管理領域のå…
285ˆé ­ç•ªåœ°ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_PAR)
286 */
287#define CHECK_ALIGN_MB(mb) do { \
288 if (!MB_ALIGNED(mb)) { \
289 ercd = E_PAR; \
290 goto error_exit; \
291 } \
292} while (false)
293
294/*
295 * その他のパラメータエラーのチェック(E_PAR)
296 */
297#define CHECK_PAR(exp) do { \
298 if (!(exp)) { \
299 ercd = E_PAR; \
300 goto error_exit; \
301 } \
302} while (false)
303
304/*
305 * オブジェクトIDの範囲の判定
306 */
307#define VALID_TSKID(tskid) (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)
308#define VALID_SEMID(semid) (TMIN_SEMID <= (semid) && (semid) <= tmax_semid)
309#define VALID_FLGID(flgid) (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid)
310#define VALID_DTQID(dtqid) (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid)
311#define VALID_PDQID(pdqid) (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid)
312#define VALID_MBXID(mbxid) (TMIN_MBXID <= (mbxid) && (mbxid) <= tmax_mbxid)
313#define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
314#define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
315#define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
316#define VALID_ISRID(isrid) (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid)
317
318/*
319 * オブジェクトIDのチェック(E_ID)
320 */
321#define CHECK_TSKID(tskid) do { \
322 if (!VALID_TSKID(tskid)) { \
323 ercd = E_ID; \
324 goto error_exit; \
325 } \
326} while (false)
327
328#define CHECK_TSKID_SELF(tskid) do { \
329 if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \
330 ercd = E_ID; \
331 goto error_exit; \
332 } \
333} while (false)
334
335#define CHECK_SEMID(semid) do { \
336 if (!VALID_SEMID(semid)) { \
337 ercd = E_ID; \
338 goto error_exit; \
339 } \
340} while (false)
341
342#define CHECK_FLGID(flgid) do { \
343 if (!VALID_FLGID(flgid)) { \
344 ercd = E_ID; \
345 goto error_exit; \
346 } \
347} while (false)
348
349#define CHECK_DTQID(dtqid) do { \
350 if (!VALID_DTQID(dtqid)) { \
351 ercd = E_ID; \
352 goto error_exit; \
353 } \
354} while (false)
355
356#define CHECK_PDQID(pdqid) do { \
357 if (!VALID_PDQID(pdqid)) { \
358 ercd = E_ID; \
359 goto error_exit; \
360 } \
361} while (false)
362
363#define CHECK_MBXID(mbxid) do { \
364 if (!VALID_MBXID(mbxid)) { \
365 ercd = E_ID; \
366 goto error_exit; \
367 } \
368} while (false)
369
370#define CHECK_MPFID(mpfid) do { \
371 if (!VALID_MPFID(mpfid)) { \
372 ercd = E_ID; \
373 goto error_exit; \
374 } \
375} while (false)
376
377#define CHECK_CYCID(cycid) do { \
378 if (!VALID_CYCID(cycid)) { \
379 ercd = E_ID; \
380 goto error_exit; \
381 } \
382} while (false)
383
384#define CHECK_ALMID(almid) do { \
385 if (!VALID_ALMID(almid)) { \
386 ercd = E_ID; \
387 goto error_exit; \
388 } \
389} while (false)
390
391#define CHECK_ISRID(isrid) do { \
392 if (!VALID_ISRID(isrid)) { \
393 ercd = E_ID; \
394 goto error_exit; \
395 } \
396} while (false)
397
398/*
399 * 呼出しコンテキストのチェック(E_CTX)
400 */
401#define CHECK_TSKCTX() do { \
402 if (sense_context()) { \
403 ercd = E_CTX; \
404 goto error_exit; \
405 } \
406} while (false)
407
408#define CHECK_INTCTX() do { \
409 if (!sense_context()) { \
410 ercd = E_CTX; \
411 goto error_exit; \
412 } \
413} while (false)
414
415/*
416 * 呼出しコンテキストとCPUロック状æ…
417‹ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_CTX)
418 */
419#define CHECK_TSKCTX_UNL() do { \
420 if (sense_context() || t_sense_lock()) { \
421 ercd = E_CTX; \
422 goto error_exit; \
423 } \
424} while (false)
425
426#define CHECK_INTCTX_UNL() do { \
427 if (!sense_context() || i_sense_lock()) { \
428 ercd = E_CTX; \
429 goto error_exit; \
430 } \
431} while (false)
432
433/*
434 * ディスパッチ保留状æ…
435‹ã§ãªã„かのチェック(E_CTX)
436 */
437#define CHECK_DISPATCH() do { \
438 if (sense_context() || t_sense_lock() || !dspflg) { \
439 ercd = E_CTX; \
440 goto error_exit; \
441 } \
442} while (false)
443
444/*
445 * その他のコンテキストエラーのチェック(E_CTX)
446 */
447#define CHECK_CTX(exp) do { \
448 if (!(exp)) { \
449 ercd = E_CTX; \
450 goto error_exit; \
451 } \
452} while (false)
453
454/*
455 * 自タスクを指定していないかのチェック(E_ILUSE)
456 */
457#define CHECK_NONSELF(p_tcb) do { \
458 if ((p_tcb) == p_runtsk) { \
459 ercd = E_ILUSE; \
460 goto error_exit; \
461 } \
462} while (false)
463
464/*
465 * その他の不正使用エラーのチェック(E_ILUSE)
466 */
467#define CHECK_ILUSE(exp) do { \
468 if (!(exp)) { \
469 ercd = E_ILUSE; \
470 goto error_exit; \
471 } \
472} while (false)
473
474/*
475 * 未サポート機能エラーのチェック(E_NOSPT)
476 */
477#define CHECK_NOSPT(exp) do { \
478 if (!(exp)) { \
479 ercd = E_NOSPT; \
480 goto error_exit; \
481 } \
482} while (false)
483
484/*
485 * 静的なオブジェクト状æ…
486‹ã‚¨ãƒ©ãƒ¼ã®ãƒã‚§ãƒƒã‚¯ï¼ˆE_OBJ)
487 */
488#define CHECK_OBJ(exp) do { \
489 if (!(exp)) { \
490 ercd = E_OBJ; \
491 goto error_exit; \
492 } \
493} while (false)
494
495#endif /* TOPPERS_CHECK_H */
Note: See TracBrowser for help on using the repository browser.