OSDN Git Service

(none)
authorryuz <ryuz>
Sun, 26 Nov 2006 11:13:24 +0000 (11:13 +0000)
committerryuz <ryuz>
Sun, 26 Nov 2006 11:13:24 +0000 (11:13 +0000)
cfgrtr/build/gcc/gmake.mak
cfgrtr/build/vc60/h4acfg.dsp
cfgrtr/source/dpcque.cpp
cfgrtr/source/hos4cfg.cpp
kernel/include/config/cfgknl.h
kernel/source/object/flg/iset_flg.c
kernel/source/object/inh/end_inh.c

index c448af8..12c0a4e 100755 (executable)
@@ -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 \
index 1c15dd3..83c1eb6 100755 (executable)
@@ -158,6 +158,10 @@ SOURCE=..\..\source\deftex.cpp
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\source\dpcque.cpp\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\source\hos4cfg.cpp\r
 # End Source File\r
 # Begin Source File\r
index ee90ead..b6ed0ee 100755 (executable)
@@ -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
 }
 
 
index 436d0ec..975f087 100755 (executable)
@@ -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,
index 0146422..404a6bb 100755 (executable)
@@ -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 */
index 876e54c..fdbb2dc 100755 (executable)
@@ -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 */
index 5de013c..1f46df1 100755 (executable)
@@ -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{割込み禁止} */
 }