/* * TOPPERS/ASP Kernel * Toyohashi Open Platform for Embedded Real-Time Systems/ * Advanced Standard Profile Kernel * * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory * Toyohashi Univ. of Technology, JAPAN * Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory * Graduate School of Information Science, Nagoya Univ., JAPAN * * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー * スコード中に含まれていること. * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 * の無保証規定を掲載すること. * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ * と. * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 * 作権表示,この利用条件および下記の無保証規定を掲載すること. * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに * 報告すること. * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを * 免責すること. * * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ * の責任を負わない. * * $Id: check.h 356 2015-07-25 10:44:32Z ertl-hiro $ */ /* * エラーチェック用マクロ */ #ifndef TOPPERS_CHECK_H #define TOPPERS_CHECK_H #include "kernel_impl.h" /* * オブジェクトIDの範囲の判定 */ #define VALID_TSKID(tskid) (TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid) #define VALID_SEMID(semid) (TMIN_SEMID <= (semid) && (semid) <= tmax_semid) #define VALID_FLGID(flgid) (TMIN_FLGID <= (flgid) && (flgid) <= tmax_flgid) #define VALID_DTQID(dtqid) (TMIN_DTQID <= (dtqid) && (dtqid) <= tmax_dtqid) #define VALID_PDQID(pdqid) (TMIN_PDQID <= (pdqid) && (pdqid) <= tmax_pdqid) #define VALID_MTXID(mtxid) (TMIN_MTXID <= (mtxid) && (mtxid) <= tmax_mtxid) #define VALID_MPFID(mpfid) (TMIN_MPFID <= (mpfid) && (mpfid) <= tmax_mpfid) #define VALID_CYCID(cycid) (TMIN_CYCID <= (cycid) && (cycid) <= tmax_cycid) #define VALID_ALMID(almid) (TMIN_ALMID <= (almid) && (almid) <= tmax_almid) #define VALID_ISRID(isrid) (TMIN_ISRID <= (isrid) && (isrid) <= tmax_isrid) /* * オブジェクト番号の範囲の判定 */ #ifndef VALID_INTNO_DISINT #define VALID_INTNO_DISINT(intno) VALID_INTNO(intno) #endif /* VALID_INTNO_DISINT */ #ifndef VALID_INTNO_CREISR #define VALID_INTNO_CREISR(intno) VALID_INTNO(intno) #endif /* VALID_INTNO_CREISR */ /* * 優先度の範囲の判定 */ #define VALID_TPRI(tpri) (TMIN_TPRI <= (tpri) && (tpri) <= TMAX_TPRI) #define VALID_DPRI(dpri) (TMIN_DPRI <= (dpri) && (dpri) <= TMAX_DPRI) #define VALID_ISRPRI(isrpri) \ (TMIN_ISRPRI <= (isrpri) && (isrpri) <= TMAX_ISRPRI) #ifndef VALID_INTPRI_CHGIPM #define VALID_INTPRI_CHGIPM(intpri) \ (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL) #endif /* VALID_INTPRI_CHGIPM */ /* * 相対時間の範囲の判定 */ #define VALID_RELTIM(reltim) ((reltim) <= TMAX_RELTIM) /* * タイムアウト指定値の範囲の判定 */ #define VALID_TMOUT(tmout) ((tmout) <= TMAX_RELTIM || (tmout) == TMO_FEVR \ || (tmout) == TMO_POL) /* * アラインしているかの判定 */ #define ALIGNED(val, align) ((((uintptr_t)(val)) & ((align) - 1U)) == 0U) #ifdef CHECK_STKSZ_ALIGN #define STKSZ_ALIGN(stksz) ALIGNED(stksz, CHECK_STKSZ_ALIGN) #else /* CHECK_STKSZ_ALIGN */ #define STKSZ_ALIGN(stksz) true #endif /* CHECK_STKSZ_ALIGN */ #ifdef CHECK_INTPTR_ALIGN #define INTPTR_ALIGN(p_var) ALIGNED(p_var, CHECK_INTPTR_ALIGN) #else /* CHECK_INTPTR_ALIGN */ #define INTPTR_ALIGN(p_var) true #endif /* CHECK_INTPTR_ALIGN */ #ifdef CHECK_FUNC_ALIGN #define FUNC_ALIGN(func) ALIGNED(func, CHECK_FUNC_ALIGN) #else /* CHECK_FUNC_ALIGN */ #define FUNC_ALIGN(func) true #endif /* CHECK_FUNC_ALIGN */ #ifdef CHECK_STACK_ALIGN #define STACK_ALIGN(stack) ALIGNED(stack, CHECK_STACK_ALIGN) #else /* CHECK_STACK_ALIGN */ #define STACK_ALIGN(stack) true #endif /* CHECK_STACK_ALIGN */ #ifdef CHECK_MPF_ALIGN #define MPF_ALIGN(mpf) ALIGNED(mpf, CHECK_MPF_ALIGN) #else /* CHECK_MPF_ALIGN */ #define MPF_ALIGN(mpf) true #endif /* CHECK_MPF_ALIGN */ #ifdef CHECK_MB_ALIGN #define MB_ALIGN(mb) ALIGNED(mb, CHECK_MB_ALIGN) #else /* CHECK_MB_ALIGN */ #define MB_ALIGN(mb) true #endif /* CHECK_MB_ALIGN */ /* * NULLでないことの判定 */ #ifdef CHECK_INTPTR_NONNULL #define INTPTR_NONNULL(p_var) ((p_var) != NULL) #else /* CHECK_INTPTR_NONNULL */ #define INTPTR_NONNULL(p_var) true #endif /* CHECK_INTPTR_NONNULL */ #ifdef CHECK_FUNC_NONNULL #define FUNC_NONNULL(func) ((func) != NULL) #else /* CHECK_FUNC_NONNULL */ #define FUNC_NONNULL(func) true #endif /* CHECK_FUNC_NONNULL */ /* * 呼出しコンテキストのチェック(E_CTX) */ #define CHECK_TSKCTX() do { \ if (sense_context()) { \ ercd = E_CTX; \ goto error_exit; \ } \ } while (false) /* * CPUロック状態のチェック(E_CTX) */ #define CHECK_UNL() do { \ if (sense_lock()) { \ ercd = E_CTX; \ goto error_exit; \ } \ } while (false) /* * 呼出しコンテキストとCPUロック状態のチェック(E_CTX) */ #define CHECK_TSKCTX_UNL() do { \ if (sense_context() || sense_lock()) { \ ercd = E_CTX; \ goto error_exit; \ } \ } while (false) /* * ディスパッチ保留状態でないかのチェック(E_CTX) */ #define CHECK_DISPATCH() do { \ if (sense_context() || sense_lock() || !dspflg) { \ ercd = E_CTX; \ goto error_exit; \ } \ } while (false) /* * その他のコンテキストエラーのチェック(E_CTX) */ #define CHECK_CTX(exp) do { \ if (!(exp)) { \ ercd = E_CTX; \ goto error_exit; \ } \ } while (false) /* * オブジェクトIDのチェック(E_ID) */ #define CHECK_ID(exp) do { \ if (!(exp)) { \ ercd = E_ID; \ goto error_exit; \ } \ } while (false) /* * 予約属性エラーのチェック(E_PAR) */ #define CHECK_RSATR(atr, valid_atr) do { \ if (((atr) & ~(valid_atr)) != 0U) { \ ercd = E_RSATR; \ goto error_exit; \ } \ } while (false) /* * パラメータエラーのチェック(E_PAR) */ #define CHECK_PAR(exp) do { \ if (!(exp)) { \ ercd = E_PAR; \ goto error_exit; \ } \ } while (false) /* * 不正使用エラーのチェック(E_ILUSE) */ #define CHECK_ILUSE(exp) do { \ if (!(exp)) { \ ercd = E_ILUSE; \ goto error_exit; \ } \ } while (false) /* * 静的なオブジェクト状態エラーのチェック(E_OBJ) */ #define CHECK_OBJ(exp) do { \ if (!(exp)) { \ ercd = E_OBJ; \ goto error_exit; \ } \ } while (false) #endif /* TOPPERS_CHECK_H */