OSDN Git Service

(none)
authorryuz <ryuz>
Wed, 8 Nov 2006 14:37:36 +0000 (14:37 +0000)
committerryuz <ryuz>
Wed, 8 Nov 2006 14:37:36 +0000 (14:37 +0000)
28 files changed:
aplfw/build/h8/ae-3069-lan/ch38/gmake.mak
cfgrtr/include/attisr.h
cfgrtr/source/attisr.cpp
cfgrtr/source/definh.cpp
kernel/build/h8/h8300ha/ch38/gmake.mak
kernel/include/arch/irc/arm/ADuC7019/ircatr.h
kernel/include/arch/irc/none/irc.h
kernel/include/arch/irc/none/ircatr.h
kernel/include/arch/irc/simple/irc.h
kernel/include/arch/irc/simple/ircatr.h
kernel/include/arch/proc/mn103/mn1030/proc.h
kernel/include/arch/proc/mn103/mn1030/procatr.h
kernel/include/config/cfgknl.h
kernel/include/core/dpc.h
kernel/include/core/objhdl.h
kernel/include/object/inhobj.h
kernel/include/object/isrobj.h
kernel/include/object/semobj.h
kernel/include/object/tskobj.h
kernel/include/parser/parsknl.h
kernel/source/core/adtq/rcv_adtq.c
kernel/source/core/adtq/ref_fadq.c
kernel/source/core/adtq/ref_sadq.c
kernel/source/core/adtq/snd_adtq.c
kernel/source/object/inh/exe_inh.c
kernel/source/object/isr/acre_isr.c
kernel/source/object/isr/exe_isr.c
kernel/source/object/isr/kcre_isr.c

index 4c824e8..79b49e4 100755 (executable)
@@ -23,8 +23,8 @@ CC     = ch38
 ASM    = asm38
 LINK   = optlnk
 
-CFLAGS = -CP=300HA -DEBug -I=$(INC_DIR),$(SRC_DIR)
-AFLAGS = -CP=300HA -DEBug
+CFLAGS = -CP=300HA -DEBug -NOLOGO -I=$(INC_DIR),$(SRC_DIR)
+AFLAGS = -CP=300HA -DEBug -NOLOGO
 LFLAGS = 
 
 OBJS_DIR = objs
index 9bfc6dc..27eb85e 100755 (executable)
@@ -26,6 +26,10 @@ public:
        int   AutoId(void);
        void  WriteCfgDef(FILE* fp);    // cfgファイル定義部書き出し
        void  WriteCfgIni(FILE* fp);    // cfgファイル初期化部書き出し
+
+protected:
+       int   m_iMinIntNo;      
+       int   m_iMaxIntNo;      
 };
 
 
index e8f169e..c7767b6 100755 (executable)
@@ -28,6 +28,9 @@ CApiAttIsr::CApiAttIsr()
        // パラメーター構文設定
        m_iParamSyntax[0] = 4;          // 4つのパラメーターブロック
        m_iParams         = 1;
+
+       m_iMinIntNo =  0;       
+       m_iMaxIntNo = -1;
 }
 
 // デストラクタ
@@ -39,6 +42,12 @@ CApiAttIsr::~CApiAttIsr()
 // 自動ID番号割り当て
 int CApiAttIsr::AutoId(void)
 {
+       if ( m_iMaxIntNo ==  -1 )
+       {
+               m_iMinIntNo = _KERNEL_IRCATR_TMIN_INTNO;
+               m_iMaxIntNo = _KERNEL_IRCATR_TMAX_INTNO;
+       }
+       
        return CFG_ERR_OK;
 }
 
@@ -67,6 +76,16 @@ int CApiAttIsr::AnalyzeApi(const char* pszApiName, const char* pszParams)
                
                return CFG_ERR_OK;
        }
+       else if ( strcmp(pszApiName, "KERNEL_MIN_INTNO") == 0 )
+       {
+               m_iMinIntNo = atoi(pszParams);
+               return CFG_ERR_OK;
+       }
+       else if ( strcmp(pszApiName, "KERNEL_MAX_INTNO") == 0 )
+       {
+               m_iMaxIntNo = atoi(pszParams);
+               return CFG_ERR_OK;
+       }
 
        return CFG_ERR_NOPROC;
 }
@@ -82,15 +101,22 @@ void  CApiAttIsr::WriteCfgDef(FILE* fp)
                "/*        interrupt control objects           */\n"
                "/* ------------------------------------------ */\n"
                , fp);
+
+       fprintf(
+                       fp,
+                       "\n"
+                       "const INTNO _kernel_min_intno = %d;\n"
+                       "const INTNO _kernel_max_intno = %d;\n",
+                       m_iMinIntNo, m_iMaxIntNo);
        
        // 割込み管理テーブル生成
-       if ( _KERNEL_IRCATR_TMAX_INHNO - _KERNEL_IRCATR_TMIN_INHNO + 1 > 0 )
+       if ( m_iMaxIntNo - m_iMinIntNo + 1 > 0 )
        {
                fprintf(
                        fp,
                        "\n"
                        "_KERNEL_T_INTINF _kernel_int_tbl[%d];\n\n",
-                       _KERNEL_IRCATR_TMAX_INHNO - _KERNEL_IRCATR_TMIN_INHNO + 1);
+                        m_iMaxIntNo - m_iMinIntNo + 1);
        }
 
        if ( m_iMaxId > 0 )
@@ -117,5 +143,5 @@ void  CApiAttIsr::WriteCfgIni(FILE* fp)
 
 
 // ---------------------------------------------------------------------------
-//  Copyright (C) 1998-2002 by Project HOS                                    
+//  Copyright (C) 1998-2006 by Project HOS                                    
 // ---------------------------------------------------------------------------
index 4af3288..4b7a513 100755 (executable)
@@ -76,9 +76,9 @@ void  CApiDefInh::WriteCfgDef(FILE* fp)
 #endif
                "_KERNEL_T_INHINF _kernel_inh_tbl[%d] =\n"
                "\t{\n",
-               KERNEL_TMAX_INH_INHNO - KERNEL_TMIN_INH_INHNO + 1);
+               _KERNEL_TMAX_INH_INHNO - _KERNEL_TMIN_INH_INHNO + 1);
        
