From: ryuz Date: Sun, 26 Nov 2006 11:13:24 +0000 (+0000) Subject: (none) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=773d0ccc5857124308510dad952b721d157096da;p=hos%2Fhos-v4a.git (none) --- diff --git a/cfgrtr/build/gcc/gmake.mak b/cfgrtr/build/gcc/gmake.mak index c448af8..12c0a4e 100755 --- a/cfgrtr/build/gcc/gmake.mak +++ b/cfgrtr/build/gcc/gmake.mak @@ -31,6 +31,7 @@ OBJS = $(OBJS_DIR)/hos4cfg.o \ $(OBJS_DIR)/read.o \ $(OBJS_DIR)/defercd.o \ $(OBJS_DIR)/intstk.o \ + $(OBJS_DIR)/dpcque.o \ $(OBJS_DIR)/idlstk.o \ $(OBJS_DIR)/knlheap.o \ $(OBJS_DIR)/maxtpri.o \ diff --git a/cfgrtr/build/vc60/h4acfg.dsp b/cfgrtr/build/vc60/h4acfg.dsp index 1c15dd3..83c1eb6 100755 --- a/cfgrtr/build/vc60/h4acfg.dsp +++ b/cfgrtr/build/vc60/h4acfg.dsp @@ -158,6 +158,10 @@ SOURCE=..\..\source\deftex.cpp # End Source File # Begin Source File +SOURCE=..\..\source\dpcque.cpp +# End Source File +# Begin Source File + SOURCE=..\..\source\hos4cfg.cpp # End Source File # Begin Source File diff --git a/cfgrtr/source/dpcque.cpp b/cfgrtr/source/dpcque.cpp index ee90ead..b6ed0ee 100755 --- a/cfgrtr/source/dpcque.cpp +++ b/cfgrtr/source/dpcque.cpp @@ -62,6 +62,7 @@ int CApiDpcQue::AnalyzeApi(const char* pszApiName, const char* pszParams) // cfgファイル定義部書き出し void CApiDpcQue::WriteCfgDef(FILE* fp) { +#if _KERNEL_SPT_DPC const char* pszQue; const char* pszQueCnt; @@ -92,12 +93,14 @@ void CApiDpcQue::WriteCfgDef(FILE* fp) "VP_INT _kernel_dpc_queblk[(%s)];\n\n", pszQueCnt); } +#endif } // cfgファイル起動部書き出し void CApiDpcQue::WriteCfgIni(FILE* fp) { +#if _KERNEL_SPT_DPC const char* pszQue; const char* pszQueCnt; @@ -117,7 +120,7 @@ void CApiDpcQue::WriteCfgIni(FILE* fp) { fprintf( fp, - "\n\t_KERNEL_SYS_INI_DPC((VP)(_kernel_dpc_queblk), (UINT)sizeof(_kernel_dpc_queblk) / szieof(VP_INT));\n"); + "\n\t_KERNEL_SYS_INI_DPC((VP)(_kernel_dpc_queblk), (UINT)sizeof(_kernel_dpc_queblk) / sizeof(VP_INT));\n"); } else { @@ -126,6 +129,7 @@ void CApiDpcQue::WriteCfgIni(FILE* fp) "\n\t_KERNEL_SYS_INI_DPC((VP)(%s), (UINT)(%s));\n", pszQue, pszQueCnt); } +#endif } diff --git a/cfgrtr/source/hos4cfg.cpp b/cfgrtr/source/hos4cfg.cpp index 436d0ec..975f087 100755 --- a/cfgrtr/source/hos4cfg.cpp +++ b/cfgrtr/source/hos4cfg.cpp @@ -17,6 +17,7 @@ #include "read.h" #include "analyze.h" #include "apiinc.h" +#include "dpcque.h" #include "idlstk.h" #include "intstk.h" #include "knlheap.h" @@ -51,6 +52,7 @@ void PrintUsage(void); CApiInclude g_ApiInclude; CApiKernelHeap g_ApiKernelHeap; +CApiDpcQue g_ApiDpcQue; CApiIdleStack g_ApiIdleStack; CApiMaxTpri g_ApiMaxTpri; CApiIntStack g_IntStack; @@ -79,6 +81,7 @@ static CApiDef* g_ApiList[] = { &g_ApiInclude, &g_ApiKernelHeap, + &g_ApiDpcQue, &g_ApiIdleStack, &g_IntStack, &g_ApiCreTsk, diff --git a/kernel/include/config/cfgknl.h b/kernel/include/config/cfgknl.h index 0146422..404a6bb 100755 --- a/kernel/include/config/cfgknl.h +++ b/kernel/include/config/cfgknl.h @@ -66,7 +66,7 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ /* ---------------------------------------------- */ /* %jp{遅延プロシージャーコール} */ -#define _KERNEL_CFG_DPC FALSE /**< Deferred Procedure Call */ +#define _KERNEL_CFG_DPC TRUE /**< Deferred Procedure Call */ /* %jp{対称型マルチプロセッサ対応[未実装]} */ #define _KERNEL_CFG_SMP FALSE /**< Symmetric Multiple Processor */ diff --git a/kernel/source/object/flg/iset_flg.c b/kernel/source/object/flg/iset_flg.c index 876e54c..fdbb2dc 100755 --- a/kernel/source/object/flg/iset_flg.c +++ b/kernel/source/object/flg/iset_flg.c @@ -54,15 +54,83 @@ ER iset_flg(ID flgid, FLGPTN setptn) /** %jp{set_flgの遅延実行}%en{service call for delayed execution(set_flg)} */ void _kernel_dpc_set_flg(void) { - ID flgid; - FLGPTN setptn; + _KERNEL_T_QUE *pk_que; + _KERNEL_T_FLGCB *flgcb; + _KERNEL_T_FLGINF *pk_flginf; + _KERNEL_T_TSKHDL tskhdl; + _KERNEL_T_TSKHDL tskhdl_next; + _KERNEL_T_TCB *tcb; + ID flgid; + FLGPTN setptn; /* %jp{パラメータ取り出し} */ flgid = (ID)_KERNEL_SYS_RCV_DPC(); setptn = (FLGPTN)_KERNEL_SYS_RCV_DPC(); + + /* %jp{ID のチェック} */ +#ifdef _KERNEL_SPT_ISET_FLG_E_ID + if ( !_KERNEL_FLG_CHECK_FLGID(flgid) ) + { + return; /* %jp{ID不正} */ + } +#endif + + /* %jp{オブジェクト存在チェック} */ +#ifdef _KERNEL_SPT_ISET_FLG_E_NOEXS + if ( !_KERNEL_FLG_CHECK_EXS(flgid) ) + { + return; /* %jp{オブジェクト未生成} */ + } +#endif + + /* %jp{コントロールブロック取得} */ + flgcb = _KERNEL_FLG_ID2FLGCB(flgid); + + /* %jp{待ち行列取得} */ + pk_que = _KERNEL_FLG_GET_QUE(flgcb); - /* %jp{遅延実行} */ - set_flg(flgid, setptn); + /* %jp{フラグセット} */ + _KERNEL_FLG_SET_FLGPTN(flgcb, _KERNEL_FLG_GET_FLGPTN(flgcb) | setptn); + + /* %jp{待ちタスクがあれば起床チェック} */ + tskhdl = _KERNEL_REF_QUE(pk_que); + while ( tskhdl != _KERNEL_TSKHDL_NULL ) + { + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ + + tskhdl_next = _KERNEL_NXT_QUE(pk_que, tskhdl); /* %jp{次の待ちタスクを取得} */ + + /* %jp{フラグチェック} */ + pk_flginf = (_KERNEL_T_FLGINF *)_KERNEL_TSK_GET_DATA(tcb); + if ( _kernel_chk_flg(flgcb, pk_flginf) ) + { + /* %jp{起床条件を満たしているなら} */ + pk_flginf->waiptn = _KERNEL_FLG_GET_FLGPTN(flgcb); /* %jp{現在のフラグパターンを格納} */ + + /* %jp{待ち解除} */ + _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */ + _KERNEL_RMV_QUE(pk_que, tskhdl); /* %jp{待ち行列から取り外す} */ + _KERNEL_FLG_RMV_TOQ(tskhdl); + _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ + + /* %jp{待ち解除発生をマーク} */ + _KERNEL_SYS_SET_DLY(); + +#if _KERNEL_SPT_FLG_TA_CLR + { + const _KERNEL_T_FLGCB_RO *flgcb_ro; + flgcb_ro = _KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb); + + if ( _KERNEL_FLG_GET_FLGATR(flgcb_ro) & TA_CLR ) + { + _KERNEL_FLG_SET_FLGPTN(flgcb, 0); /* %jp{クリア属性があればクリア} */ + break; + } + } +#endif + } + tskhdl = tskhdl_next; /* 次のタスクに進める */ + } } #else /* _KERNEL_SPT_DPC */ diff --git a/kernel/source/object/inh/end_inh.c b/kernel/source/object/inh/end_inh.c index 5de013c..1f46df1 100755 --- a/kernel/source/object/inh/end_inh.c +++ b/kernel/source/object/inh/end_inh.c @@ -27,9 +27,10 @@ void _kernel_end_inh(void) _KERNEL_ENA_INT(); /* %jp{割込み許可} */ - /* %jp{サービスコール処理の実施} */ - _KERNEL_ENTER_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ - _KERNEL_LEAVE_SVC(); /* %jp{サービスコールに入る}%en{enter service-call} */ + if ( !_KERNEL_SYS_SNS_SVC() ) + { + _KERNEL_DPC_EXE_DPC(); + } _KERNEL_DIS_INT(); /* %jp{割込み禁止} */ }