source: azure_iot_hub_riscv/trunk/asp_baseplatform/kernel/check.h@ 453

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

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 13.6 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 * 上記著作権者は,以下の(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$
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_MTXID(mtxid) (TMIN_MTXID <= (mtxid) && (mtxid) <= tmax_mtxid)
289#define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid)
290#define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid)
291#define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid)
292#define VALID_ISRID(isrid) (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid)
293
294/*
295 * オブジェクトIDのチェック(E_ID)
296 */
297#define CHECK_TSKID(tskid) do { \
298 if (!VALID_TSKID(tskid)) { \
299 ercd = E_ID; \
300 goto error_exit; \
301 } \
302} while (false)
303
304#define CHECK_TSKID_SELF(tskid) do { \
305 if (!(VALID_TSKID(tskid) || (tskid) == TSK_SELF)) { \
306 ercd = E_ID; \
307 goto error_exit; \
308 } \
309} while (false)
310
311#define CHECK_SEMID(semid) do { \
312 if (!VALID_SEMID(semid)) { \
313 ercd = E_ID; \
314 goto error_exit; \
315 } \
316} while (false)
317
318#define CHECK_FLGID(flgid) do { \
319 if (!VALID_FLGID(flgid)) { \
320 ercd = E_ID; \
321 goto error_exit; \
322 } \
323} while (false)
324
325#define CHECK_DTQID(dtqid) do { \
326 if (!VALID_DTQID(dtqid)) { \
327 ercd = E_ID; \
328 goto error_exit; \
329 } \
330} while (false)
331
332#define CHECK_PDQID(pdqid) do { \
333 if (!VALID_PDQID(pdqid)) { \
334 ercd = E_ID; \
335 goto error_exit; \
336 } \
337} while (false)
338
339#define CHECK_MBXID(mbxid) do { \
340 if (!VALID_MBXID(mbxid)) { \
341 ercd = E_ID; \
342 goto error_exit; \
343 } \
344} while (false)
345
346#define CHECK_MTXID(mtxid) do { \
347 if (!VALID_MTXID(mtxid)) { \
348 ercd = E_ID; \
349 goto error_exit; \
350 } \
351} while (false)
352
353#define CHECK_MPFID(mpfid) do { \
354 if (!VALID_MPFID(mpfid)) { \
355 ercd = E_ID; \
356 goto error_exit; \
357 } \
358} while (false)
359
360#define CHECK_CYCID(cycid) do { \
361 if (!VALID_CYCID(cycid)) { \
362 ercd = E_ID; \
363 goto error_exit; \
364 } \
365} while (false)
366
367#define CHECK_ALMID(almid) do { \
368 if (!VALID_ALMID(almid)) { \
369 ercd = E_ID; \
370 goto error_exit; \
371 } \
372} while (false)
373
374#define CHECK_ISRID(isrid) do { \
375 if (!VALID_ISRID(isrid)) { \
376 ercd = E_ID; \
377 goto error_exit; \
378 } \
379} while (false)
380
381/*
382 * 呼出しコンテキストのチェック(E_CTX)
383 */
384#define CHECK_TSKCTX() do { \
385 if (sense_context()) { \
386 ercd = E_CTX; \
387 goto error_exit; \
388 } \
389} while (false)
390
391#define CHECK_INTCTX() do { \
392 if (!sense_context()) { \
393 ercd = E_CTX; \
394 goto error_exit; \
395 } \
396} while (false)
397
398/*
399 * 呼出しコンテキストとCPUロック状態のチェック(E_CTX)
400 */
401#define CHECK_TSKCTX_UNL() do { \
402 if (sense_context() || t_sense_lock()) { \
403 ercd = E_CTX; \
404 goto error_exit; \
405 } \
406} while (false)
407
408#define CHECK_INTCTX_UNL() do { \
409 if (!sense_context() || i_sense_lock()) { \
410 ercd = E_CTX; \
411 goto error_exit; \
412 } \
413} while (false)
414
415/*
416 * ディスパッチ保留状態でないかのチェック(E_CTX)
417 */
418#define CHECK_DISPATCH() do { \
419 if (sense_context() || t_sense_lock() || !dspflg) { \
420 ercd = E_CTX; \
421 goto error_exit; \
422 } \
423} while (false)
424
425/*
426 * その他のコンテキストエラーのチェック(E_CTX)
427 */
428#define CHECK_CTX(exp) do { \
429 if (!(exp)) { \
430 ercd = E_CTX; \
431 goto error_exit; \
432 } \
433} while (false)
434
435/*
436 * 自タスクを指定していないかのチェック(E_ILUSE)
437 */
438#define CHECK_NONSELF(p_tcb) do { \
439 if ((p_tcb) == p_runtsk) { \
440 ercd = E_ILUSE; \
441 goto error_exit; \
442 } \
443} while (false)
444
445/*
446 * その他の不正使用エラーのチェック(E_ILUSE)
447 */
448#define CHECK_ILUSE(exp) do { \
449 if (!(exp)) { \
450 ercd = E_ILUSE; \
451 goto error_exit; \
452 } \
453} while (false)
454
455/*
456 * 未サポート機能エラーのチェック(E_NOSPT)
457 */
458#define CHECK_NOSPT(exp) do { \
459 if (!(exp)) { \
460 ercd = E_NOSPT; \
461 goto error_exit; \
462 } \
463} while (false)
464
465/*
466 * 静的なオブジェクト状態エラーのチェック(E_OBJ)
467 */
468#define CHECK_OBJ(exp) do { \
469 if (!(exp)) { \
470 ercd = E_OBJ; \
471 goto error_exit; \
472 } \
473} while (false)
474
475#endif /* TOPPERS_CHECK_H */
Note: See TracBrowser for help on using the repository browser.