-       for ( i = KERNEL_TMIN_INH_INHNO; i <= KERNEL_TMAX_INH_INHNO; i++ )
+       for ( i = _KERNEL_TMIN_INH_INHNO; i <= _KERNEL_TMAX_INH_INHNO; i++ )
        {
                for ( j = 0; j < m_iObjs; j++ )
                {
@@ -91,12 +91,6 @@ void  CApiDefInh::WriteCfgDef(FILE* fp)
                {
                        fprintf(fp, "\t\t{(FP)(%s)},\n", m_pParamPacks[j]->GetParam(DEFINH_INTHDR));
                }
-#if _KERNEL_SPT_ISR
-               else if ( i >= _KERNEL_IRCATR_TMIN_INHNO && i <= _KERNEL_IRCATR_TMAX_INHNO )
-               {
-                       fprintf(fp, "\t\t{(FP)_KERNEL_EXE_IRC},\n");
-               }
-#endif
                else
                {
                        fprintf(fp, "\t\t{(FP)NULL},\n");
index 96189e6..dc2fdf1 100755 (executable)
@@ -69,8 +69,8 @@ CFGRTR       = h4acfg-h8300ha
 
 
 # オプションフラグ
-AFLAGS    += -CP=300HA:24 -DEBug
-CFLAGS    += -CP=300HA:24 -DEBug -I=$(INC_KNL_DIR) -I=$(INC_PROC_DIR) -I=$(INC_IRC_DIR)
+AFLAGS    += -CP=300HA:24 -DEBug -NOLOGO
+CFLAGS    += -CP=300HA:24 -DEBug -NOLOGO -I=$(INC_KNL_DIR) -I=$(INC_PROC_DIR) -I=$(INC_IRC_DIR)
 LFLAGS    += -FOrm=Library
 LINTFLAGS += -weak -I$(INC_KNL_DIR) -I$(INC_PROC_DIR) -I$(INC_IRC_DIR)
 
index f073af6..fe75f2e 100755 (executable)
@@ -15,8 +15,8 @@
 #define _KERNEL_IRCATR_INC_PATH                                "arm/ADuC7019"
 
 
-#define _KERNEL_IRCATR_TMIN_INHNO                      1                       /**< %jp{割込みハンドラ番号の最小値} */
-#define _KERNEL_IRCATR_TMAX_INHNO                      23                      /**< %jp{割込みハンドラ番号の最大値} */
+#define _KERNEL_IRCATR_TMIN_INTNO                      1                       /**< %jp{割込み番号の最小値} */
+#define _KERNEL_IRCATR_TMAX_INTNO                      23                      /**< %jp{割込み番号の最大値} */
 
 
 #endif /* _KERNEL__arch__irc__ADuC7019__ircatr_h__ */
index dfd7046..4571d4c 100755 (executable)
@@ -14,6 +14,7 @@
 
 
 #define _KERNEL_INI_IRC()                      do {} while (0)         /**< %jp{IRCの初期化ハンドラ} */
+#define _KERNEL_EXE_IRC()                      do {} while (0)         /**< %jp{IRCの処理ハンドラ} */
 
 
 #endif /* _KERNEL__arch__irc_none_h__ */
index 22c5386..cb8d858 100755 (executable)
@@ -17,8 +17,8 @@
 
 #define _KERNEL_IRCATR_IRC                                     FALSE                   /**< %jp{IRCの有無} */
 
-#define _KERNEL_IRCATR_TMIN_INHNO                      0                               /**< %jp{割込みハンドラ番号の最小値} */
-#define _KERNEL_IRCATR_TMAX_INHNO                      0                               /**< %jp{割込みハンドラ番号の最大値} */
+#define _KERNEL_IRCATR_TMIN_INTNO                      0                               /**< %jp{割込みハンドラ番号の最小値} */
+#define _KERNEL_IRCATR_TMAX_INTNO                      0                               /**< %jp{割込みハンドラ番号の最大値} */
 
 
 #endif /* _KERNEL__arch__none__ircatr_h__ */
index a232343..e4f1ba4 100755 (executable)
 #define _KERNEL__arch__irc_none_h__
 
 
-#define _KERNEL_INI_IRC()                      do {} while (0)                         /**< %jp{IRCの初期化ハンドラ} */
-#define _KERNEL_EXE_IRC                                _kernel_exe_isr                         /**< %jp{IRCの処理ルーチン} */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void _kernel_exe_isr(INTNO intno);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#define _KERNEL_INI_IRC()                      do {} while (0)                                         /**< %jp{IRCの初期化ハンドラ} */
+#define _KERNEL_EXE_IRC(inhno)         _kernel_exe_isr((INTNO)(inhno))         /**< %jp{IRCの処理ルーチン} */
 
 
 #endif /* _KERNEL__arch__irc_none_h__ */
index efec94e..f7f6849 100755 (executable)
@@ -18,8 +18,8 @@
 
 #define _KERNEL_IRCATR_IRC                     TRUE                                                    /**< %jp{IRCの有無} */
 
-#define _KERNEL_IRCATR_TMIN_INHNO      _KERNEL_PROCATR_TMIN_INHNO              /**< %jp{割込みハンドラ番号の最小値} */
-#define _KERNEL_IRCATR_TMAX_INHNO      _KERNEL_PROCATR_TMAX_INHNO              /**< %jp{割込みハンドラ番号の最大値} */
+#define _KERNEL_IRCATR_TMIN_INTNO      _KERNEL_PROCATR_TMIN_INHNO              /**< %jp{割込みハンドラ番号の最小値} */
+#define _KERNEL_IRCATR_TMAX_INTNO      _KERNEL_PROCATR_TMAX_INHNO              /**< %jp{割込みハンドラ番号の最大値} */
 
 
 #endif /* _KERNEL__arch__simple__ircatr_h__ */
index 2fcaf8d..1a514d2 100755 (executable)
@@ -9,8 +9,8 @@
  */
 
 
-#ifndef _KERNEL__arch__proc__arm__arm_v4__proc_h__
-#define _KERNEL__arch__proc__arm__arm_v4__proc_h__
+#ifndef _KERNEL__arch__proc__mn1030__proc_h__
+#define _KERNEL__arch__proc__mn1030__proc_h__
 
 
 
@@ -26,15 +26,15 @@ typedef struct _kernel_t_ctxcb
 extern "C" {
 #endif
 
-void    _kernel_ini_arc(void);                                                                                                                                         /**< %jp{アーキテクチャ固有の初期化} */
+void    _kernel_ini_prc(void);                                                                                                                                         /**< %jp{プロセッサ固有の初期化} */
 
 void    _kernel_ena_int(void);                                                                                                                                         /**< %jp{割り込み許可} */
 void    _kernel_dis_int(void);                                                                                                                                         /**< %jp{割り込み禁止} */
 void    _kernel_wai_int(void);                                                                                                                                         /**< %jp{割り込み待ち(アイドル時の処理)} */
 
-void    _kernel_cre_ctx(_KERNEL_T_CTXCB *pk_ctxcb, VP isp, FP entry, VP_INT par1, VP_INT par2);                /**< %jp{実行コンテキストの作成} */
+void    _kernel_cre_ctx(UW par1, UW par2, _KERNEL_T_CTXCB *pk_ctxcb, VP isp, FP entry);                                /**< %jp{実行コンテキストの作成} */
 void    _kernel_del_ctx(_KERNEL_T_CTXCB *pk_ctxcb);                                                                                                    /**< %jp{実行コンテキストの削除} */
-void    _kernel_rst_ctx(VP_INT par1, VP_INT par2, FP entry, VP isp);                                                           /**< %jp{実行コンテキストのリスタート} */
+void    _kernel_rst_ctx(UW par1, UW par2, FP entry, VP isp);                                                                           /**< %jp{実行コンテキストのリスタート} */
 void    _kernel_sta_ctx(_KERNEL_T_CTXCB *pk_ctxcb);                                                                                                    /**< %jp{実行コンテキストの開始} */
 void    _kernel_swi_ctx(_KERNEL_T_CTXCB *pk_ctxinf_nxt, _KERNEL_T_CTXCB *pk_ctxcb_now);                                /**< %jp{実行コンテキストの切替} */
 
@@ -43,14 +43,14 @@ void    _kernel_swi_ctx(_KERNEL_T_CTXCB *pk_ctxinf_nxt, _KERNEL_T_CTXCB *pk_ctxc
 #endif
 
 
-#define _KERNEL_INI_PRC()      do {} while (0)
+#define _KERNEL_INI_PRC()      _kernel_ini_prc()                                                                                                               /**< %jp{プロセッサ固有の初期化} */
 
 #define _KERNEL_ENA_INT()      _kernel_ena_int()                                                                                                               /**< %jp{割り込み許可} */
 #define _KERNEL_DIS_INT()      _kernel_dis_int()                                                                                                               /**< %jp{割り込み禁止} */
 #define _KERNEL_WAI_INT()      _kernel_wai_int()                                                                                                               /**< %jp{割り込み待ち(アイドル時の処理)} */
 
-#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2)              \
-                                                                       _kernel_cre_ctx((pk_ctxcb), (isp), (entry), (exinf1), (exinf2))
+#define _KERNEL_CRE_CTX(pk_ctxcb, stksz, stk, isp, entry, par1, par2)                  \
+                                                                       _kernel_cre_ctx((UW)(par1), (UW)(par2), (pk_ctxcb), (isp), (entry))
 #define _KERNEL_DEL_CTX(pk_ctxcb)      _kernel_del_ctx(pk_ctxcb)
 #define _KERNEL_RST_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2)              \
                                                                        _kernel_rst_ctx((exinf1), (exinf2), (entry), (isp))
index 05cab32..af4a9dd 100755 (executable)
@@ -9,12 +9,12 @@
  */
 
 
-#ifndef _KERNEL__arch__proc__arm__arm_v4t__procatr_h__
-#define _KERNEL__arch__proc__arm__arm_v4t__procatr_h__
+#ifndef _KERNEL__arch__proc__mn1030__procatr_h__
+#define _KERNEL__arch__proc__mn1030__procatr_h__
 
 
 /* %jp{プロセッサアーキテクチャ定義のあるインクルードパス} */
-#define _KERNEL_PROCATR_INC_PATH                       "arm/arm_v4t"
+#define _KERNEL_PROCATR_INC_PATH                       "mn103/mn1030"
 
 
 /* %jp{プロセッサアーキテクチャに依存した属性} */
@@ -59,7 +59,7 @@
 
 
 
-#endif /* _KERNEL__arch__proc__arm__arm_v4t__procatr_h__ */
+#endif /* _KERNEL__arch__proc__mn1030__procatr_h__ */
 
 
 /* end of file */
index 27a1205..d8c26db 100755 (executable)
@@ -249,11 +249,23 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ
 
 /* Control block */
 #define _KERNEL_CFG_MPFCB_ALGORITHM            _KERNEL_MPFCB_ALG_BLKARRAY
-#define _KERNEL_CFG_MPFCB_SPLIT_RO             FALSE                           /**< %jp{TCBの不変部を分割してROM部配置とするか} */
+#define _KERNEL_CFG_MPFCB_SPLIT_RO             FALSE                           /**< %jp{MPFCBの不変部を分割してROM部配置とするか} */
 #define _KERNEL_CFG_MPFCB_BITFIELD             FALSE                           /**< %jp{ビットフィールドを利用してTCBを圧縮するか} */
 
 
 
+/* ---------------------------------------------- */
+/*  Interrupt Service Routines                    */
+/* ---------------------------------------------- */
+
+/* Control block */
+#define _KERNEL_CFG_ISRCB_ALGORITHM            _KERNEL_ISRCB_ALG_PTRARRAY
+#define _KERNEL_CFG_ISRCB_SPLIT_RO             FALSE                           /**< %jp{ISRCBの不変部を分割してROM部配置とするか} */
+#define _KERNEL_CFG_ISRCB_BITFIELD             FALSE                           /**< %jp{ビットフィールドを利用してTCBを圧縮するか} */
+
+
+
+
 /* ------------------------------------------------------------------ */
 /*  System Time Management                                            */
 /* ------------------------------------------------------------------ */
index 31c043d..a0fb7f4 100755 (executable)
@@ -22,16 +22,6 @@ typedef struct _kernel_t_dpccb
 } _KERNEL_T_DPCCB;
 
 
-#define _KERNEL_DPC_SET_MSGQ(dcpcb, x)         do { (dcpcb)->msgq = (x); } while (0)
-#define _KERNEL_DPC_GET_MSGQ(dcpcb)                    ((dcpcb)->msgq)
-#define _KERNEL_DPC_SET_MSGQSZ(dcpcb, x)       do { (dcpcb)->msgqsz = (x); } while (0)
-#define _KERNEL_DPC_GET_MSGQSZ(dcpcb)          ((dcpcb)->msgqsz)
-#define _KERNEL_DPC_SET_HEAD(dcpcb, x)         do { (dcpcb)->msgqsz = (x); } while (0)
-#define _KERNEL_DPC_GET_HEAD(dcpcb)                    ((dcpcb)->msgqsz)
-#define _KERNEL_DPC_SET_TAIL(dcpcb, x)         do { (dcpcb)->msgqsz = (x); } while (0)
-#define _KERNEL_DPC_GET_HEAD(dcpcb)                    ((dcpcb)->msgqsz)
-
-
 #ifdef __cplusplus
 extern "C" {
 #endif
index 9898daa..c775359 100755 (executable)
@@ -34,4 +34,15 @@ typedef struct _kernel_t_tcb *_KERNEL_T_TSKHDL;
 #endif
 
 
+
+/* ---------------------------------- */
+/*           Isr-Handle               */
+/* ---------------------------------- */
+
+struct _kernel_t_isrcb;
+typedef struct _kernel_t_isrcb *_KERNEL_T_ISRHDL;
+#define _KERNEL_ISRHDL_NULL            0
+
+
+
 #endif /* _KERNEL__core__objhdl_h__ */
index 244b1e4..92a2981 100755 (executable)
@@ -14,7 +14,6 @@
 #define _KERNEL__object__inhobj_h__
 
 
-
 /* %jp{割込みハンドラ情報} */
 typedef struct _kernel_t_inhinf
 {
@@ -24,12 +23,12 @@ typedef struct _kernel_t_inhinf
 
 /** %jp{割込みハンドラ情報テーブル} */
 #if _KERNEL_SPT_DEF_INH
-extern       _KERNEL_T_INHINF  _kernel_inh_tbl[KERNEL_TMAX_INH_INHNO - KERNEL_TMIN_INH_INHNO + 1];
+extern       _KERNEL_T_INHINF  _kernel_inh_tbl[_KERNEL_TMAX_INH_INHNO - _KERNEL_TMIN_INH_INHNO + 1];
 #else
-extern const _KERNEL_T_INHINF  _kernel_inh_tbl[KERNEL_TMAX_INH_INHNO - KERNEL_TMIN_INH_INHNO + 1];
+extern const _KERNEL_T_INHINF  _kernel_inh_tbl[_KERNEL_TMAX_INH_INHNO - _KERNEL_TMIN_INH_INHNO + 1];
 #endif
 
-#define _KERNEL_INT_GET_INHINF(inhno)          (&_kernel_inh_tbl[inhno - KERNEL_TMIN_INH_INHNO])
+#define _KERNEL_INT_GET_INHINF(inhno)          (&_kernel_inh_tbl[inhno - _KERNEL_TMIN_INH_INHNO])
 
 #define _KERNEL_INH_GET_INTHDR(inhno)          (_KERNEL_INT_GET_INHINF(inhno)->inthdr);
 #define _KERNEL_INH_SET_INTHDR(inhno, x)       do { _KERNEL_INT_GET_INHINF(inhno)->inthdr = (x); } while(0)
index 5b94be7..de4d3b9 100755 (executable)
 #define _KERNEL__object__isrobj_h__
 
 
-typedef struct _kernel_t_isrcb*        _KERNEL_T_ISRHDL;
 
+/* ------------------------------------------ */
+/*  Interrupt manegement                      */
+/* ------------------------------------------ */
+
+struct _kernel_t_isrcb;
 
 /* %jp{割込み情報} */
 typedef struct _kernel_t_intinf
 {
-       _KERNEL_T_ISRHDL head;
+       _KERNEL_T_ISRHDL                        head;
 } _KERNEL_T_INTINF;
 
-
 /** %jp{割込み情報テーブル} */
 #if _KERNEL_SPT_CRE_ISR || _KERNEL_SPT_ACRE_ISR
-extern       _KERNEL_T_INTINF  _kernel_int_tbl[_KERNEL_IRCATR_TMAX_INHNO - _KERNEL_IRCATR_TMIN_INHNO + 1];
+extern       _KERNEL_T_INTINF  _kernel_int_tbl[];
 #else
-extern const _KERNEL_T_INTINF  _kernel_int_tbl[_KERNEL_IRCATR_TMAX_INHNO - _KERNEL_IRCATR_TMIN_INHNO + 1];
+extern const _KERNEL_T_INTINF  _kernel_int_tbl[];
 #endif
 
-#define _KERNEL_INT_GET_INTINF(intno)          (&_kernel_int_tbl[intno - _KERNEL_IRCATR_TMIN_INHNO])
+extern const INTNO _kernel_min_intno;                  /**< %jp{割り込み番号の最小値} */
+extern const INTNO _kernel_max_intno;                  /**< %jp{割り込み番号の最大値} */
+
+#define _KERNEL_INT_TMIN_INTNO                                 (_kernel_min_intno)
+#define _KERNEL_INT_TMAX_INTNO                                 (_kernel_max_intno)
+
+#define _KERNEL_INT_GET_INTINF(intno)                  (&_kernel_int_tbl[(intno) - _KERNEL_INT_TMIN_INTNO])
+#define _KERNEL_INT_GET_HEAD(intno)                            (_KERNEL_INT_GET_INTINF(intno)->head)
+#define _KERNEL_INT_SET_HEAD(intno, x)                 do { _KERNEL_INT_GET_INTINF(intno)->head = (x); } while (0)
+
+
+
+/* ------------------------------------------ */
+/*  Primitive type definition                 */
+/* ------------------------------------------ */
+
+/* %jp{ISRのハンドルの型} */
+typedef _KERNEL_T_ISRHDL                               _KERNEL_ISR_T_ISRHDL;
+typedef _KERNEL_T_ISRHDL                               _KERNEL_ISRCB_T_ISRHDL;
+#define _KERNEL_ISRCB_TBITDEF_ISRHDL
+
+/* %jp{拡張情報の型} */
+typedef VP_INT                                                 _KERNEL_ISR_T_EXINF;
+typedef VP_INT                                                 _KERNEL_ISRCB_T_EXINF;
+#define _KERNEL_ISRCB_TBITDEF_EXINF
+
+/* %jp{割り込みサービスルーチンの開始番地の型} */
+typedef void (*_KERNEL_ISR_T_ISR)(VP_INT exinf);
+typedef void (*_KERNEL_ISRCB_T_ISR)(VP_INT exinf);
+#define _KERNEL_ISRCB_TBITDEF_ISR
+
+
+/* ------------------------------------------ */
+/*  Control block                             */
+/* ------------------------------------------ */
+
+#if _KERNEL_ISRCB_SPLIT_RO
+
 
-#define _KERNEL_INT_GET_HEAD(intno)                    (_KERNEL_INT_GET_INTINF(intno)->head)
-#define _KERNEL_INT_SET_HEAD(intno, x)         do { _KERNEL_INT_GET_INTINF(intno)->head = (x); } while (0)
+/* %jp{割込みサービスルーチンコントロールブロック(リードオンリー部)} */
+typedef struct _kernel_t_isrcb_ro
+{
+       _KERNEL_ISRCB_T_EXINF   exinf           _KERNEL_ISRCB_TBITDEF_EXINF;            /**< %jp{割込みサービスルーチンの拡張情報} */
+       _KERNEL_ISRCB_T_ISR             isr                     _KERNEL_ISRCB_TBITDEF_ISR;                      /**< %jp{割込みサービスルーチンの起動番地} */
+} _KERNEL_T_ISRCB_RO;
 
+typedef const _KERNEL_T_ISRCB_RO       *_KERNEL_T_ISRCB_RO_PTR;
 
 
-/* %jp{割込みサービスルーチン制御ブロック} */
+/* %jp{割込みサービスルーチンコントロールブロック} */
 typedef struct _kernel_t_isrcb
 {
-       VP_INT           exinf;                                         /**< %jp{割込みサービスルーチンの拡張情報} */
-       FP               isr;                                           /**< %jp{割込みサービスルーチンの起動番地} */
-       _KERNEL_T_ISRHDL next;
+       _KERNEL_ISRCB_T_ISRHDL  next            _KERNEL_ISRCB_TBITDEF_ISRHDL;           
+
+#if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
+       _KERNEL_T_ISRCB_RO_PTR  isrcb_ro;                                                                               /**< %jp{割込みサービスルーチンコントロールブロックRO部へのポインタ} */
+#endif
 } _KERNEL_T_ISRCB;
 
+typedef _KERNEL_T_ISRCB                                *_KERNEL_T_ISRCB_PTR;
 
-/* 割り込みサービスルーチン */
-extern _KERNEL_T_ISRCB  *_kernel_isrcb_tbl[];  /* 割込みサービスルーチンコントロールブロックテーブル */
-extern const ID                        _kernel_max_isrid;              /* 割込みサービスルーチンコントロールブロックの個数 */
+#else
 
 
-#define _KERNEL_TMIN_ISR_ISRID                                 1
-#define _KERNEL_TMAX_ISR_ISRID                                 (_kernel_max_isrid)
+/* %jp{割込みサービスルーチンコントロールブロック} */
+typedef struct _kernel_t_isrcb
+{
+       _KERNEL_ISRCB_T_ISRHDL  next            _KERNEL_ISRCB_TBITDEF_ISRHDL;           /**< %jp{次の割込みサービスルーチンコントロールブロックへのリンク */
+       _KERNEL_ISRCB_T_EXINF   exinf           _KERNEL_ISRCB_TBITDEF_EXINF;            /**< %jp{割込みサービスルーチンの拡張情報} */
+       _KERNEL_ISRCB_T_ISR             isr                     _KERNEL_ISRCB_TBITDEF_ISR;                      /**< %jp{割込みサービスルーチンの起動番地} */
+} _KERNEL_T_ISRCB;
 
+typedef _KERNEL_T_ISRCB                                _KERNEL_T_ISRCB_RO;
+typedef const _KERNEL_T_ISRCB_RO       *_KERNEL_T_ISRCB_RO_PTR;
+typedef _KERNEL_T_ISRCB                                *_KERNEL_T_ISRCB_PTR;
 
-#define _KERNEL_ISR_ID2ISRCB(isrid)                            (_kernel_isrcb_tbl[(isrid) - _KERNEL_TMIN_ISR_ISRID])
-#define _KERNEL_ISR_ID2ISRHDL(isrid)                   (_kernel_isrcb_tbl[(isrid) - _KERNEL_TMIN_ISR_ISRID])
 
-#define _KERNEL_ISR_ISRPTR2ISRCB(isrhdl)               (isrhdl)
-#define _KERNEL_ISR_CHECK_EXS(isrid)                   (_kernel_isrcb_tbl[(isrid) - _KERNEL_TMIN_ISR_ISRID] != NULL)
+#endif
 
 
-#define _KERNEL_ISR_GET_EXINF(isrhdl)                  (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->exinf)
-#define _KERNEL_ISR_SET_EXINF(isrhdl, x)               do { (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->exinf) = (x); } while (0)
 
-#define _KERNEL_ISR_GET_ISR(isrhdl)                            (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->isr)
-#define _KERNEL_ISR_SET_ISR(isrhdl, x)                 do { (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->isr) = (x); } while (0)
+/* ------------------------------------------ */
+/*  ID range                                  */
+/* ------------------------------------------ */
 
-#define _KERNEL_ISR_GET_NEXT(isrhdl)                   (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->next)
-#define _KERNEL_ISR_SET_NEXT(isrhdl, x)                        do { (_KERNEL_ISR_ISRPTR2ISRCB(isrhdl)->next) = (x); } while (0)
+extern const ID                                                        _kernel_max_isrid;                                      /* %jp{割込みサービスルーチンIDの最大値} */
 
+#define _KERNEL_ISR_TMIN_ID                            (1)                                                                     /**< %jp{割込みサービスルーチンIDの最小値} */
+#define _KERNEL_ISR_TMAX_ID                            (_kernel_max_isrid)                                     /**< %jp{割込みサービスルーチンIDの最大値} */
 
+#define _KERNEL_ISR_CHECK_ISRID(isrid) ((isrid) >= _KERNEL_ISR_TMIN_ID && (isrid) <= _KERNEL_ISR_TMAX_ID)
+                                                                                                                                                       /**< %jp{ID範囲チェック} */
 
 
 /* ------------------------------------------ */
-/*                関数宣言                    */
+/*  Control block tables                      */
 /* ------------------------------------------ */
 
+#if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY
+#if _KERNEL_ISRCB_SPLIT_RO
+
+/* %jp{ブロック配列管理でRO分離の場合}%en{block array} */
+extern  _KERNEL_T_ISRCB                                        _kernel_isrcb_tbl[];                                                                    /**< %jp{割り込みサービスルーチンコントロールブロックテーブル} */
+extern const _KERNEL_T_ISRCB_RO                        _kernel_isrcb_ro_tbl[];                                                                 /**< %jp{割り込みサービスルーチンコントロールブロック(リードオンリー部)テーブル} */
+#define _KERNEL_ISR_ID2ISRCB(isrid)            (&_kernel_isrcb_tbl[(isrid) - _KERNEL_ISR_TMIN_ID])             /**< %jp{コントロールブロックの取得} */
+#define _KERNEL_ISR_CHECK_EXS(isrid)   (_kernel_isrcb_ro_tbl[(isrid) - _KERNEL_ISR_TMIN_ID].isr != NULL)
+                                                                                                                                                                                               /**< %jp{オブジェクトの存在チェック} */
+
+#else
+
+/* %jp{ブロック配列管理の場合}%en{block array} */
+extern  _KERNEL_T_ISRCB                                        _kernel_isrcb_tbl[];                                                                    /**< %jp{割り込みサービスルーチンコントロールブロックテーブル} */
+#define _KERNEL_ISR_ID2ISRCB(isrid)            (&_kernel_isrcb_tbl[(isrid) - _KERNEL_ISR_TMIN_ID])             /**< %jp{コントロールブロックの取得} */
+#define _KERNEL_ISR_CHECK_EXS(isrid)   (_kernel_isrcb_tbl[(isrid) - _KERNEL_ISR_TMIN_ID].isr  != NULL)                         
+                                                                                                                                                                                               /**< %jp{オブジェクトの存在チェック} */
+
+#endif
+
+#elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
+
+/* %jp{ポインタ配列管理の場合}%en{pointer array} */
+extern  _KERNEL_T_ISRCB                                        *_kernel_isrcb_tbl[];                                                                   /**< %jp{割り込みサービスルーチンコントロールブロックテーブル} */
+#define _KERNEL_ISR_ID2ISRCB(isrid)            (_kernel_isrcb_tbl[(isrid) - _KERNEL_ISR_TMIN_ID])              /**< %jp{割り込みサービスルーチンIDからISRCB アドレスを取得} */
+#define _KERNEL_ISR_CHECK_EXS(isrid)   (_KERNEL_ISR_ID2ISRCB(isrid) != NULL)                                   /**< %jp{オブジェクトの存在チェック} */
+
+#endif
+
+
+
+/* ------------------------------------------ */
+/*  Convert Handle                            */
+/* ------------------------------------------ */
+
+#if _KERNEL_ISRHDL_ID          /* %en{ISRHDL is ID}%jp{タスクポインタにIDを使う} */
+
+#define _KERNEL_ISR_ID2ISRHDL(isrid)                   (isrid)
+#define _KERNEL_ISR_ISRHDL2ID(isrhdl)                  (isrhdl)
+#define _KERNEL_ISR_ISRCB2ISRHDL(isrcb)                        _KERNEL_ISR_ISRCB2ID(isrcb)
+#define _KERNEL_ISR_ISRHDL2ISRCB(isrhdl)               _KERNEL_ISR_ID2ISRCB(isrhdl)
+#define _KERNEL_ISR_GET_ISRHDL(isrid, isrcb)   (isrid)
+
+#else                                          /* %en{ISRHDL is address of ISRCB}%jp{タスクポインタにISRCBのアドレスを使う} */
+
+#define _KERNEL_ISR_ID2ISRHDL(isrid)                   _KERNEL_ISR_ID2ISRCB(isrid)
+#define _KERNEL_ISR_ISRHDL2ID(isrhdl)                  _KERNEL_ISR_ISRCB2ID(isrhdl)
+#define _KERNEL_ISR_ISRCB2ISRHDL(isrhcb)               (isrhcb)
+#define _KERNEL_ISR_ISRHDL2ISRCB(isrhdl)               (isrhdl)
+#define _KERNEL_ISR_GET_ISRHDL(isrid, isrcb)   (isrcb)
+
+#endif
+
+
+
+/* ------------------------------------------ */
+/*   Accessor for ISRCB                       */
+/* ------------------------------------------ */
+
+/* isrcb_ro */
+#if !_KERNEL_ISRCB_SPLIT_RO                                                            
+#define _KERNEL_ISR_GET_ISRCB_RO(isrid, isrcb) (isrcb)
+#else
+#if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY              /* %jp{ISRCBを単純配列で管理}%en{array of block} */
+#define _KERNEL_ISR_GET_ISRCB_RO(isrid, isrcb) (&_kernel_isrcb_ro_tbl[(isrid)])
+#elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY            /* %jp{ISRCBをポインタ配列で管理}%en{array of pointer} */
+#define _KERNEL_ISR_GET_ISRCB_RO(isrid, isrcb) ((isrcb)->isrcb_ro)
+#endif
+#endif
+
+#define _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl)     _KERNEL_ISR_GET_ISRCB_RO(_KERNEL_ISR_ISRHDL2ID(isrhdl), _KERNEL_ISR_ISRHDL2ISRCB(isrhdl))
+
+
+#define _KERNEL_ISR_SET_NEXT(isrcb, x)         do { (isrcb)->next = (_KERNEL_ISRCB_T_ISRHDL)(x); } while (0)
+#define _KERNEL_ISR_GET_NEXT(isrcb)                    ((_KERNEL_ISR_T_ISRHDL)(isrcb)->next)
+
+
+#define _KERNEL_ISR_SET_EXINF(isrcb_ro, x)     do { (isrcb_ro)->exinf = (_KERNEL_ISRCB_T_EXINF)(x); } while (0)
+#define _KERNEL_ISR_GET_EXINF(isrcb_ro)                ((_KERNEL_ISR_T_EXINF)(isrcb_ro)->exinf)
+
+#define _KERNEL_ISR_SET_ISR(isrcb_ro, x)       do { (isrcb_ro)->isr = (_KERNEL_ISRCB_T_ISR)(x); } while (0)
+#define _KERNEL_ISR_GET_ISR(isrcb_ro)          ((_KERNEL_ISRCB_T_ISR)(isrcb_ro)->isr)
+
+
+
+/* ------------------------------------------ */
+/*   Functions                                */
+/* ------------------------------------------ */
 
 #ifdef __cplusplus
 extern "C" {
index 6cbff73..d400cd1 100755 (executable)
@@ -196,7 +196,7 @@ extern  _KERNEL_T_SEMCB                                     _kernel_semcb_tbl[];                                                                    /**< %jp{セマフォ
 
 /* %jp{ポインタ配列管理の場合}%en{pointer array} */
 extern  _KERNEL_T_SEMCB                                        *_kernel_semcb_tbl[];                                                                   /**< %jp{セマフォコントロールブロックテーブル} */
-#define _KERNEL_SEM_ID2SEMCB(semid)            (_kernel_semcb_tbl[(semid) - _KERNEL_TMIN_SEMID])               /**< %jp{セマフォIDからSEMCB アドレスを取得} */
+#define _KERNEL_SEM_ID2SEMCB(semid)            (_kernel_semcb_tbl[(semid) - _KERNEL_SEM_TMIN_ID])              /**< %jp{セマフォIDからSEMCB アドレスを取得} */
 #define _KERNEL_SEM_CHECK_EXS(semid)   (_KERNEL_SEM_ID2SEMCB(semid) != NULL)                                   /**< %jp{オブジェクトの存在チェック} */
 
 #endif
index acb2ecb..944e718 100755 (executable)
@@ -720,7 +720,6 @@ extern  _KERNEL_T_TCB                                       *_kernel_tcb_tbl[];                                                                             /**< %jp{タスクコン
 
 
 
-
 /* ------------------------------------------ */
 /*  Convert Handle                            */
 /* ------------------------------------------ */
@@ -744,6 +743,7 @@ extern  _KERNEL_T_TCB                                       *_kernel_tcb_tbl[];                                                                             /**< %jp{タスクコン
 #endif
 
 
+
 /* ------------------------------------------ */
 /*   Accessor for TCB                         */
 /* ------------------------------------------ */
index 6edda0b..8799dd5 100755 (executable)
 #define _KERNEL_SPT_ALM                                FALSE
 #define _KERNEL_SPT_OVR                                FALSE
 
+/* %jp{割込みハンドラサポートの判定} */
+#if _KERNEL_SPT_DEF_INH || _KERNEL_SPT_SDEF_INH
+#define _KERNEL_SPT_INH                                TRUE
+#else
+#define _KERNEL_SPT_INH                                FALSE
+#endif
 
 /* %jp{割込みサービスルーチンサポートの判定} */
 #if _KERNEL_IRCATR_IRC && (_KERNEL_SPT_CRE_ISR || _KERNEL_SPT_SCRE_ISR) && (_KERNEL_CFG_TMAX_ISRID) > 0
 /*  inh                                                               */
 /* ------------------------------------------------------------------ */
 
-#define KERNEL_TMIN_INH_INHNO          _KERNEL_PROCATR_TMIN_INHNO
-#define KERNEL_TMAX_INH_INHNO          _KERNEL_PROCATR_TMAX_INHNO
+#define _KERNEL_TMIN_INH_INHNO         _KERNEL_PROCATR_TMIN_INHNO
+#define _KERNEL_TMAX_INH_INHNO         _KERNEL_PROCATR_TMAX_INHNO
 
+#if 0
 #define KERNEL_TMIN_ISR_INTNO          _KERNEL_IRCATR_TMIN_INHNO
 #define KERNEL_TMAX_ISR_INTNO          _KERNEL_IRCATR_TMAX_INHNO
+#endif
+
+
+
+/* ---------------------------------------------- */
+/*  Interrupt Service Routines                    */
+/* ---------------------------------------------- */
+
+#define _KERNEL_ISRCB_ALG_BLKARRAY     1
+#define _KERNEL_ISRCB_ALG_PTRARRAY     2
+
+/* Control block */
+#define _KERNEL_ISRCB_ALGORITHM                _KERNEL_CFG_ISRCB_ALGORITHM
+#define _KERNEL_ISRCB_BITFIELD         _KERNEL_CFG_ISRCB_BITFIELD
+
+/* %jp{ブロック配列で動的生成がある場合はRO分離は不可} */
+#if (_KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY) && (_KERNEL_SPT_CRE_ISR || _KERNEL_SPT_ACRE_ISR)
+#define _KERNEL_ISRCB_SPLIT_RO         FALSE
+#else
+#define _KERNEL_ISRCB_SPLIT_RO         _KERNEL_CFG_MBXCB_SPLIT_RO
+#endif
 
+#define _KERNEL_ISRCB_NEXT                     TRUE
+#define _KERNEL_ISRCB_EXINF                    TRUE
+#define _KERNEL_ISRCB_ISR                      TRUE
 
 
 #endif /* _KERNEL__parser__parsknl_h__ */
index 0c9ed93..8ecac3a 100755 (executable)
@@ -1,3 +1,14 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  rcv_adtq.c
+ * @brief %jp{非同期データキュー受信}%en{Receive from Asynchronous Data Queue}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
 #include "core/core.h"
 #include "core/adtq.h"
 
@@ -19,11 +30,14 @@ BOOL _kernel_adtq_rcv_dat(_KERNEL_T_ADTQCB *adtqcb, VP_INT *p_data)
 
        /* %jp{データ取り出し} */
        adtq = _KERNEL_ADTQ_GET_ADTQ(adtqcb);
-       *p_data = adtq[tail];
+       *p_data = adtq[head];
 
        /* %jp{次の末尾位置計算} */
-       head++;
-       if ( head >= _KERNEL_ADTQ_GET_ADTQCNT(adtqcb) )
+       if ( head < _KERNEL_ADTQ_GET_ADTQCNT(adtqcb) - 1 )
+       {
+               head++;
+       }
+       else
        {
                head = 0;
        }
@@ -32,3 +46,5 @@ BOOL _kernel_adtq_rcv_dat(_KERNEL_T_ADTQCB *adtqcb, VP_INT *p_data)
        _KERNEL_ADTQ_SET_HEAD(adtqcb, head);
 }
 
+
+/* end of file */
index 42dd03c..101d0eb 100755 (executable)
@@ -1,3 +1,14 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  rcv_adtq.c
+ * @brief %jp{非同期データキュー 送信可能データ個数参照}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
 #include "core/core.h"
 #include "core/adtq.h"
 
@@ -22,3 +33,5 @@ _KERNEL_ADTQ_T_ADTQCNT _kernel_adtq_ref_fdtqnt(_KERNEL_T_ADTQCB *adtqcb)
 }
 
 
+/* end of file */
+
index 6ee8ecc..0f764c4 100755 (executable)
@@ -1,3 +1,14 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  rcv_adtq.c
+ * @brief %jp{非同期データキュー 送信済みデータ個数参照}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
 #include "core/core.h"
 #include "core/adtq.h"
 
@@ -20,3 +31,5 @@ _KERNEL_ADTQ_T_ADTQCNT _kernel_adtq_ref_sdtqnt(_KERNEL_T_ADTQCB *adtqcb)
        }
 }
 
+
+/* end of file */
index 7508593..0395a3c 100755 (executable)
@@ -1,3 +1,14 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  rcv_adtq.c
+ * @brief %jp{非同期データキュー送信}%en{Send to Asynchronous Data Queue}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
 #include "core/core.h"
 #include "core/adtq.h"
 
@@ -35,3 +46,5 @@ BOOL _kernel_adtq_snd_dat(_KERNEL_T_ADTQCB *adtqcb, VP_INT data)
 }
 
 
+/* end of file */
+
index 208c50d..4b4b259 100755 (executable)
 #include "object/inhobj.h"
 
 
-
 /* %jp{割り込みハンドラの処理} */
 void _kernel_exe_inh(INHNO inhno)
 {
-       const _KERNEL_T_INHINF *pk_inhinf;
+       _KERNEL_ENA_INT();                      /* %jp{多重割込み許可} */
+
+       /* %jp{割り込みハンドラの処理} */
+#if _KERNEL_SPT_INH
+       {
+               const _KERNEL_T_INHINF *pk_inhinf;
        
-       pk_inhinf = _KERNEL_INT_GET_INHINF(inhno);
+               pk_inhinf = _KERNEL_INT_GET_INHINF(inhno);
        
-       if ( pk_inhinf->inthdr != NULL )
-       {
-               _KERNEL_ENA_INT();                      /* %jp{多重割込み許可} */
-               pk_inhinf->inthdr(inhno);       /* %jp{割込みハンドラの処理} */
-               _KERNEL_DIS_INT();                      /* %jp{割込み禁止} */
+               if ( pk_inhinf->inthdr != NULL )
+               {
+                       pk_inhinf->inthdr(inhno);       /* %jp{割込みハンドラの処理} */
+               }
        }
-}
+#endif
+
+       /* %jp{割り込みコントローラの処理} */
+#if _KERNEL_SPT_ISR
+       _KERNEL_EXE_IRC(inhno);
+#endif
 
+       _KERNEL_DIS_INT();                      /* %jp{割込み禁止} */
+}
 
 
 /* end of file */
index a39c723..d9ce0ae 100755 (executable)
@@ -27,14 +27,14 @@ ER_ID acre_isr(const T_CISR *pk_cisr)
        _KERNEL_ENTER_SVC();            /* %jp{サービスコールに入る}%en{enter service-call} */
        
        /* %jp{空きID探索} */
-       for ( isrid = _KERNEL_TMAX_ISR_ISRID; isrid >= _KERNEL_TMIN_ISR_ISRID; isrid-- )
+       for ( isrid = _KERNEL_ISR_TMAX_ID; isrid >= _KERNEL_ISR_TMIN_ID; isrid-- )
        {
                if ( !_KERNEL_ISR_CHECK_EXS(isrid) )
                {
                        break;
                }
        }
-       if ( isrid <= _KERNEL_TMIN_ISR_ISRID )
+       if ( isrid <= _KERNEL_ISR_TMIN_ID )
        {
                _KERNEL_LEAVE_SVC();            /* %jp{サービスコールから出る}%en{leave service-call} */
                return E_NOID;                          /* %jp{ID番号不足} */
index 7d26c4b..d651878 100755 (executable)
 /* %jp{割り込みの処理} */
 void _kernel_exe_isr(INTNO intno)
 {
-       _KERNEL_T_ISRHDL isrhdl;
+       _KERNEL_T_ISRCB_RO_PTR isrcb_ro;
+       _KERNEL_T_ISRCB_PTR    isrcb;
+       _KERNEL_T_ISRHDL       isrhdl;
        
-       isrhdl = _KERNEL_INT_GET_HEAD(intno);
-       while ( isrhdl != NULL )
+       isrhdl   = _KERNEL_INT_GET_HEAD(intno);
+       isrcb    = _KERNEL_ISR_ISRHDL2ISRCB(isrhdl);
+       isrcb_ro = _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl);
+
+       while ( isrhdl != _KERNEL_ISRHDL_NULL )
        {
-               _KERNEL_ISR_GET_ISR(isrhdl)(_KERNEL_ISR_GET_EXINF(isrhdl));
+               _KERNEL_ISR_GET_ISR(isrcb_ro)(_KERNEL_ISR_GET_EXINF(isrcb_ro));
                
-               isrhdl = _KERNEL_ISR_GET_NEXT(isrhdl);
+               isrhdl = _KERNEL_ISR_GET_NEXT(isrcb);
        }
-       
-       _kernel_dis_int();
 }
 
 #endif
index 4b69f10..211b7b2 100755 (executable)
 
 
 
-/** %jp{セマフォの生成}%en{Create Semaphore}
- * @param  pk_ctsk     %jp{セマフォ生成情報}%en{}
- * @return Error code or task ID
- */
+
 ER _kernel_cre_isr(ID isrid, const T_CISR *pk_cisr)
 {
-       _KERNEL_T_ISRHDL isrhdl;
-
+       _KERNEL_T_ISRCB    *isrcb;
+       _KERNEL_T_ISRCB_RO *isrcb_ro;
+       
+       /* %jp{メモリ確保}%en{get memory} */
+#if _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_BLKARRAY
+       {
+               isrcb    = _KERNEL_ISR_ID2ISRCB(isrid);
+               isrcb_ro = isrcb;
+       }
+#elif _KERNEL_ISRCB_ALGORITHM == _KERNEL_ISRCB_ALG_PTRARRAY
+#if _KERNEL_ISRCB_SPLIT_RO
        {
-               VP mem;
+               /* %jp{ISRCB領域がポインタ管理で、ROM/RAM分離の場合} */
+               VP   mem;
+               SIZE memsz;
 
+               /* %jp{メモリサイズ決定} */
+               memsz = _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB))
+                                       + _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB_RO));
+
+               /* %jp{メモリ確保} */
+               mem = _KERNEL_SYS_ALC_MEM(memsz);
+
+               /* %jp{メモリ不足チェック} */
+#if _KERNEL_SPT_KCRE_ISR_E_NOMEM
+               if ( mem == NULL )
+               {
+                       return E_NOMEM;
+               }
+#endif
+               
+               /* %jp{メモリ割り当て} */
+               isrcb    = (_KERNEL_T_ISRCB *)mem;
+               isrcb_ro = (_KERNEL_T_ISRCB_RO *)((VB *)mem + _KERNEL_SYS_ALG_MEM(sizeof(_KERNEL_T_ISRCB)));
+               _KERNEL_ISR_ID2ISRCB(isrid)           = isrcb;
+               _KERNEL_ISR_ID2ISRCB(isrid)->isrcb_ro = (const _KERNEL_T_ISRCB_RO *)isrcb_ro;
+       }
+#else
+       {
+               VP   mem;
+               
+               /* %jp{メモリ確保} */
                mem = _KERNEL_SYS_ALC_MEM(sizeof(_KERNEL_T_ISRCB));
+
+               /* %jp{メモリ不足チェック} */
+#if _KERNEL_SPT_KCRE_ISR_E_NOMEM
                if ( mem == NULL )
                {
                        return E_NOMEM;
                }
+#endif
 
-               _KERNEL_ISR_ID2ISRCB(isrid) = (_KERNEL_T_ISRCB *)mem;
+               /* %jp{メモリ割り当て} */
+               isrcb    = (_KERNEL_T_ISRCB *)mem;
+               isrcb_ro = (_KERNEL_T_ISRCB_RO *)mem;
+               _KERNEL_ISR_ID2ISRCB(isrid) = isrcb;
        }
