From: ryuz Date: Tue, 4 Mar 2008 15:08:19 +0000 (+0000) Subject: (none) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=f76f811ea2a1ef61e81b8d4ebd9a01a016e70280;p=hos%2Fhos-v4a.git (none) --- diff --git a/kernel/build/common/gmake/knldep.inc b/kernel/build/common/gmake/knldep.inc index 431511a..a1d3f97 100755 --- a/kernel/build/common/gmake/knldep.inc +++ b/kernel/build/common/gmake/knldep.inc @@ -84,6 +84,9 @@ $(OBJS_DIR)/rsm_tsk.$(EXT_OBJ): $(TSKOBJ_DIR)/rsm_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)/dly_tsk.$(EXT_OBJ): $(TSKOBJ_DIR)/dly_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)/ref_tsk.$(EXT_OBJ): $(TSKOBJ_DIR)/ref_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)/ref_tst.$(EXT_OBJ): $(TSKOBJ_DIR)/ref_tst.c $(COMMON_HEADERS) +$(OBJS_DIR)/def_tex.$(EXT_OBJ): $(TSKOBJ_DIR)/def_tex.c $(COMMON_HEADERS) +$(OBJS_DIR)/ras_tex.$(EXT_OBJ): $(TSKOBJ_DIR)/ras_tex.c $(COMMON_HEADERS) +$(OBJS_DIR)/exe_tex.$(EXT_OBJ): $(TSKOBJ_DIR)/exe_tex.c $(COMMON_HEADERS) $(OBJS_DIR)/cre_sem.$(EXT_OBJ): $(SEMOBJ_DIR)/cre_sem.c $(COMMON_HEADERS) $(SEMOBJ_HEADERS) $(OBJS_DIR)/acre_sem.$(EXT_OBJ): $(SEMOBJ_DIR)/acre_sem.c $(COMMON_HEADERS) $(SEMOBJ_HEADERS) @@ -112,6 +115,7 @@ $(OBJS_DIR)/ref_flg.$(EXT_OBJ): $(FLGOBJ_DIR)/ref_flg.c $(COMMON_HEADERS) $(FLGO $(OBJS_DIR)/cre_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/cre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)/acre_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/acre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)/kcre_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/kcre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) +$(OBJS_DIR)/del_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/del_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)/snd_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/snd_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)/fsnd_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/fsnd_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)/rcv_dtq.$(EXT_OBJ): $(DTQOBJ_DIR)/rcv_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) diff --git a/kernel/build/common/gmake/knlsrc.inc b/kernel/build/common/gmake/knlsrc.inc index 32af514..5e01caa 100755 --- a/kernel/build/common/gmake/knlsrc.inc +++ b/kernel/build/common/gmake/knlsrc.inc @@ -200,6 +200,9 @@ CSRCS += $(TSKOBJ_DIR)/rsm_tsk.c CSRCS += $(TSKOBJ_DIR)/dly_tsk.c CSRCS += $(TSKOBJ_DIR)/ref_tsk.c CSRCS += $(TSKOBJ_DIR)/ref_tst.c +CSRCS += $(TSKOBJ_DIR)/def_tex.c +CSRCS += $(TSKOBJ_DIR)/ras_tex.c +CSRCS += $(TSKOBJ_DIR)/exe_tex.c # Semaphores @@ -240,6 +243,7 @@ SRC_DIRS += $(DTQOBJ_DIR) CSRCS += $(DTQOBJ_DIR)/cre_dtq.c CSRCS += $(DTQOBJ_DIR)/acre_dtq.c CSRCS += $(DTQOBJ_DIR)/kcre_dtq.c +CSRCS += $(DTQOBJ_DIR)/del_dtq.c CSRCS += $(DTQOBJ_DIR)/snd_dtq.c CSRCS += $(DTQOBJ_DIR)/fsnd_dtq.c CSRCS += $(DTQOBJ_DIR)/rcv_dtq.c diff --git a/kernel/build/common/nmake/knldep.inc b/kernel/build/common/nmake/knldep.inc index 0cae6cc..ddebc60 100755 --- a/kernel/build/common/nmake/knldep.inc +++ b/kernel/build/common/nmake/knldep.inc @@ -220,6 +220,15 @@ $(OBJS_DIR)\ref_tsk.c : $(TSKOBJ_DIR)\ref_tsk.c $(OBJS_DIR)\ref_tst.c : $(TSKOBJ_DIR)\ref_tst.c $(CMD_CP) $(TSKOBJ_DIR)\ref_tst.c $(OBJS_DIR)\ +$(OBJS_DIR)\def_tex.c : $(TSKOBJ_DIR)\def_tex.c + $(CMD_CP) $(TSKOBJ_DIR)\def_tex.c $(OBJS_DIR)\ + +$(OBJS_DIR)\ras_tex.c : $(TSKOBJ_DIR)\ras_tex.c + $(CMD_CP) $(TSKOBJ_DIR)\ras_tex.c $(OBJS_DIR)\ + +$(OBJS_DIR)\exe_tex.c : $(TSKOBJ_DIR)\exe_tex.c + $(CMD_CP) $(TSKOBJ_DIR)\exe_tex.c $(OBJS_DIR)\ + $(OBJS_DIR)\cre_sem.c : $(SEMOBJ_DIR)\cre_sem.c $(CMD_CP) $(SEMOBJ_DIR)\cre_sem.c $(OBJS_DIR)\ @@ -298,6 +307,9 @@ $(OBJS_DIR)\acre_dtq.c : $(DTQOBJ_DIR)\acre_dtq.c $(OBJS_DIR)\kcre_dtq.c : $(DTQOBJ_DIR)\kcre_dtq.c $(CMD_CP) $(DTQOBJ_DIR)\kcre_dtq.c $(OBJS_DIR)\ +$(OBJS_DIR)\del_dtq.c : $(DTQOBJ_DIR)\del_dtq.c + $(CMD_CP) $(DTQOBJ_DIR)\del_dtq.c $(OBJS_DIR)\ + $(OBJS_DIR)\snd_dtq.c : $(DTQOBJ_DIR)\snd_dtq.c $(CMD_CP) $(DTQOBJ_DIR)\snd_dtq.c $(OBJS_DIR)\ @@ -503,6 +515,9 @@ $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\rsm_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\dly_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\ref_tsk.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\ref_tst.c $(COMMON_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\def_tex.c $(COMMON_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\ras_tex.c $(COMMON_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\exe_tex.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\cre_sem.c $(COMMON_HEADERS) $(SEMOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\acre_sem.c $(COMMON_HEADERS) $(SEMOBJ_HEADERS) @@ -531,6 +546,7 @@ $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\ref_flg.c $(COMMON_HEADERS) $(FLGOB $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\cre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\acre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\kcre_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\del_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\snd_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\fsnd_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\rcv_dtq.c $(COMMON_HEADERS) $(DTQOBJ_HEADERS) diff --git a/kernel/build/common/nmake/knlsrc.inc b/kernel/build/common/nmake/knlsrc.inc index 9f0b1db..4dbb59f 100755 --- a/kernel/build/common/nmake/knlsrc.inc +++ b/kernel/build/common/nmake/knlsrc.inc @@ -239,6 +239,9 @@ CSRCS = $(CSRCS) $(TSKOBJ_DIR)\rsm_tsk.c CSRCS = $(CSRCS) $(TSKOBJ_DIR)\dly_tsk.c CSRCS = $(CSRCS) $(TSKOBJ_DIR)\ref_tsk.c CSRCS = $(CSRCS) $(TSKOBJ_DIR)\ref_tst.c +CSRCS = $(CSRCS) $(TSKOBJ_DIR)\def_tex.c +CSRCS = $(CSRCS) $(TSKOBJ_DIR)\ras_tex.c +CSRCS = $(CSRCS) $(TSKOBJ_DIR)\exe_tex.c OBJS = $(OBJS) $(OBJS_DIR)\acre_tsk.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\kcre_tsk.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\del_tsk.$(EXT_OBJ) @@ -254,6 +257,9 @@ OBJS = $(OBJS) $(OBJS_DIR)\rsm_tsk.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\dly_tsk.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\ref_tsk.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\ref_tst.$(EXT_OBJ) +OBJS = $(OBJS) $(OBJS_DIR)\def_tex.$(EXT_OBJ) +OBJS = $(OBJS) $(OBJS_DIR)\ras_tex.$(EXT_OBJ) +OBJS = $(OBJS) $(OBJS_DIR)\exe_tex.$(EXT_OBJ) # Semaphores @@ -313,6 +319,7 @@ DTQOBJ_DIR = $(KERNEL_OBJ_DIR)\dtq CSRCS = $(CSRCS) $(DTQOBJ_DIR)\cre_dtq.c CSRCS = $(CSRCS) $(DTQOBJ_DIR)\acre_dtq.c CSRCS = $(CSRCS) $(DTQOBJ_DIR)\kcre_dtq.c +CSRCS = $(CSRCS) $(DTQOBJ_DIR)\del_dtq.c CSRCS = $(CSRCS) $(DTQOBJ_DIR)\snd_dtq.c CSRCS = $(CSRCS) $(DTQOBJ_DIR)\fsnd_dtq.c CSRCS = $(CSRCS) $(DTQOBJ_DIR)\rcv_dtq.c @@ -321,6 +328,7 @@ CSRCS = $(CSRCS) $(DTQOBJ_DIR)\trcv_dtq.c OBJS = $(OBJS) $(OBJS_DIR)\cre_dtq.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\acre_dtq.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\kcre_dtq.$(EXT_OBJ) +OBJS = $(OBJS) $(OBJS_DIR)\del_dtq.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\snd_dtq.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\fsnd_dtq.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\rcv_dtq.$(EXT_OBJ) diff --git a/kernel/build/common/tmp_mkinc/mk_inc.pl b/kernel/build/common/tmp_mkinc/mk_inc.pl index 2dbcb9a..99d2951 100755 --- a/kernel/build/common/tmp_mkinc/mk_inc.pl +++ b/kernel/build/common/tmp_mkinc/mk_inc.pl @@ -134,6 +134,9 @@ "dly_tsk.c", "ref_tsk.c", "ref_tst.c", + "def_tex.c", + "ras_tex.c", + "exe_tex.c", ], [ "Semaphores", @@ -177,6 +180,7 @@ "cre_dtq.c", "acre_dtq.c", "kcre_dtq.c", + "del_dtq.c", "snd_dtq.c", "fsnd_dtq.c", "rcv_dtq.c", diff --git a/kernel/include/config/cfgerr.h b/kernel/include/config/cfgerr.h index 483ad41..397cfdc 100755 --- a/kernel/include/config/cfgerr.h +++ b/kernel/include/config/cfgerr.h @@ -71,8 +71,12 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ /* ref_tsk */ #define _KERNEL_CFG_REF_TSK_E_ID TRUE #define _KERNEL_CFG_REF_TSK_E_NOEXS TRUE +#define _KERNEL_CFG_REF_TSK_E_NOSPT FALSE /* ref_tst */ +#define _KERNEL_CFG_REF_TST_E_ID TRUE +#define _KERNEL_CFG_REF_TST_E_NOEXS TRUE +#define _KERNEL_CFG_REF_TST_E_NOSPT FALSE /* slp_tsk */ /* tslp_tsk */ @@ -267,6 +271,10 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_ACRE_DTQ_E_NOSPT FALSE /* del_dtq */ +#define _KERNEL_CFG_DEL_DTQ_E_ID TRUE +#define _KERNEL_CFG_DEL_DTQ_E_NOEXS TRUE +#define _KERNEL_CFG_DEL_DTQ_E_NOSPT FALSE + /* snd_dtq */ #define _KERNEL_CFG_SND_DTQ_E_CTX TRUE #define _KERNEL_CFG_SND_DTQ_E_ID TRUE diff --git a/kernel/include/config/cfgknl.h b/kernel/include/config/cfgknl.h index 3175f1c..f9f69a4 100755 --- a/kernel/include/config/cfgknl.h +++ b/kernel/include/config/cfgknl.h @@ -291,6 +291,32 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ +/* ------------------------------------------------------------------ */ +/* System Time Management */ +/* ------------------------------------------------------------------ */ + +/* %jp{タイムティックの周期}%en{Time Tick Period} */ +#define _KERNEL_CFG_FRACTIONAL_TIMTIC TRUE /**< %jp{コンフィギュレータでタイムティックの分数指定を許す} */ +#define _KERNEL_CFG_TIC_NUME 1 /**< %jp{デフォルトのタイムティック周期の分子} */ +#define _KERNEL_CFG_TIC_DENO 1 /**< %jp{デフォルトのタイムティック周期の分母} */ + + + +/* ------------------------------------------------------------------ */ +/* Cyclic Handlers */ +/* ------------------------------------------------------------------ */ + +/* Attribute */ +#define _KERNEL_CFG_CYC_TA_STA TRUE /**< %jp{TA_STA属性に対応する} */ +#define _KERNEL_CFG_CYC_TA_PHS TRUE /**< %jp{TA_PHS属性に対応する} */ + +/* Control block */ +#define _KERNEL_CFG_CYCCB_ALGORITHM _KERNEL_CYCCB_ALG_PTRARRAY +#define _KERNEL_CFG_CYCCB_SPLIT_RO FALSE /**< %jp{CYCCBの不変部を分割してROM部配置とするか} */ +#define _KERNEL_CFG_CYCCB_BITFIELD FALSE /**< %jp{ビットフィールドを利用してTCBを圧縮するか} */ + + + /* ---------------------------------------------- */ /* Interrupt Service Routines */ /* ---------------------------------------------- */ @@ -303,15 +329,6 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ -/* ------------------------------------------------------------------ */ -/* System Time Management */ -/* ------------------------------------------------------------------ */ - -/* %jp{タイムティックの周期}%en{Time Tick Period} */ -#define _KERNEL_CFG_FRACTIONAL_TIMTIC TRUE /**< %jp{コンフィギュレータでタイムティックの分数指定を許す} */ -#define _KERNEL_CFG_TIC_NUME 1 /**< %jp{デフォルトのタイムティック周期の分子} */ -#define _KERNEL_CFG_TIC_DENO 1 /**< %jp{デフォルトのタイムティック周期の分母} */ - /* ---------------------------------------------- */ @@ -348,13 +365,13 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_DLY_TSK TRUE /* dly_tsk */ /* Task exception handling functions */ -#define _KERNEL_CFG_DEF_TEX FALSE /* def_tex */ -#define _KERNEL_CFG_RAS_TEX FALSE /* ras_tex */ -#define _KERNEL_CFG_IRAS_TEX FALSE /* iras_tex */ -#define _KERNEL_CFG_DIS_TEX FALSE /* dis_tex */ -#define _KERNEL_CFG_ENA_TEX FALSE /* ena_tex */ -#define _KERNEL_CFG_SNS_TEX FALSE /* sns_tex */ -#define _KERNEL_CFG_REF_TEX FALSE /* ref_tex */ +#define _KERNEL_CFG_DEF_TEX TRUE /* def_tex */ +#define _KERNEL_CFG_RAS_TEX TRUE /* ras_tex */ +#define _KERNEL_CFG_IRAS_TEX TRUE /* iras_tex */ +#define _KERNEL_CFG_DIS_TEX TRUE /* dis_tex */ +#define _KERNEL_CFG_ENA_TEX TRUE /* ena_tex */ +#define _KERNEL_CFG_SNS_TEX TRUE /* sns_tex */ +#define _KERNEL_CFG_REF_TEX TRUE /* ref_tex */ /* Semaphores */ #define _KERNEL_CFG_CRE_SEM TRUE /* cre_sem */ diff --git a/kernel/include/core/toq.h b/kernel/include/core/toq.h index bba9f26..0d142c0 100755 --- a/kernel/include/core/toq.h +++ b/kernel/include/core/toq.h @@ -38,7 +38,7 @@ typedef struct _kernel_t_toqcb #define _KERNEL_TSK_SET_TOQPREV(tcb, x) do { (tcb)->toqobj_prev = (x); } while (0) #define _KERNEL_TSK_GET_TOQPREV(tcb) ((tcb)->toqobj_prev) #define _KERNEL_TSK_SET_TOQDIFTIM(tcb, x) do { (tcb)->toqobj_diftim = (x); } while (0) -#define _KERNEL_TSK_GET_TOQDIFTIM(tcb) ((tcb)->toqobj_diftim) +#define _KERNEL_TSK_GET_TOQDIFTIM(tcbl) ((tcb)->toqobj_diftim) diff --git a/kernel/include/object/cycobj.h b/kernel/include/object/cycobj.h index 203fa7d..0115de5 100755 --- a/kernel/include/object/cycobj.h +++ b/kernel/include/object/cycobj.h @@ -183,7 +183,7 @@ extern _KERNEL_T_CYCCB _kernel_cyccb_tbl[]; /**< %jp{周期ハン /* %jp{ポインタ配列管理の場合}%en{pointer array} */ extern _KERNEL_T_CYCCB *_kernel_cyccb_tbl[]; /**< %jp{周期ハンドラコントロールブロックテーブル} */ -#define _KERNEL_CYC_ID2CYCCB(cycid) (_kernel_cyccb_tbl[(cycid) - _KERNEL_TMIN_CYCID]) /**< %jp{周期ハンドラIDからCYCCB アドレスを取得} */ +#define _KERNEL_CYC_ID2CYCCB(cycid) (_kernel_cyccb_tbl[(cycid) - _KERNEL_CYC_TMIN_ID]) /**< %jp{周期ハンドラIDからCYCCB アドレスを取得} */ #define _KERNEL_CYC_CHECK_EXS(cycid) (_KERNEL_CYC_ID2CYCCB(cycid) != NULL) /**< %jp{オブジェクトの存在チェック} */ #endif diff --git a/kernel/include/object/dtqobj.h b/kernel/include/object/dtqobj.h index 509ba83..fa4269f 100755 --- a/kernel/include/object/dtqobj.h +++ b/kernel/include/object/dtqobj.h @@ -293,6 +293,7 @@ extern _KERNEL_T_DTQCB *_kernel_dtqcb_tbl[]; /**< %jp{データキ #define _KERNEL_DTQ_GET_DTQCNT(dtqcb_ro) (0) #endif + /* dtq */ #if _KERNEL_DTQCB_DTQ #define _KERNEL_DTQ_SET_DTQ(dtqcb_ro, x) do { (dtqcb_ro)->dtq = (VP_INT *)(x); } while (0) diff --git a/kernel/include/object/texobj.h b/kernel/include/object/texobj.h deleted file mode 100755 index c27c72e..0000000 --- a/kernel/include/object/texobj.h +++ /dev/null @@ -1,319 +0,0 @@ -/** - * Hyper Operating System V4 Advance - * - * @file texobj.h - * @brief %jp{タスク例外処理オジェクトのヘッダファイル}%en{Task Exception Handling Routine object heder file} - * - * Copyright (C) 1998-2008 by Project HOS - * http://sourceforge.jp/projects/hos/ - */ - - -#ifndef _KERNEL__object__texobj_h__ -#define _KERNEL__object__texobj_h__ - - - -/* ------------------------------------------ */ -/* Primitive type definition */ -/* ------------------------------------------ */ - - -/* %jp{タスク例外処理ルーチン属性用の型} */ -#if _KERNEL_TEXCB_BITFIELD /* %jp{TEXCBにビットフィールドを利用する場合} */ - -/* %jp{TA_HLNG と TA_ASM の判定に 2bit 必要} */ -typedef unsigned int _KERNEL_TEX_T_TEXATR; -typedef unsigned int _KERNEL_TEXCB_T_TEXATR; -#define _KERNEL_TEXCB_TBITDEF_TEXATR : 2 - -#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ - -typedef _KERNEL_T_FAST_UB _KERNEL_TEX_T_TEXATR; -typedef _KERNEL_T_LEAST_UB _KERNEL_TEXCB_T_TEXATR; -#define _KERNEL_TEXCB_TBITDEF_TEXATR - -#endif - - -/* %jp{タスク例外処理ルーチンの起動番地の型} */ -typedef FP _KERNEL_TEX_T_TEXRTN; -typedef FP _KERNEL_TEXCB_T_TEXRTN; -#define _KERNEL_TEXCB_TBITDEF_TEXRTN - - -/* %jp{タスク例外処理禁止状態の型} */ -#if _KERNEL_TEXCB_BITFIELD /* %jp{TEXCBにビットフィールドを利用する場合} */ - -#if _KERNEL_PROCATR_SIGNED_INT && !_KERNEL_LEAST_CB_SIZE /* %jp{符号付優先の場合1bit増やして符号付を使う} */ -typedef signed int _KERNEL_TEX_T_STATE; /**< %jp{イベントフラグ属性を演算操作するときの型} */ -typedef signed int _KERNEL_TEXCB_T_STATE; /**< %jp{イベントフラグ属性をTEXCBに格納するときの型} */ -#define _KERNEL_TEXCB_TBITDEF_STATE : 1 + 1 /**< %jp{イベントフラグ属性のビットフィールド宣言時の幅} */ -#else -typedef unsigned int _KERNEL_TEX_T_STATE; /**< %jp{イベントフラグ属性を演算操作するときの型} */ -typedef unsigned int _KERNEL_TEXCB_T_STATE; /**< %jp{イベントフラグ属性をTEXCBに格納するときの型} */ -#define _KERNEL_TEXCB_TBITDEF_STATE : 1 /**< %jp{イベントフラグ属性のビットフィールド宣言時の幅} */ -#endif - -#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ - -#if _KERNEL_PROCATR_SIGNED_INT -typedef _KERNEL_T_FAST_B _KERNEL_TEX_T_STATE; /**< %jp{イベントフラグ属性を演算操作するときの型} */ -typedef _KERNEL_T_LEAST_B _KERNEL_TEXCB_T_STATE; /**< %jp{イベントフラグ属性をTEXCBに格納するときの型} */ -#else -typedef _KERNEL_T_FAST_UB _KERNEL_TEX_T_STATE; /**< %jp{イベントフラグ属性を演算操作するときの型} */ -typedef _KERNEL_T_LEAST_UB _KERNEL_TEXCB_T_STATE; /**< %jp{イベントフラグ属性をTEXCBに格納するときの型} */ -#endif - -#define _KERNEL_TEXCB_TBITDEF_STATE /**< %jp{イベントフラグ属性のビットフィールド宣言時の幅} */ - -#endif - - -/* %jp{例外要因パターン用の型} */ -#if _KERNEL_TEXCB_BITFIELD /* %jp{TEXCBにビットフィールドを利用する場合} */ - -#if _KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE /* %jp{符号付優先の場合1bit増やして符号付を使う} */ -typedef signed int _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef signed int _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#define _KERNEL_TEXCB_TBITDEF_TEXPTN : _KERNEL_TEX_TBIT_TEXPTN + 1 /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ -#else -typedef unsigned int _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef unsigned int _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#define _KERNEL_TEXCB_TBITDEF_TEXPTN : _KERNEL_TEX_TBIT_TEXPTN /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ -#endif - -#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ - -#if _KERNEL_TEX_TBIT_TEXPTN <= 7 && _KERNEL_PROCATR_SIGNED_INT -typedef _KERNEL_T_FAST_B _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_B _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 8 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) -typedef _KERNEL_T_FAST_UB _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_UB _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 15 && _KERNEL_PROCATR_SIGNED_INT -typedef _KERNEL_T_FAST_H _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_H _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 16 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) -typedef _KERNEL_T_FAST_UH _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_UH _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 31 && _KERNEL_PROCATR_SIGNED_INT -typedef _KERNEL_T_FAST_W _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_W _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 32 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) -typedef _KERNEL_T_FAST_UW _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_UW _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#elif _KERNEL_TEX_TBIT_TEXPTN <= 63 && _KERNEL_PROCATR_SIGNED_INT -typedef _KERNEL_T_FAST_D _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_D _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#else -typedef _KERNEL_T_FAST_UD _KERNEL_TEX_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ -typedef _KERNEL_T_LEAST_UD _KERNEL_TEXCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ -#endif - -#define _KERNEL_TEXCB_TBITDEF_TEXPTN /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ - -#endif - - - -/* ------------------------------------------ */ -/* Control block */ -/* ------------------------------------------ */ - -#if _KERNEL_TEXCB_SPLIT_RO - - -/** %jp{タスク例外処理ルーチンコントロールブロック(リードオンリー部)}%en{Task Exception Handling Routine Control Block(read-only)} */ -typedef struct _kernel_t_texcb_ro -{ -#if _KERNEL_TEXCB_TEXATR - _KERNEL_TEXCB_T_TEXATR texatr _KERNEL_TEXCB_TBITDEF_TEXATR; /**< %jp{タスク例外処理ルーチン属性} */ -#endif - -#if _KERNEL_TEXCB_TEXRTN - _KERNEL_TEXCB_T_TEXRTN texrtn _KERNEL_TEXCB_TBITDEF_TEXRTN; /**< %jp{タスク例外処理ルーチンの起動番地} */ -#endif -} _KERNEL_T_TEXCB_RO; - -typedef const _KERNEL_T_TEXCB_RO *_KERNEL_T_TEXCB_RO_PTR; - - -/** %jp{タスク例外処理ルーチンコントロールブロック}%en{Task Exception Handling Routine Control Block} */ -typedef struct _kernel_t_texcb -{ -#if _KERNEL_TEXCB_STATE - _KERNEL_TEXCB_T_STATE state _KERNEL_TEXCB_TBITDEF_STATE; /**< %jp{タスク例外処理禁止状態} */ -#endif - -#if _KERNEL_TEXCB_RASPTN - _KERNEL_TEXCB_T_TEXPTN rasptn _KERNEL_TEXCB_TBITDEF_TEXPTN; /**< %jp{タスク例外処理要因} */ -#endif - -#if _KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY - _KERNEL_T_TEXCB_RO_PTR texcb_ro; /**< %jp{タスク例外処理ルーチンコントロールブロックRO部へのポインタ} */ -#endif -} _KERNEL_T_TEXCB; - -typedef _KERNEL_T_TEXCB *_KERNEL_T_TEXCB_PTR; - - -#else - - -/** %jp{タスク例外処理ルーチンコントロールブロック}%en{Task Exception Handling Routine Control Block} */ -typedef struct _kernel_t_texcb -{ -#if _KERNEL_TEXCB_STATE - _KERNEL_TEXCB_T_STATE state _KERNEL_TEXCB_TBITDEF_STATE; /**< %jp{タスク例外処理禁止状態} */ -#endif - -#if _KERNEL_TEXCB_RASPTN - _KERNEL_TEXCB_T_TEXPTN rasptn _KERNEL_TEXCB_TBITDEF_TEXPTN; /**< %jp{タスク例外処理要因} */ -#endif - - -#if _KERNEL_TEXCB_TEXATR - _KERNEL_TEXCB_T_TEXATR texatr _KERNEL_TEXCB_TBITDEF_TEXATR; /**< %jp{タスク例外処理ルーチン属性} */ -#endif - -#if _KERNEL_TEXCB_TEXRTN - _KERNEL_TEXCB_T_TEXRTN texrtn _KERNEL_TEXCB_TBITDEF_TEXRTN; /**< %jp{タスク例外処理ルーチンの起動番地} */ -#endif -} _KERNEL_T_TEXCB; - -typedef _KERNEL_T_TEXCB _KERNEL_T_TEXCB_RO; -typedef const _KERNEL_T_TEXCB_RO *_KERNEL_T_TEXCB_RO_PTR; -typedef _KERNEL_T_TEXCB *_KERNEL_T_TEXCB_PTR; - - -#endif - - - -/* ------------------------------------------ */ -/* ID range */ -/* ------------------------------------------ */ - -#define _KERNEL_TEX_TMIN_ID _KERNEL_TSK_TMIN_ID /**< %jp{タスク例外処理ルーチンの最小値} */ -#define _KERNEL_TEX_TMAX_ID _KERNEL_TSK_TMAX_ID /**< %jp{タスク例外処理ルーチンの最大値} */ - -#define _KERNEL_TEX_CHECK_TSKID(tskid) ((tskid) >= _KERNEL_TEX_TMIN_ID && (tskid) <= _KERNEL_TEX_TMAX_ID) - /**< %jp{ID範囲チェック} */ - - -/* ------------------------------------------ */ -/* Control block tables */ -/* ------------------------------------------ */ - -#if _KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_BLKARRAY -#if _KERNEL_TEXCB_SPLIT_RO - -/* %jp{ブロック配列管理でRO分離の場合}%en{block array} */ -extern _KERNEL_T_TEXCB _kernel_texcb_tbl[]; /**< %jp{タスク例外処理ルーチンコントロールブロックテーブル} */ -extern const _KERNEL_T_TEXCB_RO _kernel_texcb_ro_tbl[]; /**< %jp{タスク例外処理ルーチンコントロールブロック(リードオンリー部)テーブル} */ -#define _KERNEL_TEX_ID2TEXCB(tskid) (&_kernel_texcb_tbl[(tskid) - _KERNEL_TEX_TMIN_ID]) /**< %jp{コントロールブロックの取得} */ -#define _KERNEL_TEX_CHECK_EXS(tskid) (_kernel_texcb_ro_tbl[(tskid) - _KERNEL_TEX_TMIN_ID].texrtn != NULL ) - /**< %jp{オブジェクトの存在チェック} */ - -#else - -/* %jp{ブロック配列管理の場合}%en{block array} */ -extern _KERNEL_T_TEXCB _kernel_texcb_tbl[]; /**< %jp{タスク例外処理ルーチンコントロールブロックテーブル} */ -#define _KERNEL_TEX_ID2TEXCB(tskid) (&_kernel_texcb_tbl[(tskid) - _KERNEL_TEX_TMIN_ID]) /**< %jp{コントロールブロックの取得} */ -#define _KERNEL_TEX_CHECK_EXS(tskid) (_kernel_texcb_tbl[(tskid) - _KERNEL_TEX_TMIN_ID].texrtn != NULL ) - /**< %jp{オブジェクトの存在チェック} */ - -#endif - -#elif _KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY - -/* %jp{ポインタ配列管理の場合}%en{pointer array} */ -extern _KERNEL_T_TEXCB *_kernel_texcb_tbl[]; /**< %jp{タスク例外処理ルーチンコントロールブロックテーブル} */ -#define _KERNEL_TEX_ID2TEXCB(tskid) (_kernel_texcb_tbl[(tskid) - _KERNEL_TEX_TMIN_ID]) /**< %jp{タスクIDからTEXCB アドレスを取得} */ -#define _KERNEL_TEX_CHECK_EXS(tskid) (_KERNEL_TEX_ID2TEXCB(tskid) != NULL) /**< %jp{オブジェクトの存在チェック} */ - -#endif - - - -/* ------------------------------------------ */ -/* Accessor for TEXCB */ -/* ------------------------------------------ */ - -/* texcb_ro */ -#if !_KERNEL_TEXCB_SPLIT_RO -#define _KERNEL_TEX_GET_TEXCB_RO(tskid, texcb) (texcb) -#else -#if _KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_BLKARRAY /* %jp{TEXCBを単純配列で管理}%en{array of block} */ -#define _KERNEL_TEX_GET_TEXCB_RO(tskid, texcb) (&_kernel_texcb_ro_tbl[(tskid)]) -#elif _KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY /* %jp{TEXCBをポインタ配列で管理}%en{array of pointer} */ -#define _KERNEL_TEX_GET_TEXCB_RO(tskid, texcb) ((texcb)->texcb_ro) -#endif -#endif - - -/* texatr */ -#if _KERNEL_TEXCB_STATE -#define _KERNEL_TEX_SET_STATE(texcb, x) do { (texcb)->state = (_KERNEL_TEXCB_T_STATE)(x); } while (0) -#define _KERNEL_TEX_GET_STATE(texcb) ((_KERNEL_TEX_T_STATE)(texcb)->state) -#else -#define _KERNEL_TEX_SET_STATE(texcb, x) do { } while (0) -#define _KERNEL_TEX_GET_STATE(texcb) (0) -#endif - - -/* rasptn */ -#if _KERNEL_TEXCB_TEXPTN -#define _KERNEL_TEX_SET_RASPTN(texcb, x) do { (texcb)->rasptn = (_KERNEL_TEXCB_T_TEXPTN)(x); } while (0) -#define _KERNEL_TEX_GET_RASPTN(texcb) ((_KERNEL_TEX_T_TEXPTN)(texcb)->rasptn) -#else -#define _KERNEL_TEX_SET_RASPTN(texcb, x) do { } while (0) -#define _KERNEL_TEX_GET_RASPTN(texcb) (0) -#endif - - -/* texatr */ -#if _KERNEL_TEXCB_TEXATR -#define _KERNEL_TEX_SET_TEXATR(texcb_ro, x) do { (texcb_ro)->texatr = (_KERNEL_TEXCB_T_TEXATR)(x); } while (0) -#define _KERNEL_TEX_GET_TEXATR(texcb_ro) ((_KERNEL_TEX_T_TEXATR)(texcb_ro)->texatr) -#else -#define _KERNEL_TEX_SET_TEXATR(texcb_ro, x) do { } while (0) -#define _KERNEL_TEX_GET_TEXATR(texcb_ro) (_KERNEL_TMAX_TEXATR) -#endif - -/* texrtn */ -#if _KERNEL_TEXCB_TEXRTN -#define _KERNEL_TEX_SET_TEXRTN(texcb_ro, x) do { (texcb_ro)->texrtn = (_KERNEL_TEXCB_T_TEXRTN)(x); } while (0) -#define _KERNEL_TEX_GET_TEXRTN(texcb_ro) ((_KERNEL_TEX_T_TEXRTN)(texcb_ro)->texrtn) -#else -#define _KERNEL_TEX_SET_TEXRTN(texcb_ro, x) do { } while (0) -#define _KERNEL_TEX_GET_TEXRTN(texcb_ro) (0) -#endif - - - -/* ------------------------------------------ */ -/* Macro functions */ -/* ------------------------------------------ */ - - - -/* ------------------------------------------ */ -/* Functions */ -/* ------------------------------------------ */ - -#ifdef __cplusplus -extern "C" { -#endif - -#ifdef __cplusplus -} -#endif - - - -#endif /* _KERNEL__object__texobj_h__ */ - - -/* end of file */ diff --git a/kernel/include/object/tskobj.h b/kernel/include/object/tskobj.h index f29032b..2d1d5c2 100755 --- a/kernel/include/object/tskobj.h +++ b/kernel/include/object/tskobj.h @@ -446,6 +446,105 @@ typedef _KERNEL_T_LEAST_UD _KERNEL_TCB_T_RELTIM; /**< %jp{相対時間をTC +/* %jp{タスク例外処理ルーチン属性用の型} */ +#if _KERNEL_TCB_BITFIELD /* %jp{TCBにビットフィールドを利用する場合} */ + +/* %jp{TA_HLNG と TA_ASM の判定に 2bit 必要} */ +typedef unsigned int _KERNEL_TSK_T_TEXATR; +typedef unsigned int _KERNEL_TCB_T_TEXATR; +#define _KERNEL_TCB_TBITDEF_TEXATR : 2 + +#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ + +typedef _KERNEL_T_FAST_UB _KERNEL_TSK_T_TEXATR; +typedef _KERNEL_T_LEAST_UB _KERNEL_TCB_T_TEXATR; +#define _KERNEL_TCB_TBITDEF_TEXATR + +#endif + + +/* %jp{タスク例外処理ルーチンの起動番地の型} */ +typedef void (*_KERNEL_TSK_T_TEXRTN)(TEXPTN texptn, VP_INT exinf); +typedef FP _KERNEL_TCB_T_TEXRTN; +#define _KERNEL_TCB_TBITDEF_TEXRTN + + +/* %jp{タスク例外処理禁止状態の型} */ +#if _KERNEL_TCB_BITFIELD /* %jp{TCBにビットフィールドを利用する場合} */ + +#if _KERNEL_PROCATR_SIGNED_INT && !_KERNEL_LEAST_CB_SIZE /* %jp{符号付優先の場合1bit増やして符号付を使う} */ +typedef signed int _KERNEL_TSK_T_TEXSTAT; /**< %jp{タスク例外処理状態を演算操作するときの型} */ +typedef signed int _KERNEL_TCB_T_TEXSTAT; /**< %jp{タスク例外処理状態をTCBに格納するときの型} */ +#define _KERNEL_TCB_TBITDEF_TEXSTAT : 1 + 1 /**< %jp{タスク例外処理状態のビットフィールド宣言時の幅} */ +#else +typedef unsigned int _KERNEL_TEX_T_TEXSTAT; /**< %jp{タスク例外処理状態を演算操作するときの型} */ +typedef unsigned int _KERNEL_TEXCB_T_TEXSTAT; /**< %jp{タスク例外処理状態をTCBに格納するときの型} */ +#define _KERNEL_TCB_TBITDEF_TEXSTAT : 1 /**< %jp{タスク例外処理状態のビットフィールド宣言時の幅} */ +#endif + +#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ + +#if _KERNEL_PROCATR_SIGNED_INT +typedef _KERNEL_T_FAST_B _KERNEL_TSK_T_TEXSTAT; /**< %jp{タスク例外処理状態を演算操作するときの型} */ +typedef _KERNEL_T_LEAST_B _KERNEL_TCB_T_TEXSTAT; /**< %jp{タスク例外処理状態をTCBに格納するときの型} */ +#else +typedef _KERNEL_T_FAST_UB _KERNEL_TSK_T_TEXSTAT; /**< %jp{タスク例外処理状態を演算操作するときの型} */ +typedef _KERNEL_T_LEAST_UB _KERNEL_TCB_T_TEXSTAT; /**< %jp{タスク例外処理状態をTCBに格納するときの型} */ +#endif + +#define _KERNEL_TCB_TBITDEF_TEXSTAT /**< %jp{タスク例外処理状態のビットフィールド宣言時の幅} */ + +#endif + + +/* %jp{例外要因パターン用の型} */ +#if _KERNEL_TCB_BITFIELD /* %jp{TCBにビットフィールドを利用する場合} */ + +#if _KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE /* %jp{符号付優先の場合1bit増やして符号付を使う} */ +typedef signed int _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef signed int _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#define _KERNEL_TCB_TBITDEF_TEXPTN : _KERNEL_TEX_TBIT_TEXPTN + 1 /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ +#else +typedef unsigned int _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef unsigned int _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#define _KERNEL_TCB_TBITDEF_TEXPTN : _KERNEL_TEX_TBIT_TEXPTN /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ +#endif + +#else /* %jp{TEXCBにビットフィールドを利用しない場合} */ + +#if _KERNEL_TEX_TBIT_TEXPTN <= 7 && _KERNEL_PROCATR_SIGNED_INT +typedef _KERNEL_T_FAST_B _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_B _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 8 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) +typedef _KERNEL_T_FAST_UB _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_UB _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 15 && _KERNEL_PROCATR_SIGNED_INT +typedef _KERNEL_T_FAST_H _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_H _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 16 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) +typedef _KERNEL_T_FAST_UH _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_UH _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 31 && _KERNEL_PROCATR_SIGNED_INT +typedef _KERNEL_T_FAST_W _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_W _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 32 && !(_KERNEL_PROCATR_SIGNED_INT && !_KERNEL_OPT_CB_SIZE) +typedef _KERNEL_T_FAST_UW _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_UW _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#elif _KERNEL_TEX_TBIT_TEXPTN <= 63 && _KERNEL_PROCATR_SIGNED_INT +typedef _KERNEL_T_FAST_D _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_D _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#else +typedef _KERNEL_T_FAST_UD _KERNEL_TSK_T_TEXPTN; /**< %jp{例外要因パターンを演算操作するときの型} */ +typedef _KERNEL_T_LEAST_UD _KERNEL_TCB_T_TEXPTN; /**< %jp{例外要因パターンをTEXCBに格納するときの型} */ +#endif + +#define _KERNEL_TCB_TBITDEF_TEXPTN /**< %jp{例外要因パターンのビットフィールド宣言時の幅} */ + +#endif + + + + /* -------------------------------------------------------------------- */ /* TCB definetion */ /* -------------------------------------------------------------------- */ @@ -494,10 +593,19 @@ typedef struct _kernel_t_tcb_ro /* タスクコントロールブロック(RO #if _KERNEL_TCB_ISP _KERNEL_TCB_T_ISP isp _KERNEL_TCB_TBITDEF_ISP; /**< %jp{スタックポインタの初期値}%en{Task initial stack pointer} */ #endif + +#if _KERNEL_TCB_TEXATR + _KERNEL_TCB_T_TEXATR texatr _KERNEL_TCB_TBITDEF_TEXATR; /**< %jp{タスク例外処理ルーチン属性} */ +#endif + +#if _KERNEL_TCB_TEXRTN + _KERNEL_TCB_T_TEXRTN texrtn _KERNEL_TCB_TBITDEF_TEXRTN; /**< %jp{タスク例外処理ルーチンの起動番地} */ +#endif } _KERNEL_T_TCB_RO; typedef const _KERNEL_T_TCB_RO *_KERNEL_T_TCB_RO_PTR; + /** %jp{タスクコントロールブロック(RAM部)}%en{Task control block for RAM} */ typedef struct _kernel_t_tcb { @@ -565,6 +673,14 @@ typedef struct _kernel_t_tcb _KERNEL_TCB_T_TSKID tskid _KERNEL_TCB_TBITDEF_TSKID; /**< %jp{タスクID番号の逆引き用}%en{Task object ID} */ #endif +#if _KERNEL_TCB_TEXSTAT + _KERNEL_TCB_T_TEXSTAT texstat _KERNEL_TCB_TBITDEF_TEXSTAT; /**< %jp{タスク例外処理状態} */ +#endif + +#if _KERNEL_TCB_RASPTN + _KERNEL_TCB_T_TEXPTN rasptn _KERNEL_TCB_TBITDEF_TEXPTN; /**< %jp{タスク例外処理要因} */ +#endif + /* %jp{ポインタ管理時にROM部/RAM部を分離する場合はポインタを張る} */ #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY @@ -644,6 +760,14 @@ typedef struct _kernel_t_tcb #if _KERNEL_TCB_TSKID _KERNEL_TCB_T_TSKID tskid _KERNEL_TCB_TBITDEF_TSKID; /**< %jp{タスクID番号の逆引き用}%en{Task object ID} */ #endif + +#if _KERNEL_TCB_TEXSTAT + _KERNEL_TCB_T_TEXSTAT texstat _KERNEL_TCB_TBITDEF_TEXSTAT; /**< %jp{タスク例外処理状態} */ +#endif + +#if _KERNEL_TCB_RASPTN + _KERNEL_TCB_T_TEXPTN rasptn _KERNEL_TCB_TBITDEF_TEXPTN; /**< %jp{タスク例外処理要因} */ +#endif #if _KERNEL_TCB_TSKATR @@ -673,6 +797,14 @@ typedef struct _kernel_t_tcb #if _KERNEL_TCB_ISP _KERNEL_TCB_T_ISP isp _KERNEL_TCB_TBITDEF_ISP; /**< %jp{スタックポインタの初期値}%en{Task initial stack pointer} */ #endif + +#if _KERNEL_TCB_TEXATR + _KERNEL_TCB_T_TEXATR texatr _KERNEL_TCB_TBITDEF_TEXATR; /**< %jp{タスク例外処理ルーチン属性} */ +#endif + +#if _KERNEL_TCB_TEXRTN + _KERNEL_TCB_T_TEXRTN texrtn _KERNEL_TCB_TBITDEF_TEXRTN; /**< %jp{タスク例外処理ルーチンの起動番地} */ +#endif } _KERNEL_T_TCB; typedef _KERNEL_T_TCB _KERNEL_T_TCB_RO; @@ -737,19 +869,19 @@ extern _KERNEL_T_TCB *_kernel_tcb_tbl[]; /**< %jp{タスクコン #if _KERNEL_TSKHDL_ID /* %jp{タスクハンドルにIDを使う}%en{TSKHDL is ID} */ -#define _KERNEL_TSK_ID2TSKHDL(tskid) (tskid) -#define _KERNEL_TSK_TSKHDL2ID(tskhdl) (tskhdl) -#define _KERNEL_TSK_TCB2TSKHDL(tcb) _KERNEL_TSK_TCB2ID(tcb) -#define _KERNEL_TSK_TSKHDL2TCB(tskhdl) _KERNEL_TSK_ID2TCB(tskhdl) -#define _KERNEL_TSK_GET_TSKHDL(tskid, tcb) (tskid) +#define _KERNEL_TSK_ID2TSKHDL(tskid) (tskid) +#define _KERNEL_TSK_TSKHDL2ID(tskhdl) (tskhdl) +#define _KERNEL_TSK_TCB2TSKHDL(tcb) _KERNEL_TSK_TCB2ID(tcb) +#define _KERNEL_TSK_TSKHDL2TCB(tskhdl) _KERNEL_TSK_ID2TCB(tskhdl) +#define _KERNEL_TSK_GET_TSKHDL(tskid, tcb) (tskid) #else /* %jp{タスクハンドルにTCBのアドレスを使う}%en{TSKHDL is Address of TCB} */ -#define _KERNEL_TSK_ID2TSKHDL(tskid) _KERNEL_TSK_ID2TCB(tskid) -#define _KERNEL_TSK_TSKHDL2ID(tskhdl) _KERNEL_TSK_TCB2ID(tskhdl) -#define _KERNEL_TSK_TCB2TSKHDL(tskhdl) (tskhdl) -#define _KERNEL_TSK_TSKHDL2TCB(tskhdl) (tskhdl) -#define _KERNEL_TSK_GET_TSKHDL(tskid, tcb) (tcb) +#define _KERNEL_TSK_ID2TSKHDL(tskid) _KERNEL_TSK_ID2TCB(tskid) +#define _KERNEL_TSK_TSKHDL2ID(tskhdl) _KERNEL_TSK_TCB2ID(tskhdl) +#define _KERNEL_TSK_TCB2TSKHDL(tskhdl) (tskhdl) +#define _KERNEL_TSK_TSKHDL2TCB(tskhdl) (tskhdl) +#define _KERNEL_TSK_GET_TSKHDL(tskid, tcb) (tcb) #endif @@ -761,205 +893,242 @@ extern _KERNEL_T_TCB *_kernel_tcb_tbl[]; /**< %jp{タスクコン /* tcb_ro */ #if !_KERNEL_TCB_SPLIT_RO -#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) (tcb) +#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) (tcb) #else #if _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_BLKARRAY /* %jp{TCBを単純配列で管理}%en{array of block} */ -#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) (&_kernel_tcb_ro_tbl[(tskid)]) +#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) (&_kernel_tcb_ro_tbl[(tskid)]) #elif _KERNEL_TCB_ALGORITHM == _KERNEL_TCB_ALG_PTRARRAY /* %jp{TCBをポインタ配列で管理}%en{array of pointer} */ -#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) ((tcb)->tcb_ro) +#define _KERNEL_TSK_GET_TCB_RO(tskid, tcb) ((tcb)->tcb_ro) #endif #endif /* ctxcb */ -#define _KERNEL_TSK_GET_CTXCB(tcb) (&(tcb)->ctxcb) +#define _KERNEL_TSK_GET_CTXCB(tcb) (&(tcb)->ctxcb) /* que */ #if _KERNEL_TCB_QUE -#define _KERNEL_TSK_SET_QUE(tcb, x) do { (tcb)->pk_que = (_KERNEL_T_QUE *)(x); } while(0) -#define _KERNEL_TSK_GET_QUE(tcb) ((_KERNEL_T_QUE *)(tcb)->pk_que) +#define _KERNEL_TSK_SET_QUE(tcb, x) do { (tcb)->pk_que = (_KERNEL_T_QUE *)(x); } while(0) +#define _KERNEL_TSK_GET_QUE(tcb) ((_KERNEL_T_QUE *)(tcb)->pk_que) #else /* %jp{TCBに所属キューの情報を持たせない場合は別情報からの探索で求める} */ -#define _KERNEL_TSK_SET_QUE(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_QUE(tcb) _kernel_get_que(tcb) +#define _KERNEL_TSK_SET_QUE(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_QUE(tcb) _kernel_get_que(tcb) #endif /* tskstat */ #if _KERNEL_TCB_TSKSTAT -#define _KERNEL_TSK_SET_TSKSTAT(tcb, x) do { (tcb)->tskstat = (_KERNEL_TCB_T_TSKSTAT)(x); } while(0) -#define _KERNEL_TSK_GET_TSKSTAT(tcb) ((_KERNEL_TSK_T_TSKSTAT)(tcb)->tskstat) +#define _KERNEL_TSK_SET_TSKSTAT(tcb, x) do { (tcb)->tskstat = (_KERNEL_TCB_T_TSKSTAT)(x); } while(0) +#define _KERNEL_TSK_GET_TSKSTAT(tcb) ((_KERNEL_TSK_T_TSKSTAT)(tcb)->tskstat) #else -#define _KERNEL_TSK_SET_TSKSTAT(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKSTAT(tcb) 0 +#define _KERNEL_TSK_SET_TSKSTAT(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKSTAT(tcb) 0 #endif /* tskpri */ #if _KERNEL_TCB_TSKPRI /* %jp{通常のTCBへのアクセサ} */ -#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { (tcb)->tskpri = (x); } while(0) -#define _KERNEL_TSK_GET_TSKPRI(tcb) ((tcb)->tskpri) +#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { (tcb)->tskpri = (x); } while(0) +#define _KERNEL_TSK_GET_TSKPRI(tcb) ((tcb)->tskpri) #else #if _KERNEL_TCB_ITSKPRI /* %jp{優先度固定(ROM配置)時のアクセサ} */ -#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKPRI(tcb) ((tcb)->itskpri) +#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKPRI(tcb) ((tcb)->itskpri) #else /* %jp{優先度未使用時(全てFIFO順)は1に固定する} */ -#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKPRI(tcb) (1) +#define _KERNEL_TSK_SET_TSKPRI(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKPRI(tcb) (1) #endif #endif /* tskbpri */ #if _KERNEL_TCB_TSKBPRI -#define _KERNEL_TSK_SET_TSKBPRI(tcb, x) do { (tcb)->tskbpri = (x); } while(0) -#define _KERNEL_TSK_GET_TSKBPRI(tcb) ((tcb)->tskbpri) +#define _KERNEL_TSK_SET_TSKBPRI(tcb, x) do { (tcb)->tskbpri = (x); } while(0) +#define _KERNEL_TSK_GET_TSKBPRI(tcb) ((tcb)->tskbpri) #else -#define _KERNEL_TSK_SET_TSKBPRI(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKBPRI(tcb) _KERNEL_TSK_GET_TSKPRI(tcb) +#define _KERNEL_TSK_SET_TSKBPRI(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKBPRI(tcb) _KERNEL_TSK_GET_TSKPRI(tcb) #endif /* tskwait */ #if _KERNEL_TCB_TSKWAIT -#define _KERNEL_TSK_SET_TSKWAIT(tcb, x) do { (tcb)->tskwait = (x); } while(0) -#define _KERNEL_TSK_GET_TSKWAIT(tcb) ((tcb)->tskwait) +#define _KERNEL_TSK_SET_TSKWAIT(tcb, x) do { (tcb)->tskwait = (x); } while(0) +#define _KERNEL_TSK_GET_TSKWAIT(tcb) ((tcb)->tskwait) #else -#define _KERNEL_TSK_SET_TSKWAIT(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKWAIT(tcb) (0) +#define _KERNEL_TSK_SET_TSKWAIT(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKWAIT(tcb) (0) #endif /* wobjid */ #if _KERNEL_TCB_WOBJID -#define _KERNEL_TSK_SET_WOBJID(tcb, x) do { (tcb)->wobjid = (x); } while(0) -#define _KERNEL_TSK_GET_WOBJID(tcb) ((tcb)->wobjid) +#define _KERNEL_TSK_SET_WOBJID(tcb, x) do { (tcb)->wobjid = (x); } while(0) +#define _KERNEL_TSK_GET_WOBJID(tcb) ((tcb)->wobjid) #else -#define _KERNEL_TSK_SET_WOBJID(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_WOBJID(tcb) (0) +#define _KERNEL_TSK_SET_WOBJID(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_WOBJID(tcb) (0) #endif /* actcnt */ #if _KERNEL_TCB_ACTCNT -#define _KERNEL_TSK_SET_ACTCNT(tcb, x) do { (tcb)->actcnt = (x); } while(0) -#define _KERNEL_TSK_GET_ACTCNT(tcb) ((tcb)->actcnt) +#define _KERNEL_TSK_SET_ACTCNT(tcb, x) do { (tcb)->actcnt = (x); } while(0) +#define _KERNEL_TSK_GET_ACTCNT(tcb) ((tcb)->actcnt) #else -#define _KERNEL_TSK_SET_ACTCNT(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_ACTCNT(tcb) (0) +#define _KERNEL_TSK_SET_ACTCNT(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_ACTCNT(tcb) (0) #endif /* wupcnt */ #if _KERNEL_TCB_WUPCNT -#define _KERNEL_TSK_SET_WUPCNT(tcb, x) do { (tcb)->wupcnt = (x); } while(0) -#define _KERNEL_TSK_GET_WUPCNT(tcb) ((tcb)->wupcnt) +#define _KERNEL_TSK_SET_WUPCNT(tcb, x) do { (tcb)->wupcnt = (x); } while(0) +#define _KERNEL_TSK_GET_WUPCNT(tcb) ((tcb)->wupcnt) #else -#define _KERNEL_TSK_SET_WUPCNT(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_WUPCNT(tcb) (0) +#define _KERNEL_TSK_SET_WUPCNT(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_WUPCNT(tcb) (0) #endif /* suscnt */ #if _KERNEL_TCB_SUSCNT -#define _KERNEL_TSK_SET_SUSCNT(tcb, x) do { (tcb)->suscnt = (x); } while(0) -#define _KERNEL_TSK_GET_SUSCNT(tcb) ((tcb)->suscnt) +#define _KERNEL_TSK_SET_SUSCNT(tcb, x) do { (tcb)->suscnt = (x); } while(0) +#define _KERNEL_TSK_GET_SUSCNT(tcb) ((tcb)->suscnt) #else -#define _KERNEL_TSK_SET_SUSCNT(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_SUSCNT(tcb) (0) +#define _KERNEL_TSK_SET_SUSCNT(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_SUSCNT(tcb) (0) #endif /* mtxhdl */ #if _KERNEL_TCB_MTXHDL -#define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { (tcb)->mtxhdl = (x); } while(0) -#define _KERNEL_TSK_GET_MTXHDL(tcb) ((tcb)->mtxhdl) +#define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { (tcb)->mtxhdl = (x); } while(0) +#define _KERNEL_TSK_GET_MTXHDL(tcb) ((tcb)->mtxhdl) #else -#define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_MTXHDL(tcb) _KERNEL_MTXHDL_NULL +#define _KERNEL_TSK_SET_MTXHDL(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_MTXHDL(tcb) _KERNEL_MTXHDL_NULL #endif /* ercd */ #if _KERNEL_TCB_ERCD -#define _KERNEL_TSK_SET_ERCD(tcb, x) do { (tcb)->ercd = (x); } while(0) -#define _KERNEL_TSK_GET_ERCD(tcb) ((tcb)->ercd) +#define _KERNEL_TSK_SET_ERCD(tcb, x) do { (tcb)->ercd = (x); } while(0) +#define _KERNEL_TSK_GET_ERCD(tcb) ((tcb)->ercd) #else -#define _KERNEL_TSK_SET_ERCD(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_ERCD(tcb) (E_OK) +#define _KERNEL_TSK_SET_ERCD(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_ERCD(tcb) (E_OK) #endif /* data */ #if _KERNEL_TCB_DATA -#define _KERNEL_TSK_SET_DATA(tcb, x) do { (tcb)->data = (x); } while(0) -#define _KERNEL_TSK_GET_DATA(tcb) ((tcb)->data) +#define _KERNEL_TSK_SET_DATA(tcb, x) do { (tcb)->data = (x); } while(0) +#define _KERNEL_TSK_GET_DATA(tcb) ((tcb)->data) +#else +#define _KERNEL_TSK_SET_DATA(tcb, x) do { } while(0) +#define _KERNEL_TSK_GET_DATA(tcb) (0) +#endif + +/* texstat */ +#if _KERNEL_TCB_TEXSTAT +#define _KERNEL_TSK_SET_TEXSTAT(tcb, x) do { (tcb)->texstat = (_KERNEL_TCB_T_TEXSTAT)(x); } while (0) +#define _KERNEL_TSK_GET_TEXSTAT(tcb) ((_KERNEL_TSK_T_TEXSTAT)(tcb)->texstat) +#else +#define _KERNEL_TSK_SET_TEXSTAT(tcb, x) do { } while (0) +#define _KERNEL_TSK_GET_TEXSTAT(tcb) (_KERNEL_TXS_DIS) +#endif + +/* rasptn */ +#if _KERNEL_TCB_RASPTN +#define _KERNEL_TSK_SET_RASPTN(tcb, x) do { (tcb)->rasptn = (_KERNEL_TCB_T_TEXPTN)(x); } while (0) +#define _KERNEL_TSK_GET_RASPTN(tcb) ((_KERNEL_TSK_T_TEXPTN)(tcb)->rasptn) #else -#define _KERNEL_TSK_SET_DATA(tcb, x) do { } while(0) -#define _KERNEL_TSK_GET_DATA(tcb) (0) +#define _KERNEL_TSK_SET_RASPTN(texcb, x) do { } while (0) +#define _KERNEL_TSK_GET_RASPTN(texcb) (0) #endif /* tskid */ #if _KERNEL_TCB_TSKID -#define _KERNEL_TSK_SET_TSKID(tcb_ro, x) do { (tcb_ro)->tskid = (x); } while(0) -#define _KERNEL_TSK_GET_TSKID(tcb_ro) ((tcb_ro)->tskid) +#define _KERNEL_TSK_SET_TSKID(tcb_ro, x) do { (tcb_ro)->tskid = (x); } while(0) +#define _KERNEL_TSK_GET_TSKID(tcb_ro) ((tcb_ro)->tskid) #else -#define _KERNEL_TSK_SET_TSKID(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKID(tcb_ro) (0) +#define _KERNEL_TSK_SET_TSKID(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKID(tcb_ro) (0) #endif /* tskatr */ #if _KERNEL_TCB_TSKATR -#define _KERNEL_TSK_SET_TSKATR(tcb_ro, x) do { (tcb_ro)->tskatr = (x); } while(0) -#define _KERNEL_TSK_GET_TSKATR(tcb_ro) ((tcb_ro)->tskatr) +#define _KERNEL_TSK_SET_TSKATR(tcb_ro, x) do { (tcb_ro)->tskatr = (x); } while(0) +#define _KERNEL_TSK_GET_TSKATR(tcb_ro) ((tcb_ro)->tskatr) #else /* %jp{tskatr未使用時はTA_HLNGに固定する} */ -#define _KERNEL_TSK_SET_TSKATR(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_TSKATR(tcb_ro) (TA_HLNG) +#define _KERNEL_TSK_SET_TSKATR(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_TSKATR(tcb_ro) (TA_HLNG) #endif /* exinf */ #if _KERNEL_TCB_EXINF -#define _KERNEL_TSK_SET_EXINF(tcb_ro, x) do { (tcb_ro)->exinf = (x); } while(0) -#define _KERNEL_TSK_GET_EXINF(tcb_ro) ((tcb_ro)->exinf) +#define _KERNEL_TSK_SET_EXINF(tcb_ro, x) do { (tcb_ro)->exinf = (x); } while(0) +#define _KERNEL_TSK_GET_EXINF(tcb_ro) ((tcb_ro)->exinf) #else -#define _KERNEL_TSK_SET_EXINF(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_EXINF(tcb_ro) (0) +#define _KERNEL_TSK_SET_EXINF(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_EXINF(tcb_ro) (0) #endif /* task */ #if _KERNEL_TCB_TASK -#define _KERNEL_TSK_SET_TASK(tcb_ro, x) do { (tcb_ro)->task = (_KERNEL_TCB_T_TASK)(x); } while(0) -#define _KERNEL_TSK_GET_TASK(tcb_ro) ((_KERNEL_TSK_T_TASK)(tcb_ro)->task) +#define _KERNEL_TSK_SET_TASK(tcb_ro, x) do { (tcb_ro)->task = (_KERNEL_TCB_T_TASK)(x); } while(0) +#define _KERNEL_TSK_GET_TASK(tcb_ro) ((_KERNEL_TSK_T_TASK)(tcb_ro)->task) #else -#define _KERNEL_TSK_SET_TASK(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_TASK(tcb_ro) (0) +#define _KERNEL_TSK_SET_TASK(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_TASK(tcb_ro) (0) #endif /* tskipri */ #if _KERNEL_TCB_ITSKPRI -#define _KERNEL_TSK_SET_ITSKPRI(tcb_ro, x) do { (tcb_ro)->itskpri = (x); } while(0) -#define _KERNEL_TSK_GET_ITSKPRI(tcb_ro) ((tcb_ro)->itskpri) +#define _KERNEL_TSK_SET_ITSKPRI(tcb_ro, x) do { (tcb_ro)->itskpri = (x); } while(0) +#define _KERNEL_TSK_GET_ITSKPRI(tcb_ro) ((tcb_ro)->itskpri) #else /* %jp{tskatr未使用時はTA_HLNGに固定する} */ -#define _KERNEL_TSK_SET_ITSKPRI(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_ITSKPRI(tcb_ro) (1) +#define _KERNEL_TSK_SET_ITSKPRI(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_ITSKPRI(tcb_ro) (1) #endif /* stksz */ #if _KERNEL_TCB_STKSZ -#define _KERNEL_TSK_SET_STKSZ(tcb_ro, x) do { (tcb_ro)->stksz = (x); } while(0) -#define _KERNEL_TSK_GET_STKSZ(tcb_ro) ((tcb_ro)->stksz) +#define _KERNEL_TSK_SET_STKSZ(tcb_ro, x) do { (tcb_ro)->stksz = (x); } while(0) +#define _KERNEL_TSK_GET_STKSZ(tcb_ro) ((tcb_ro)->stksz) #else -#define _KERNEL_TSK_SET_STKSZ(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_STKSZ(tcb_ro) (0) +#define _KERNEL_TSK_SET_STKSZ(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_STKSZ(tcb_ro) (0) #endif /* stk */ #if _KERNEL_TCB_STK -#define _KERNEL_TSK_SET_STK(tcb_ro, x) do { (tcb_ro)->stk = (x); } while(0) -#define _KERNEL_TSK_GET_STK(tcb_ro) ((tcb_ro)->stk) +#define _KERNEL_TSK_SET_STK(tcb_ro, x) do { (tcb_ro)->stk = (x); } while(0) +#define _KERNEL_TSK_GET_STK(tcb_ro) ((tcb_ro)->stk) #else -#define _KERNEL_TSK_SET_STK(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_STK(tcb_ro) (0) +#define _KERNEL_TSK_SET_STK(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_STK(tcb_ro) (0) #endif /* isp */ #if _KERNEL_TCB_ISP -#define _KERNEL_TSK_SET_ISP(tcb_ro, x) do { (tcb_ro)->isp = (x); } while(0) -#define _KERNEL_TSK_GET_ISP(tcb_ro) ((tcb_ro)->isp) +#define _KERNEL_TSK_SET_ISP(tcb_ro, x) do { (tcb_ro)->isp = (x); } while(0) +#define _KERNEL_TSK_GET_ISP(tcb_ro) ((tcb_ro)->isp) +#else +#define _KERNEL_TSK_SET_ISP(tcb_ro, x) do { } while(0) +#define _KERNEL_TSK_GET_ISP(tcb_ro) ((VP)((UB *)_KERNEL_TSK_GET_STK(tcb_ro) + _KERNEL_TSK_GET_STKSZ(tcb_ro))) +#endif + +/* texatr */ +#if _KERNEL_TCB_TEXATR +#define _KERNEL_TSK_SET_TEXATR(tcb_ro, x) do { (tcb_ro)->texatr = (_KERNEL_TCB_T_TEXATR)(x); } while (0) +#define _KERNEL_TSK_GET_TEXATR(tcb_ro) ((_KERNEL_TSK_T_TEXATR)(tcb_ro)->texatr) #else -#define _KERNEL_TSK_SET_ISP(tcb_ro, x) do { } while(0) -#define _KERNEL_TSK_GET_ISP(tcb_ro) ((VP)((UB *)_KERNEL_TSK_GET_STK(tcb_ro) + _KERNEL_TSK_GET_STKSZ(tcb_ro))) +#define _KERNEL_TSK_SET_TEXATR(texcb_ro, x) do { } while (0) +#define _KERNEL_TSK_GET_TEXATR(texcb_ro) (0) #endif +/* texrtn */ +#if _KERNEL_TCB_TEXRTN +#define _KERNEL_TSK_SET_TEXRTN(tcb_ro, x) do { (tcb_ro)->texrtn = (_KERNEL_TCB_T_TEXRTN)(x); } while (0) +#define _KERNEL_TSK_GET_TEXRTN(tcb_ro) ((_KERNEL_TSK_T_TEXRTN)(tcb_ro)->texrtn) +#else +#define _KERNEL_TSK_SET_TEXRTN(tcb_ro, x) do { } while (0) +#define _KERNEL_TSK_GET_TEXRTN(tcb_ro) (0) +#endif + + /* ------------------------------------------ */ /* Macro functions */ diff --git a/kernel/include/parser/parserr.h b/kernel/include/parser/parserr.h index 1948898..4dc64a6 100755 --- a/kernel/include/parser/parserr.h +++ b/kernel/include/parser/parserr.h @@ -116,8 +116,13 @@ /* ref_tsk */ #define _KERNEL_SPT_REF_TSK_E_ID _KERNEL_SPT_E_ID (_KERNEL_CFG_REF_TSK_E_ID) #define _KERNEL_SPT_REF_TSK_E_NOEXS _KERNEL_SPT_E_NOEXS (_KERNEL_CFG_REF_TSK_E_NOEXS) +#define _KERNEL_SPT_REF_TSK_E_NOSPT _KERNEL_SPT_E_NOSPT (_KERNEL_CFG_REF_TSK_E_NOSPT) /* ref_tst */ +#define _KERNEL_SPT_REF_TST_E_ID _KERNEL_SPT_E_ID (_KERNEL_CFG_REF_TST_E_ID) +#define _KERNEL_SPT_REF_TST_E_NOEXS _KERNEL_SPT_E_NOEXS (_KERNEL_CFG_REF_TST_E_NOEXS) +#define _KERNEL_SPT_REF_TST_E_NOSPT _KERNEL_SPT_E_NOSPT (_KERNEL_CFG_REF_TST_E_NOSPT) + /* slp_tsk */ /* tslp_tsk */ @@ -151,7 +156,6 @@ #define _KERNEL_SPT_DLY_TSK_E_CTX _KERNEL_SPT_E_CTX (_KERNEL_CFG_DLY_TSK_E_CTX) - /* def_tex */ #define _KERNEL_SPT_DEF_TEX_E_ID _KERNEL_SPT_E_ID (_KERNEL_CFG_DEF_TEX_E_ID) #define _KERNEL_SPT_DEF_TEX_E_NOEXS _KERNEL_SPT_E_NOEXS (_KERNEL_CFG_DEF_TEX_E_NOEXS) @@ -343,6 +347,11 @@ #define _KERNEL_SPT_ACRE_DTQ_E_NOSPT _KERNEL_SPT_E_NOSPT (_KERNEL_CFG_ACRE_DTQ_E_NOSPT) /* del_dtq */ +#define _KERNEL_SPT_DEL_DTQ_E_ID _KERNEL_SPT_E_ID (_KERNEL_CFG_DEL_DTQ_E_ID) +#define _KERNEL_SPT_DEL_DTQ_E_NOEXS _KERNEL_SPT_E_NOEXS (_KERNEL_CFG_DEL_DTQ_E_NOEXS) +#define _KERNEL_SPT_DEL_DTQ_E_NOSPT _KERNEL_SPT_E_NOSPT (_KERNEL_CFG_DEL_DTQ_E_NOSPT) + + /* snd_dtq */ #define _KERNEL_SPT_SND_DTQ_E_CTX _KERNEL_SPT_E_CTX (_KERNEL_CFG_SND_DTQ_E_CTX) #define _KERNEL_SPT_SND_DTQ_E_ID _KERNEL_SPT_E_ID (_KERNEL_CFG_SND_DTQ_E_ID) diff --git a/kernel/include/parser/parsknl.h b/kernel/include/parser/parsknl.h index 9dcb146..971bf1f 100755 --- a/kernel/include/parser/parsknl.h +++ b/kernel/include/parser/parsknl.h @@ -328,12 +328,20 @@ #define _KERNEL_SPT_TSK FALSE #endif +/* %jp{タスク例外処理サポートの判定} */ +#if ((_KERNEL_CFG_DEF_TEX)|| (_KERNEL_CFG_SDEF_TEX)) && (_KERNEL_CFG_TMAX_TSKID) > 0 +#define _KERNEL_SPT_TEX TRUE +#else #define _KERNEL_SPT_TEX FALSE +#endif + + #define _KERNEL_SPT_SEM TRUE #define _KERNEL_SPT_FLG TRUE #define _KERNEL_SPT_DTQ FALSE #define _KERNEL_SPT_MBX FALSE + /* %jp{ミューテックスオブジェクトサポートの判定} */ #if ((_KERNEL_CFG_CRE_MTX)|| (_KERNEL_CFG_ACRE_MTX) || (_KERNEL_CFG_SCRE_MTX)) && (_KERNEL_CFG_TMAX_MTXID) > 0 #define _KERNEL_SPT_MTX TRUE @@ -754,6 +762,15 @@ #define _KERNEL_TSK_TMAX_RELTIM _KERNEL_TMAX_RELTIM + +/* ---------------------------------- */ +/* Task exception state */ +/* ---------------------------------- */ + +#define _KERNEL_TXS_ENA 1 +#define _KERNEL_TXS_DIS 0 + + /* ---------------------------------- */ /* TCB member */ /* ---------------------------------- */ @@ -824,32 +841,11 @@ #define _KERNEL_TCB_ISP _KERNEL_PROCATR_CTX_ISP /**< %jp{TCBにispを含めるか} */ #endif - - -/* ------------------------------------------------------------------ */ -/* Task Exception Handling Routine */ -/* ------------------------------------------------------------------ */ - -/* Definitions */ -#define _KERNEL_TEXCB_ALG_BLKARRAY 1 -#define _KERNEL_TEXCB_ALG_PTRARRAY 2 - -/* Control block */ -#define _KERNEL_TEXCB_ALGORITHM _KERNEL_CFG_TEXCB_ALGORITHM -#define _KERNEL_TEXCB_BITFIELD _KERNEL_CFG_TEXCB_BITFIELD - -/* %jp{ブロック配列で動的生成がある場合はRO分離は不可} */ -#if (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_BLKARRAY) && (_KERNEL_SPT_CRE_SEM || _KERNEL_SPT_ACRE_SEM) -#define _KERNEL_TEXCB_SPLIT_RO FALSE -#else -#define _KERNEL_TEXCB_SPLIT_RO _KERNEL_CFG_TEXCB_SPLIT_RO -#endif - -/* Member variables */ -#define _KERNEL_TEXCB_STATE TRUE /**< %jp{タスク例外処理禁止状態} */ -#define _KERNEL_TEXCB_RASPTN TRUE /**< %jp{タスク例外処理要因} */ -#define _KERNEL_TEXCB_TEXATR FALSE /**< %jp{タスク例外処理ルーチン属性} */ -#define _KERNEL_TEXCB_TEXRTN TRUE /**< %jp{タスク例外処理ルーチンの起動番地} */ +/* Task Exception Handling Routine */ +#define _KERNEL_TCB_TEXSTAT _KERNEL_SPT_TEX /**< %jp{タスク例外処理状態} */ +#define _KERNEL_TCB_RASPTN _KERNEL_SPT_TEX /**< %jp{タスク例外処理要因} */ +#define _KERNEL_TCB_TEXATR FALSE /**< %jp{タスク例外処理ルーチン属性} */ +#define _KERNEL_TCB_TEXRTN _KERNEL_SPT_TEX /**< %jp{タスク例外処理ルーチンの起動番地} */ @@ -1111,6 +1107,26 @@ /* Cyclic Handlers */ /* ------------------------------------------------------------------ */ +/* Definitions */ +#define _KERNEL_CYCCB_ALG_BLKARRAY 1 +#define _KERNEL_CYCCB_ALG_PTRARRAY 2 + +/* Control block */ +#define _KERNEL_CYCCB_ALGORITHM _KERNEL_CFG_CYCCB_ALGORITHM +#define _KERNEL_CYCCB_BITFIELD _KERNEL_CFG_CYCCB_BITFIELD + +/* %jp{ブロック配列で動的生成がある場合はRO分離は不可} */ +#if (_KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_BLKARRAY) && (_KERNEL_SPT_CRE_CYC || _KERNEL_SPT_ACRE_CYC) +#define _KERNEL_CYCCB_SPLIT_RO FALSE +#else +#define _KERNEL_CYCCB_SPLIT_RO _KERNEL_CFG_CYCCB_SPLIT_RO +#endif + +/* Attributes */ +#define _KERNEL_SPT_CYC_TA_STA _KERNEL_CFG_CYC_TA_STA +#define _KERNEL_SPT_CYC_TA_PHS _KERNEL_CFG_CYC_TA_PHS + +/* Member variables */ #define _KERNEL_CYCCB_TIMOBJ TRUE #define _KERNEL_CYCCB_CYCATR TRUE #define _KERNEL_CYCCB_EXINF TRUE @@ -1119,6 +1135,7 @@ #define _KERNEL_CYCCB_CYCPHS TRUE + /* ------------------------------------------------------------------ */ /* inh */ /* ------------------------------------------------------------------ */ diff --git a/kernel/source/arch/proc/mn103/mn1030/cc103/kint_hdr.as b/kernel/source/arch/proc/mn103/mn1030/cc103/kint_hdr.as index 2198fa9..d782e3a 100755 --- a/kernel/source/arch/proc/mn103/mn1030/cc103/kint_hdr.as +++ b/kernel/source/arch/proc/mn103/mn1030/cc103/kint_hdr.as @@ -76,8 +76,8 @@ multiple_int: ; ---- 割り込みカウンタ復帰 movbu (__kernel_ictxcb+4), d0 - add 1, d0 - movbu d0, (a0) + add -1, d0 + movbu d0, (__kernel_ictxcb+4) bra return_int ; 復帰処理 diff --git a/kernel/source/arch/proc/mn103/mn1030/gcc/kcre_ctx.S b/kernel/source/arch/proc/mn103/mn1030/gcc/kcre_ctx.S index 835f01e..a4c9b16 100755 --- a/kernel/source/arch/proc/mn103/mn1030/gcc/kcre_ctx.S +++ b/kernel/source/arch/proc/mn103/mn1030/gcc/kcre_ctx.S @@ -46,6 +46,7 @@ __kernel_cre_ctx: ctx_entry: mov d2, d0 /* par1を設定 */ mov d3, d1 /* par2を設定 */ + add -12, sp jmp (a3) /* entry を実行 */ .size ctx_entry, .-ctx_entry diff --git a/kernel/source/arch/proc/mn103/mn1030/gcc/kint_hdr.S b/kernel/source/arch/proc/mn103/mn1030/gcc/kint_hdr.S index 85f7093..ddc4c05 100755 --- a/kernel/source/arch/proc/mn103/mn1030/gcc/kint_hdr.S +++ b/kernel/source/arch/proc/mn103/mn1030/gcc/kint_hdr.S @@ -24,13 +24,13 @@ __kernel_int_hdr: /* ---- レジスタ退避 ---- */ movm [other], (sp) /* レジスタ退避 */ + add -8, sp /* ---- 多重割込み判定 ---- */ mov __kernel_ictxcb, a0 movbu (4, a0), d0 - add -4, sp add 1, d0 - movbu d0, (4, a0) + movbu d0, (12, a0) cmp 1, d0 bne multiple_int @@ -38,8 +38,8 @@ __kernel_int_hdr: mov (0, a0), a1 mov sp, a0 /* タスクのSPを保存 */ mov a1, sp - add -8, sp - mov a0, (4, sp) + add -16, sp + mov a0, (12, sp) /* ---- 割り込み処理 ---- */ call __kernel_sta_inh, [], 0 /* 割り込み開始 */ @@ -49,13 +49,13 @@ __kernel_int_hdr: call __kernel_exe_inh, [], 0 /* ---- 割り込み処理の終了設定 ---- */ - mov (4, sp), a0 + mov (12, sp), a0 clr d0 - mov a0, sp /* スタック復帰 */ movbu d0, (__kernel_ictxcb+4) /* ネストカウンタクリア */ + mov a0, sp /* スタック復帰 */ /* ---- 割込みマスクレベルの復帰 ---- */ - mov (36, sp), d0 + mov (40, sp), d0 and 0x0700, d0 mov d0, psw @@ -64,7 +64,7 @@ __kernel_int_hdr: /* ---- 復帰処理 ---- */ return_int: - add 4, sp + add 8, sp movm (sp), [other] /* レジスタ退避 */ rti @@ -76,9 +76,9 @@ multiple_int: /* ---- 割り込みカウンタ復帰 ---- */ movbu (__kernel_ictxcb+4), d0 - add 1, d0 - movbu d0, (a0) - + add -1, d0 + movbu d0, (__kernel_ictxcb+4) + bra return_int /* 復帰処理 */ diff --git a/kernel/source/core/dsp/dsp_tsk.c b/kernel/source/core/dsp/dsp_tsk.c index 32fc396..884ac5e 100755 --- a/kernel/source/core/dsp/dsp_tsk.c +++ b/kernel/source/core/dsp/dsp_tsk.c @@ -87,6 +87,14 @@ void _kernel_dsp_tsk(void) /* %jp{ディスパッチ実行} */ _KERNEL_SWI_CTX(ctxcb_run, ctxcb_top); + + /* %jp{タスク例外処理} */ +#if _KERNEL_SPT_TEX + if ( tskhdl_run != _KERNEL_TSKHDL_NULL ) + { + _kernel_exe_tex(tskhdl_run); + } +#endif } diff --git a/kernel/source/object/cyc/kcre_cyc.c b/kernel/source/object/cyc/kcre_cyc.c index 694126b..5a53645 100755 --- a/kernel/source/object/cyc/kcre_cyc.c +++ b/kernel/source/object/cyc/kcre_cyc.c @@ -112,7 +112,8 @@ ER _kernel_cre_cyc(ID cycid, const T_CCYC *pk_ccyc) { _KERNEL_TIMOBJ_SET_LEFTTIM(pk_timobj, pk_ccyc->cyctim); } - _KERNEL_ADD_TMQ(_KERNEL_CYC_GET_TIMOBJ(cyccb)); + _KERNEL_SYS_ADD_TMQ(pk_timobj); + } #endif diff --git a/kernel/source/object/dtq/del_dtq.c b/kernel/source/object/dtq/del_dtq.c new file mode 100755 index 0000000..b46add9 --- /dev/null +++ b/kernel/source/object/dtq/del_dtq.c @@ -0,0 +1,112 @@ +/** + * Hyper Operating System V4 Advance + * + * @file del_que.c + * @brief %jp{データキューの削除}%en{Delete Data queue} + * + * Copyright (C) 1998-2008 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "core/core.h" +#include "object/dtqobj.h" + + + +#if _KERNEL_SPT_DEL_DTQ + + +/** %jp{セマフォの削除}%en{Delete Data queue} + * @param dtqid %jp{削除対象のセマフォのID番号}%en{ID number of the data queue to be deleted} + * @retval E_OK %jp{正常終了}%en{Normal completion} + * @retval E_ID %jp{不正ID番号(dtqidが不正あるいは使用できない)}%en{Invalid ID number(dtqid is invalid or unusable)} + * @retval E_NOEXS %jp{オブジェクト未生成(対象セマフォが未登録)}%en{Non-existant object(specified data queue is not registerd)} + */ +ER del_dtq(ID dtqid) +{ + _KERNEL_T_DTQCB *dtqcb; + _KERNEL_T_QUE *que; + _KERNEL_T_TSKHDL tskhdl; + _KERNEL_T_TCB *tcb; + + /* %jp{IDチェック}%en{check ID} */ +#if _KERNEL_SPT_DEL_DTQ_E_ID + if ( !_KERNEL_DTQ_CHECK_DTQID(dtqid) ) + { + return E_ID; /* %jp{不正ID番号}%en{Invalid ID number} */ + } +#endif + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + /* %jp{存在チェック}%en{check object} */ +#if _KERNEL_SPT_DEL_DTQ_E_NOEXS + if ( !_KERNEL_DTQ_CHECK_EXS(dtqid) ) + { + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + return E_NOEXS; + } +#endif + + /* %jp{セマフォコントロールブロック取得} */ + dtqcb = _KERNEL_DTQ_ID2DTQCB(dtqid); + + /* %jp{送信待ち行列のタスクを全て起床} */ + que = _KERNEL_DTQ_GET_SQUE(dtqcb); + while ( (tskhdl = _KERNEL_RMH_QUE(que)) != _KERNEL_TSKHDL_NULL ) + { + /* %jp{待ちタスクがあれば待ち解除} */ + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ + _KERNEL_TSK_SET_ERCD(tcb, E_DLT); /* %jp{エラーコード設定} */ + _KERNEL_DTQ_RMV_STOQ(tskhdl); /* %jp{タイムアウトキューから外す} */ + _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ + } + + /* %jp{受信待ち行列のタスクを全て起床} */ + que = _KERNEL_DTQ_GET_RQUE(dtqcb); + while ( (tskhdl = _KERNEL_RMH_QUE(que)) != _KERNEL_TSKHDL_NULL ) + { + /* %jp{待ちタスクがあれば待ち解除} */ + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ + _KERNEL_TSK_SET_ERCD(tcb, E_DLT); /* %jp{エラーコード設定} */ + _KERNEL_DTQ_RMV_RTOQ(tskhdl); /* %jp{タイムアウトキューから外す} */ + _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ + } + + /* %jp{オブジェクト削除} */ +#if _KERNEL_DTQCB_ALGORITHM == _KERNEL_DTQCB_ALG_PTRARRAY + _KERNEL_SYS_FRE_HEP(dtqcb); /* %jp{メモリ開放} */ + _KERNEL_DTQ_ID2DTQCB(dtqid) = NULL; +#elif _KERNEL_DTQCB_ALGORITHM == _KERNEL_DTQCB_ALG_BLKARRAY + _KERNEL_DTQ_SET_MAXDTQ(dtqcb, 0); +#endif + + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + + return E_OK; +} + + +#else /* _KERNEL_SPT_DEL_DTQ */ + + +#if _KERNEL_SPT_DEL_DTQ_E_NOSPT + +/** %jp{セマフォの削除}%en{Delete Data queue} + * @param dtqid %jp{削除対象のセマフォのID番号}%en{ID number of the data queue to be deleted} + * @retval E_NOSPT %jp{未サポート機能}%en{Unsupported function} + */ +ER del_dtq(ID dtqid) +{ + return E_NOSPT; +} + +#endif + + +#endif /* _KERNEL_SPT_DEL_DTQ */ + + + +/* end of file */ diff --git a/kernel/source/object/sys/sta_knl.c b/kernel/source/object/sys/sta_knl.c index b702817..7767b1c 100755 --- a/kernel/source/object/sys/sta_knl.c +++ b/kernel/source/object/sys/sta_knl.c @@ -63,14 +63,14 @@ ER vsta_knl(void) (VP_INT)0 ); - + _KERNEL_LEAVE_SVC(); - + /* %jp{初期化ハンドラ実行} */ _kernel_cfg_sta(); - + _KERNEL_ENTER_SVC(); - + /* %jp{初期コンテキストの開始} */ _kernel_sta_ctx(_KERNEL_SYS_GET_SYSCTXCB()); diff --git a/kernel/source/object/tex/def_tex.c b/kernel/source/object/tex/def_tex.c deleted file mode 100755 index 8398963..0000000 --- a/kernel/source/object/tex/def_tex.c +++ /dev/null @@ -1,162 +0,0 @@ -/** - * Hyper Operating System V4 Advance - * - * @file def_tex.c - * @brief %en{Activate Task}%jp{タスクの起動} - * - * Copyright (C) 1998-2008 by Project HOS - * http://sourceforge.jp/projects/hos/ - */ - - - -#include "core/core.h" -#include "object/texobj.h" - - -/* %jp{タスク例外処理ルーチンの定義} */ -ER def_tex(ID tskid, T_DTEX *pk_dtex) -{ - _KERNEL_T_TEXCB *texcb; - _KERNEL_T_TEXCB_RO *texcb_ro; - - - if ( tskid == TSK_SELF ) /* %jp{自タスク指定時の変換} */ - { - _KERNEL_T_TSKHDL tskhdl; - -#ifdef _KERNEL_SPT_DEF_TEX_E_ID - if ( _KERNEL_SYS_SNS_CTX() ) - { - return E_ID; /* %jp{不正ID番号} */ - } -#endif - - /* %jp{実行中タスクを取得} */ - tskhdl = _KERNEL_SYS_GET_RUNTSK(); - tskid = _KERNEL_TSK_TSKHDL2ID(tskhdl); - } - else - { -#if _KERNEL_SPT_DEF_TEX_E_ID - if ( !_KERNEL_TEX_CHECK_TSKID(tskid) ) - { - return E_ID; /* %jp{不正ID番号} */ - } -#endif - } - - - _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ - - /* %jp{タスク存在チェック} */ -#if _KERNEL_SPT_DEF_TEX_E_NOEXS - if ( !_KERNEL_TSK_CHECK_EXS(tskid) ) - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_NOEXS; - } -#endif - - if ( pk_dtex != NULL ) /* 登録 */ - { - if ( !_KERNEL_TEX_CHECK_EXS(tskid) ) /* 未登録なら生成 */ - { -#if (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_BLKARRAY) - { /* %jp{ブロック配列の場合} */ - texcb = _KERNEL_TEX_ID2TEXCB(tskid); - texcb_ro = _KERNEL_TEX_GET_TEXCB_RO(tskid, texcb); - } -#elif (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY) && _KERNEL_TEXCB_SPLIT_RO - { /* %jp{ポインタ管理で、ROM/RAM分離の場合} */ - VP mem; - SIZE memsz; - - /* %jp{メモリサイズ決定} */ - memsz = _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_TEXCB)) - + _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_TEXCB_RO)); - - /* %jp{メモリ確保} */ - mem = _KERNEL_SYS_ALC_HEP(memsz); - - /* %jp{メモリ不足チェック} */ -#if _KERNEL_SPT_DEF_TEX_E_NOMEM - if ( mem == NULL ) - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_NOMEM; - } -#endif - - /* %jp{メモリ割り当て} */ - texcb = (_KERNEL_T_TEXCB *)mem; - texcb_ro = (_KERNEL_T_TEXCB_RO *)((VB *)mem + _KERNEL_SYS_ALG_HEP(sizeof(_KERNEL_T_TEXCB))); - _KERNEL_TEX_ID2TEXCB(tskid) = tskcb; - _KERNEL_TEX_ID2TEXCB(tskid)->tskcb_ro = (const _KERNEL_T_TEXCB_RO *)texcb_ro; - } -#elif (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY) && !(_KERNEL_TEXCB_SPLIT_RO) - { /* %jp{ポインタ管理で、ROM/RAM統合の場合} */ - VP mem; - - /* %jp{メモリ確保} */ - mem = _KERNEL_SYS_ALC_HEP(sizeof(_KERNEL_T_TEXCB)); - - /* %jp{メモリ不足チェック} */ -#if _KERNEL_SPT_DEF_TEX_E_NOMEM - if ( mem == NULL ) - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_NOMEM; - } -#endif - - /* %jp{メモリ割り当て} */ - texcb = (_KERNEL_T_TEXCB *)mem; - texcb_ro = (_KERNEL_T_TEXCB_RO *)mem; - _KERNEL_TEX_ID2TEXCB(tskid) = texcb; - } -#endif - } - else - { - /* %jp{すでに登録があれば現状のものを取得} */ - texcb = _KERNEL_TEX_ID2TEXCB(tskid); - texcb_ro = _KERNEL_TEX_GET_TEXCB_RO(tskid, texcb); - } - - /* 登録 */ - _KERNEL_TEX_SET_STATE(texcb, FALSE); - _KERNEL_TEX_SET_RASPTN(texcb, 0); - _KERNEL_TEX_SET_TEXATR(texcb_ro, pk_dtex->texatr); - _KERNEL_TEX_SET_TEXRTN(texcb_ro, pk_dtex->texrtn); - } - else /* %jp{登録解除} */ - { - if ( _KERNEL_TEX_CHECK_EXS(tskid) ) /* %jp{登録済みなら削除} */ - { - /* %jp{コントロールブロック取得} */ - texcb = _KERNEL_TEX_ID2TEXCB(tskid); - -#if (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_BLKARRAY) - { /* %jp{ブロック配列の場合} */ - texcb_ro = (_KERNEL_T_TEXCB_RO *)_KERNEL_TEX_GET_TEXCB_RO(tskid, texcb); - _KERNEL_TEX_SET_TEXRTN(texcb_ro,NULL); /* %jp{未登録をマーク} */ - } -#elif (_KERNEL_TEXCB_ALGORITHM == _KERNEL_TEXCB_ALG_PTRARRAY) - { /* %jp{ポインタ管理の場合} */ - _KERNEL_SYS_FRE_HEP(texcb); /* %jp{メモリ開放} */ - _KERNEL_TEX_ID2TEXCB(tskid) = NULL; /* %jp{未登録をマーク} */ - } - } -#endif - } - - - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - - - return E_OK; -} - - -/* end of file */ diff --git a/kernel/source/object/tex/ras_tex.c b/kernel/source/object/tex/ras_tex.c deleted file mode 100755 index ba83192..0000000 --- a/kernel/source/object/tex/ras_tex.c +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Hyper Operating System V4 Advance - * - * @file def_tex.c - * @brief %en{Activate Task}%jp{タスクの起動} - * - * Copyright (C) 1998-2008 by Project HOS - * http://sourceforge.jp/projects/hos/ - */ - - - -#include "core/core.h" -#include "object/texobj.h" - - -/* %jp{タスク例外処理の要求} */ -ER ras_tex(ID tskid, TEXPTN rasptn) -{ - _KERNEL_T_TSKHDL tskhdl; - _KERNEL_T_TEXCB_PTR texcb; - _KERNEL_T_TEXCB_RO_PTR texcb_ro; - _KERNEL_T_TCB_PTR tcb; - _KERNEL_T_TCB_RO_PTR tcb_ro; - - - if ( tskid == TSK_SELF ) /* %jp{自タスク指定時の変換} */ - { -#ifdef _KERNEL_SPT_RAS_TEX_E_ID - if ( _KERNEL_SYS_SNS_CTX() ) - { - return E_ID; /* %jp{不正ID番号} */ - } -#endif - - /* %jp{実行中タスクを取得} */ - tskhdl = _KERNEL_SYS_GET_RUNTSK(); - tskid = _KERNEL_TSK_TSKHDL2ID(tskhdl); - } - else - { -#if _KERNEL_SPT_RAS_TEX_E_ID - if ( !_KERNEL_TEX_CHECK_TSKID(tskid) ) - { - return E_ID; /* %jp{不正ID番号} */ - } -#endif - } - - - _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ - - /* %jp{タスク存在チェック} */ -#if _KERNEL_SPT_RAS_TEX_E_NOEXS - if ( !_KERNEL_TSK_CHECK_EXS(tskid) ) - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_NOEXS; - } -#endif - - -#if _KERNEL_SPT_RAS_TEX_E_OBJ - if ( !_KERNEL_TEX_CHECK_EXS(tskid) /* 未登録 */ - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_OBJ; - } -#endif - - /* TCB取得 */ - tcb = _KERNEL_TSK_ID2TCB(tskid); - - -#if _KERNEL_SPT_RAS_TEX_E_OBJ - if ( _KERNEL_TSK_GET_TSKSTAT(tcb) == _KERNEL_TTS_DMT ) /* %jp{オブジェクト状態判定} */ - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - return E_OBJ; - } -#endif - - /* 例外要因設定 */ - rasptn |= _KERNEL_TEX_GET_RASPTN(texcb); - _KERNEL_TEX_SET_RASPTN(texcb, rasptn); - - - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ - - - return E_OK; -} - - -/* end of file */ diff --git a/kernel/source/object/tsk/def_tex.c b/kernel/source/object/tsk/def_tex.c new file mode 100755 index 0000000..8e2bd9a --- /dev/null +++ b/kernel/source/object/tsk/def_tex.c @@ -0,0 +1,91 @@ +/** + * Hyper Operating System V4 Advance + * + * @file def_tex.c + * @brief %en{Activate Task}%jp{タスクの起動} + * + * Copyright (C) 1998-2008 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + + +#include "core/core.h" + + +/* %jp{タスク例外処理ルーチンの定義} */ +ER def_tex(ID tskid, T_DTEX *pk_dtex) +{ + _KERNEL_T_TCB *tcb; + _KERNEL_T_TCB_RO *tcb_ro; + + + if ( tskid == TSK_SELF ) /* %jp{自タスク指定時の変換} */ + { + _KERNEL_T_TSKHDL tskhdl; + +#ifdef _KERNEL_SPT_DEF_TEX_E_ID + if ( _KERNEL_SYS_SNS_CTX() ) + { + return E_ID; /* %jp{不正ID番号} */ + } +#endif + + /* %jp{実行中タスクを取得} */ + tskhdl = _KERNEL_SYS_GET_RUNTSK(); + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); + tcb_ro = _KERNEL_TSK_GET_TCB_RO(_KERNEL_TSK_TSKHDL2ID(tskhdl), tcb); + + } + else + { + /* %jp{IDチェック} */ +#if _KERNEL_SPT_DEF_TEX_E_ID + if ( !_KERNEL_TSK_CHECK_TSKID(tskid) ) + { + return E_ID; /* %jp{不正ID番号} */ + } +#endif + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + /* %jp{タスク存在チェック} */ +#if _KERNEL_SPT_DEF_TEX_E_NOEXS + if ( !_KERNEL_TSK_CHECK_EXS(tskid) ) + { + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + return E_NOEXS; + } +#endif + + /* コントロールブロック取得 */ + tcb = _KERNEL_TSK_ID2TCB(tskid); + tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb); + } + + + if ( pk_dtex != NULL ) + { + /* 登録 */ + _KERNEL_TSK_SET_RASPTN(tcb, 0); + _KERNEL_TSK_SET_TEXATR(tcb_ro, pk_dtex->texatr); + _KERNEL_TSK_SET_TEXRTN(tcb_ro, pk_dtex->texrtn); + } + else + { + /* %jp{登録解除} */ + _KERNEL_TSK_SET_TEXSTAT(tcb, _KERNEL_TXS_DIS); + _KERNEL_TSK_SET_TEXRTN(tcb_ro, NULL); + } + + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + + + return E_OK; +} + + +/* end of file */ diff --git a/kernel/source/object/tsk/kcre_tsk.c b/kernel/source/object/tsk/kcre_tsk.c index 46b4c51..e9dac83 100755 --- a/kernel/source/object/tsk/kcre_tsk.c +++ b/kernel/source/object/tsk/kcre_tsk.c @@ -125,8 +125,12 @@ ER _kernel_cre_tsk(ID tskid, const T_CTSK *pk_ctsk) _KERNEL_TSK_SET_STK(tcb_ro, stk); /* %jp{スタック領域の先頭番地} */ _KERNEL_TSK_SET_ISP(tcb_ro, (VB *)stk + pk_ctsk->stksz); /* %jp{スタックポインタ初期値の先頭番地} */ _KERNEL_TSK_SET_TSKID(tcb_ro, tskid); + _KERNEL_TSK_SET_TEXATR(tcb_ro, TA_HLNG); + _KERNEL_TSK_SET_TEXRTN(tcb_ro, NULL); _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_DMT); _KERNEL_TSK_SET_MTXHDL(tcb, _KERNEL_MTXHDL_NULL); + _KERNEL_TSK_SET_TEXSTAT(tcb, _KERNEL_TXS_DIS); + _KERNEL_TSK_SET_RASPTN(tcb, 0); /* %jp{TA_ACT属性があればタスク実行} */ #if _KERNEL_SPT_TSK_TA_ACT diff --git a/kernel/source/object/tsk/kexe_tex.c b/kernel/source/object/tsk/kexe_tex.c new file mode 100755 index 0000000..8d2614f --- /dev/null +++ b/kernel/source/object/tsk/kexe_tex.c @@ -0,0 +1,63 @@ +/** + * Hyper Operating System V4 Advance + * + * @file def_tex.c + * @brief %en{Activate Task}%jp{タスクの起動} + * + * Copyright (C) 1998-2008 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + + +#include "core/core.h" + + +/* %jp{タスク例外処理の実行} */ +void _kernel_exe_tex(_KERNEL_T_TSKHDL tskhdl) +{ + _KERNEL_T_TCB_PTR tcb; + _KERNEL_T_TCB_RO_PTR tcb_ro; + _KERNEL_TSK_T_TEXPTN rasptn; + _KERNEL_TSK_T_TEXRTN texrtn; + _KERNEL_TSK_T_EXINF exinf; + + + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); + + /* %jp{タスク例外処理禁止なら何もしない} */ + if ( _KERNEL_TSK_GET_TEXSTAT(tcb) != _KERNEL_TXS_ENA ) + { + return; + } + + /* %jp{タスク例外要因がなければ何もしない} */ + if ( (rasptn = _KERNEL_TSK_GET_RASPTN(tcb)) == 0 ) + { + return; + } + + tcb_ro = _KERNEL_TSK_GET_TCB_RO(_KERNEL_TSK_TSKHDL2ID(tskhdl_run), tcb); + exinf = _KERNEL_TSK_GET_EXINF(tcb_ro); + + /* %jp{例外要因が無くなるまで実行} */ + do + { + _KERNEL_TSK_SET_TEXSTAT(tcb, _KERNEL_TXS_DIS); + _KERNEL_TSK_SET_RASPTN(tcb, 0); + + texrtn = _KERNEL_TSK_GET_TEXRTN(tcb_ro); + + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + + /* %jp{タスク例外処理呼び出し} */ + texrtn((TEXPTN)rasptn, (VP_INT)exinf); + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + } while ( (rasptn = _KERNEL_TSK_GET_RASPTN(tcb)) != 0 ); + + _KERNEL_TSK_SET_TEXSTAT(tcb, _KERNEL_TXS_ENA); +} + + +/* end of file */ diff --git a/kernel/source/object/tsk/ras_tex.c b/kernel/source/object/tsk/ras_tex.c new file mode 100755 index 0000000..d70685f --- /dev/null +++ b/kernel/source/object/tsk/ras_tex.c @@ -0,0 +1,115 @@ +/** + * Hyper Operating System V4 Advance + * + * @file def_tex.c + * @brief %en{Activate Task}%jp{タスクの起動} + * + * Copyright (C) 1998-2008 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + + +#include "core/core.h" + + +/* %jp{タスク例外処理の要求} */ +ER ras_tex(ID tskid, TEXPTN rasptn) +{ + _KERNEL_T_TCB_PTR tcb; + _KERNEL_T_TCB_RO_PTR tcb_ro; + _KERNEL_T_TSKHDL tskhdl; + + if ( tskid == TSK_SELF ) /* %jp{自タスク指定時の変換} */ + { +#ifdef _KERNEL_SPT_DEF_TEX_E_ID + if ( _KERNEL_SYS_SNS_CTX() ) + { + return E_ID; /* %jp{不正ID番号} */ + } +#endif + + /* %jp{実行中タスクを取得} */ + tskhdl = _KERNEL_SYS_GET_RUNTSK(); + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); + tcb_ro = _KERNEL_TSK_GET_TCB_RO(_KERNEL_TSK_TSKHDL2ID(tskhdl), tcb); + + } + else + { + /* %jp{IDチェック} */ +#if _KERNEL_SPT_DEF_TEX_E_ID + if ( !_KERNEL_TSK_CHECK_TSKID(tskid) ) + { + return E_ID; /* %jp{不正ID番号} */ + } +#endif + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + /* %jp{タスク存在チェック} */ +#if _KERNEL_SPT_DEF_TEX_E_NOEXS + if ( !_KERNEL_TSK_CHECK_EXS(tskid) ) + { + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + return E_NOEXS; + } +#endif + + /* コントロールブロック取得 */ + tcb = _KERNEL_TSK_ID2TCB(tskid); + tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb); + tskhdl = _KERNEL_TSK_GET_TSKHDL(tskid, tcb); + } + +#if _KERNEL_SPT_RAS_TEX_E_OBJ + if ( _KERNEL_TSK_GET_TSKSTAT(tcb) == _KERNEL_TTS_DMT ) /* %jp{オブジェクト状態判定} */ + { + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + return E_OBJ; + } +#endif + + + /* 例外要因設定 */ + rasptn |= _KERNEL_TSK_GET_RASPTN(tcb); + _KERNEL_TSK_SET_RASPTN(tcb, rasptn); + if ( tskhdl == _KERNEL_SYS_GET_RUNTSK() ) + { + if ( _KERNEL_TSK_GET_TEXSTAT(tcb) == _KERNEL_TXS_ENA ) + { + _KERNEL_TSK_T_TEXRTN texrtn; + _KERNEL_TSK_T_EXINF exinf; + + do + { + _KERNEL_TSK_SET_TEXSTAT(tcb, _KERNEL_TXS_DIS); + _KERNEL_TSK_SET_RASPTN(tcb, 0); + + tcb_ro = _KERNEL_TSK_GET_TCB_RO(_KERNEL_TSK_TSKHDL2ID(tskhdl_run), tcb); + texrtn = _KERNEL_TSK_GET_TEXRTN(tcb_ro); + exinf = _KERNEL_TSK_GET_EXINF(tcb_ro); + + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + + /* %jp{タスク例外処理呼び出し} */ + texrtn((TEXPTN)rasptn, (VP_INT)exinf); + + _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + + } while ( (rasptn = _KERNEL_TSK_GET_RASPTN(tcb)) != 0 ); + } + } + + + _KERNEL_LEAVE_SVC(); /* %jp{サービスコールから出る}%en{leave service-call} */ + + + return E_OK; +} + + +/* end of file */