+#endif
+#endif
+
+       /* %jp{メンバ初期化} */
+       _KERNEL_ISR_SET_EXINF(isrcb_ro, pk_cisr->exinf);
+       _KERNEL_ISR_SET_ISR(isrcb_ro, pk_cisr->isr);
+
+
+#if _KERNEL_SPT_DPC
+       _KERNEL_DIS_INT();                                                                              /* %jp{割込み禁止} */
+#endif
 
-       isrhdl = _KERNEL_ISR_ID2ISRHDL(isrid);
-       
-       /* %jp{メンバの設定} */
-       _KERNEL_ISR_SET_EXINF(isrhdl, pk_cisr->exinf);
-       _KERNEL_ISR_SET_ISR(isrhdl, pk_cisr->isr);
-       
        /* %jp{割り込みリストの先頭に繋ぐ} */
-       _KERNEL_ISR_SET_NEXT(isrhdl, _KERNEL_INT_GET_HEAD(pk_cisr->intno));
-       _KERNEL_INT_SET_HEAD(pk_cisr->intno, isrhdl);
+       _KERNEL_ISR_SET_NEXT(isrcb, _KERNEL_INT_GET_HEAD(pk_cisr->intno));
+       _KERNEL_INT_SET_HEAD(pk_cisr->intno, _KERNEL_ISR_GET_ISRHDL(isrid, isrcb));
+       
+#if _KERNEL_SPT_DPC
+       if ( !_KERNEL_SYS_SNS_LOC() ) { _KERNEL_DIS_INT(); }    /* %jp{割込み許可} */
+#endif
        
        return E_OK;
 }