OSDN Git Service

(none)
authorryuz <ryuz>
Wed, 17 Jan 2007 15:00:33 +0000 (15:00 +0000)
committerryuz <ryuz>
Wed, 17 Jan 2007 15:00:33 +0000 (15:00 +0000)
19 files changed:
cfgrtr/include/crecyc.h
cfgrtr/source/crecyc.cpp
cfgrtr/source/hos4cfg.cpp
kernel/build/8080/z80/sdcc/gmake.mak [new file with mode: 0755]
kernel/build/common/gmake/sdcc_def.inc [new file with mode: 0755]
kernel/build/common/gmake/sdcc_rul.inc [new file with mode: 0755]
kernel/build/win/win32/vc60/hosv4a.dsp
kernel/cfgrtr/source/calcexp.cpp
kernel/cfgrtr/source/h4acfg.cpp
kernel/include/arch/proc/8080/z80/proc.h [new file with mode: 0755]
kernel/include/arch/proc/8080/z80/procatr.h [new file with mode: 0755]
kernel/include/core/cmpl.h
kernel/include/object/timobj.h [deleted file]
kernel/source/object/cyc/acre_cyc.c [new file with mode: 0755]
kernel/source/object/cyc/cre_cyc.c [new file with mode: 0755]
kernel/source/object/inh/exe_inh.c
kernel/source/object/tsk/sta_tsk.c [new file with mode: 0755]
sample/win/win32/sample.c
sample/win/win32/system.cfg

index c9ddefb..4301cf6 100755 (executable)
@@ -27,6 +27,10 @@ public:
        void  WriteCfgDef(FILE* fp);                            // cfgファイル定義部書き出し
        void  WriteCfgIni(FILE* fp);                            // cfgファイル初期化部書き出し
        void  WriteCfgStart(FILE* fp);                          // cfgファイル起動部書き出し
+
+protected:
+       void  WriteCyccbRam(FILE *fp, int iObj);        // CYCCB情報書き出し(RAM部)
+       void  WriteCyccbRom(FILE *fp, int iObj);        // CYCCB情報書き出し(ROM部)
 };
 
 
index dbd5fa5..acec918 100755 (executable)
@@ -48,7 +48,7 @@ int CApiCreCyc::AnalyzeApi(const char* pszApiName, const char* pszParams)
        {
                return AddParams(pszParams);
        }
-       else if ( strcmp(pszApiName, "HOS_MAX_CYCID") == 0 )
+       else if ( strcmp(pszApiName, "KERNEL_MAX_CYCID") == 0 )
        {
                int iId;
 
@@ -57,11 +57,6 @@ int CApiCreCyc::AnalyzeApi(const char* pszApiName, const char* pszParams)
                        return CFG_ERR_MULTIDEF;
                }
 
-               if ( m_iResObj > 0 )
-               {
-                       return CFG_ERR_DEF_CONFLICT;
-               }
-
                if ( (iId = atoi(pszParams)) <= 0 )
                {
                        return CFG_ERR_PARAM;
@@ -71,25 +66,7 @@ int CApiCreCyc::AnalyzeApi(const char* pszApiName, const char* pszParams)
 
                return CFG_ERR_OK;
        }
-       else if ( strcmp(pszApiName, "HOS_RES_CYCOBJ") == 0 )
-       {
-               int iId;
-
-                if ( m_iMaxId > 0 )
-               {
-                        return CFG_ERR_DEF_CONFLICT;
-               }
-
-                if ( (iId = atoi(pszParams)) <= 0 )
-               {
-                        return CFG_ERR_PARAM;
-               }
-
-                m_iResObj += iId;
-
-                return CFG_ERR_OK;
-        }
-
+       
        return CFG_ERR_NOPROC;
 }
 
@@ -99,20 +76,11 @@ void CApiCreCyc::WriteId(FILE* fp)
 {
        int i;
 
-       // ID 直接指定でないオブジェクトが在るかどうかサーチ
-       for ( i = 0; i < m_iObjs; i++ )
-       {
-               if ( atoi(m_pParamPacks[i]->GetParam(CRECYC_CYCID)) == 0 )
-               {
-                       break;
-               }
-       }
-       if ( i == m_iObjs )
-       {
-               return;
-       }
+       // %jp{コメントを出力}
+       fputs("\n\n/* Semaphore object ID definetion */\n\n", fp);
 
-       fputs("\n\n/* cyclic handler ID definetion */\n", fp);
+
+       // %jp{ID定義を出力}
        for ( i = 0; i < m_iObjs; i++ )
        {
                if ( atoi(m_pParamPacks[i]->GetParam(CRECYC_CYCID)) == 0 )
@@ -124,8 +92,15 @@ void CApiCreCyc::WriteId(FILE* fp)
                                m_iId[i]);
                }
        }
-
-       fprintf( fp,"\n#define TMAX_CYCID\t\t%d\n", m_iMaxId );
+       
+       // %jp{ID最大値定義を出力}
+       fprintf( fp,
+               "\n"
+               "#ifdef  TMAX_CYCID\n"
+               "#undef  TMAX_CYCID\n"
+               "#endif\n"
+               "\n"
+               "#define TMAX_CYCID\t\t%d\n\n", m_iMaxId );
 }
 
 
@@ -142,114 +117,199 @@ void  CApiCreCyc::WriteCfgDef(FILE* fp)
                "/* ------------------------------------------ */\n"
                , fp);
 
-       if ( m_iObjs > 0 )
+       if ( m_iMaxId > 0 )
        {
-               fprintf(
-                       fp,
-                       "\n/* cyclic handler control block for rom area */\n"
-                       "const T_KERNEL_CYCCB_ROM kernel_cyccb_rom[%d] =\n"
-                       "\t{\n",
-                       m_iObjs);
-
-               // コントロールブロック(ROM部)出力
-               for ( i = 0; i < m_iObjs; i++ )
+#if _KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_BLKARRAY
+#if _KERNEL_CYCCB_SPLIT_RO
+       // %jp{ブロック配列&ROM分離}
+       {
+               // %jp{RAM部出力}
+               fprintf(fp, "\n_KERNEL_T_CYCCB _kernel_cyccb_tbl[%d] =\n\t{\n", m_iMaxId);
+               for ( i = 1; i <= m_iMaxId; i++ )
                {
-                       fprintf(
-                               fp,
-                               "\t\t{(ATR)(%s), (VP_INT)(%s), (FP)(%s), (RELTIM)(%s)},\n",
-                               m_pParamPacks[i]->GetParam(CRECYC_CYCATR),
-                               m_pParamPacks[i]->GetParam(CRECYC_EXINF),
-                               m_pParamPacks[i]->GetParam(CRECYC_CYCHDR),
-                               m_pParamPacks[i]->GetParam(CRECYC_CYCTIM));
+                       int iObjNum = IdToObjNum(i);
+                       if ( iObjNum >= 0 )
+                       {
+                               fprintf(fp, "\t\t{");
+                               WriteSemcbRam(fp, iObjNum);
+                               fprintf(fp, "},\n");
+                       }
+                       else
+                       {
+                               fprintf(fp, "\t\t{0},\n");
+                       }
                }
                fprintf(fp, "\t};\n");
-       }
 
-       // コントロールブロック(RAM部)出力
-       if ( m_iObjs > 0 )
+               // %jp{ROM部出力}
+               fprintf(fp, "\nconst _KERNEL_T_CYCCB_RO _kernel_cyccb_ro_tbl[%d] =\n\t{\n", m_iMaxId);
+               for ( i = 1; i <= m_iMaxId; i++ )
+               {
+                       int iObjNum = IdToObjNum(i);
+                       if ( iObjNum >= 0 )
+                       {
+                               fprintf(fp, "\t\t{");
+                               WriteSemcbRom(fp, iObjNum);
+                               fprintf(fp, "},\n");
+                       }
+                       else
+                       {
+                               fprintf(fp, "\t\t{0},\n");
+                       }
+               }
+               fprintf(fp, "\t};\n\n");
+       }
+#else
+       // %jp{ブロック配列&統合CYCCB}
        {
-               fprintf(
-                       fp,
-                       "\n/* cyclic handler control block for ram area */\n"
-                       "T_KERNEL_CYCCB_RAM kernel_cyccb_ram[%d];\n",
-                       m_iObjs);
+               // %jp{RAM部出力}
+               fprintf(fp, "\n_KERNEL_T_CYCCB _kernel_cyccb_tbl[%d] =\n\t{\n", m_iMaxId);
+               for ( i = 1; i <= m_iMaxId; i++ )
+               {
+                       int iObjNum = IdToObjNum(i);
+                       if ( iObjNum >= 0 )
+                       {
+                               fprintf(fp, "\t\t{");
+                               WriteCyccbRam(fp, iObjNum);
+                               WriteCyccbRom(fp, iObjNum);
+                               fprintf(fp, "},\n");
+                       }
+                       else
+                       {
+                               fprintf(fp, "\t\t{{0}, },\n");
+                       }
+               }
+               fprintf(fp, "\t};\n");
        }
-
-       // コントロールブロックテーブル出力
-       if ( m_iMaxId > 0 )
+#endif
+#elif _KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_PTRARRAY
+#if _KERNEL_CYCCB_SPLIT_RO
+       // %jp{ポインタ配列&ROM分離}
        {
-               fprintf(
-                       fp,
-                       "\n/* cyclic handler control block table */\n"
-                       "T_KERNEL_CYCCB_RAM *kernel_cyccb_ram_tbl[%d] =\n"
-                       "\t{\n",
-                       m_iMaxId);
-
-               for ( i = 0; i < m_iMaxId; i++ )
+               fprintf(fp, "\n");
+               for ( i = 0; i < m_iObjs; i++ )
+               {
+                       fprintf(fp, "const _KERNEL_T_CYCCB_RO _kernel_cyccb_ro_blk_%d = {", m_iId[i]);
+                       WriteCyccbRom(fp, i);
+                       fprintf(fp, "};\n");
+               }
+               fprintf(fp, "\n");
+               for ( i = 0; i < m_iObjs; i++ )
                {
-                       // ID検索
-                       for ( j = 0; j < m_iObjs; j++ )
+                       fprintf(fp, "_KERNEL_T_CYCCB _kernel_cyccb_blk_%d = {", m_iId[i]);
+                       WriteCyccbRam(fp, i);
+                       fprintf(fp, "};\n");
+               }
+               fprintf(fp, "\n");
+               fprintf(fp, "\n_KERNEL_T_CYCCB *_kernel_cyccb_tbl[%d] =\n\t{\n", m_iMaxId);
+               for ( i = 1; i <= m_iMaxId; i++ )
+               {
+                       int iObjNum = IdToObjNum(i);
+                       if ( iObjNum >= 0 )
+                       {
+                               fprintf(fp, "\t\t&_kernel_cyccb_blk_%d,\n", i);
+                       }
+                       else
                        {
-                               if ( m_iId[j] == i + 1 )
-                               {
-                                       break;
-                               }
+                               fprintf(fp, "\t\tNULL,\n");
                        }
-                       if ( j < m_iObjs )
+               }
+               fprintf(fp, "\t};\n");          
+       }
+#else
+       // %jp{ポインタ配列&統合CYCCB}
+       {
+               fprintf(fp, "\n");
+               for ( i = 0; i < m_iObjs; i++ )
+               {
+                       fprintf(fp, "_KERNEL_T_CYCCB _kernel_cyccb_blk_%d = {", m_iId[i]);
+                       WriteCyccbRam(fp, i);
+                       WriteCyccbRom(fp, i);
+                       fprintf(fp, "};\n");
+               }
+               fprintf(fp, "\n");
+               fprintf(fp, "\n_KERNEL_T_CYCCB *_kernel_cyccb_tbl[%d] =\n\t{\n", m_iMaxId);
+               for ( i = 1; i <= m_iMaxId; i++ )
+               {
+                       int iObjNum = IdToObjNum(i);
+                       if ( iObjNum >= 0 )
                        {
-                               // オブジェクトが存在した場合
-                               fprintf(fp, "\t\t&kernel_cyccb_ram[%d],\n", j);
+                               fprintf(fp, "\t\t&_kernel_cyccb_blk_%d,\n", i);
                        }
                        else
                        {
-                               // オブジェクトが無い場合
-                               fputs("\t\tNULL,\n", fp);
+                               fprintf(fp, "\t\tNULL,\n");
                        }
                }
-               fputs("\t};\n", fp);
+               fprintf(fp, "\t};\n");          
+       }
+#endif
+#endif
        }
 
        // テーブルサイズ情報出力
        fprintf(
                fp,
-               "\n/* cyclic handler control block count */\n"
-               "const INT kernel_cyccb_cnt = %d;\n",
+               "\nconst ID     _kernel_max_cycid = %d;\n",
                m_iMaxId);
 }
 
 
+
+void CApiCreCyc::WriteCyccbRam(FILE *fp, int iObj)
+{
+#if _KERNEL_CYCCB_TIMOBJ
+       fprintf(fp, "{0}, ");                                                                                                           /* %jp{タイムオブジェクト} */
+#endif
+}
+
+
+void CApiCreCyc::WriteCyccbRom(FILE *fp, int iObj)
+{
+#if _KERNEL_CYCCB_CYCATR
+       fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRECYC_CYCATR));    /**< %jp{周期ハンドラ属性} */
+#endif
+
+#if _KERNEL_CYCCB_EXINF
+       fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRECYC_EXINF));             /**< %jp{周期ハンドラの拡張情報} */
+#endif
+
+#if _KERNEL_CYCCB_CYCHDR
+       fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRECYC_CYCHDR));    /**< %jp{周期ハンドラ} */
+#endif
+
+#if _KERNEL_CYCCB_CYCTIM
+       fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRECYC_CYCTIM));    /**< %jp{周期ハンドラの起動周期} */
+#endif
+
+#if _KERNEL_CYCCB_CYCPHS
+       fprintf(fp, "(%s), ", m_pParamPacks[iObj]->GetParam(CRECYC_CYCPHS));    /**< %jp{周期ハンドラの起動位相} */
+#endif
+}
+
+
+
 // cfgファイル初期化部書き出し
 void  CApiCreCyc::WriteCfgIni(FILE* fp)
 {
-       // オブジェクト存在チェック
-       if ( m_iObjs == 0 )
+#if _KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_PTRARRAY && _KERNEL_CYCCB_SPLIT_RO
+       if ( m_iObjs <= 0 )
        {
                return;
        }
 
-       // 初期化部出力
-       fprintf(
-               fp,
-               "\t\n\t\n"
-               "\t/* initialize cyclic handler control block */\n"
-               "\tfor ( i = 0; i < %d; i++ )\n"
-               "\t{\n"
-               "\t\tkernel_cyccb_ram[i].cyccb_rom = &kernel_cyccb_rom[i];\n"
-               "\t}\n",
-               m_iObjs);
+       fprintf(fp, "\n\t/* cycaphores */\n");
+       for ( int i = 0; i < m_iObjs; i++ )
+       {
+               fprintf(fp, "\t_kernel_cyccb_blk_%d.cyccb_ro = &_kernel_cyccb_ro_blk_%d;\n", m_iId[i], m_iId[i]);
+       }       
+#endif
 }
 
 
 // cfgファイル起動部書き出し
 void  CApiCreCyc::WriteCfgStart(FILE* fp)
 {
-       // オブジェクト存在チェック
-       if ( m_iObjs == 0 )
-       {
-               return;
-       }
-
-       fputs("\tkernel_ini_cyc();\t\t/* initialize cyclic handler */\n", fp);
 }
 
 
index bc09fe1..5ed5213 100755 (executable)
@@ -93,7 +93,7 @@ static CApiDef* g_ApiList[] =
 //             &g_ApiCreMbf,
                &g_ApiCreMpf,
                &g_ApiTimTic,
-//             &g_ApiCreCyc,
+               &g_ApiCreCyc,
 //             &g_ApiCreAlm,
                &g_ApiDefInh,
                &g_ApiAttIsr,
@@ -346,6 +346,7 @@ void WriteCfgFile(FILE* fp)
        fprintf(fp, "#include \"object/mpfobj.h\"\n");
        fprintf(fp, "#include \"object/inhobj.h\"\n");
        fprintf(fp, "#include \"object/isrobj.h\"\n");
+       fprintf(fp, "#include \"object/cycobj.h\"\n");
        
 //     fprintf(fp, "#include \"%s\"\n", s_szIdFile);
        fprintf(fp, "#include \"kernel_id.h\"\n", s_szIdFile);
diff --git a/kernel/build/8080/z80/sdcc/gmake.mak b/kernel/build/8080/z80/sdcc/gmake.mak
new file mode 100755 (executable)
index 0000000..7360a92
--- /dev/null
@@ -0,0 +1,90 @@
+# ----------------------------------------------------------------------------
+# Hyper Operating System V4 Advance
+#  makefile for Z80
+#
+# Copyright (C) 1998-2006 by Project HOS
+# http://sourceforge.jp/projects/hos/
+# ----------------------------------------------------------------------------
+
+
+# %jp{ターゲット名}
+TARGET ?= libhosv4a
+
+# %jp{アーキテクチャパス}
+ARCH_PROC ?= 8080/z80
+ARCH_IRC  ?= none
+ARCH_CC   ?= sdcc
+
+
+# %jp{ディレクトリ定義}
+TOP_DIR           = ../../../../..
+KERNEL_DIR        = $(TOP_DIR)/kernel
+KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake
+OBJS_DIR          = objs_$(TARGET)
+
+
+# %jp{共通定義読込み}
+include $(KERNEL_MAKINC_DIR)/common.inc
+
+
+# %jp{アーキテクチャパス定義}
+INC_PROC_DIR     = $(KERNEL_DIR)/include/arch/proc/$(ARCH_PROC)
+INC_IRC_DIR      = $(KERNEL_DIR)/include/arch/irc/$(ARCH_IRC)
+SRC_PROC_DIR     = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)
+SRC_PROC_ASM_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)/$(ARCH_CC)
+SRC_IRC_DIR      = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)
+SRC_IRC_ASM_DIR  = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)/$(ARCH_CC)
+
+# %jp{パス設定}
+INC_DIRS += $(INC_PROC_DIR) $(INC_IRC_DIR)
+SRC_DIRS += $(SRC_PROC_DIR) $(SRC_PROC_DIR) $(SRC_PROC_ASM_DIR) $(SRC_IRC_DIR) $(SRC_IRC_ASM_DIR)
+
+# %jp{オプションフラグ}
+AFLAGS  += -mgbz80
+CFLAGS  += -mgbz80 --std-sdcc89
+ARFLAGS += 
+
+# %jp{コンフィギュレータ定義}
+CFGRTR_DIR = $(TOP_DIR)/cfgrtr/build/gcc
+CFGRTR     = h4acfg-z80
+
+
+# %jp{C言語ファイルの追加}
+CSRCS += 
+
+# アセンブラファイルの追加
+ASRCS += 
+
+
+# カーネル共通ソースの追加
+include $(KERNEL_MAKINC_DIR)/knlsrc.inc
+
+
+# %jp{ALL}
+.PHONY : all
+all: makelib_all
+       make -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC)
+
+# %jp{クリーン}
+.PHONY : clean
+clean: makelib_clean
+       make -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) clean
+       $(RM) -f *.lst
+
+
+
+# %jp{gcc用の設定読込み}
+include $(KERNEL_MAKINC_DIR)/sdcc_def.inc
+
+# %jp{ライブラリ生成用設定読込み}
+include $(KERNEL_MAKINC_DIR)/makelib.inc
+
+
+# %jp{ch38用のルール定義読込み}
+include $(KERNEL_MAKINC_DIR)/sdcc_rul.inc
+
+# %jp{カーネル依存関係読込み}
+include $(KERNEL_MAKINC_DIR)/knldep.inc
+
+
+# end of file
diff --git a/kernel/build/common/gmake/sdcc_def.inc b/kernel/build/common/gmake/sdcc_def.inc
new file mode 100755 (executable)
index 0000000..baaf670
--- /dev/null
@@ -0,0 +1,73 @@
+# ----------------------------------------------------------------------------
+#  Hyper Operating System V4 Advance
+#
+#  Copyright (C) 1998-2006 by Project HOS
+#  http://sourceforge.jp/projects/hos/
+# ----------------------------------------------------------------------------
+
+
+# %jp{ツール定義}%en{Tools}
+CMD_CC     ?= sdcc
+CMD_ASM    ?= sdcc
+CMD_LIBR   ?= sdcclib
+CMD_LINK   ?= sdcc
+CMD_OBJCNV ?= sdcc
+
+# %jp{拡張子定義}
+EXT_C   ?= c
+EXT_CPP ?= cpp
+EXT_ASM ?= S
+EXT_OBJ ?= o
+EXT_LIB ?= lib
+EXT_EXE ?= elf
+EXT_ASC ?= mot
+EXT_BIN ?= bin
+
+
+# ----------------------------------
+#  C-compiler
+# ----------------------------------
+
+# %jp{共通オプションの設定}
+CFLAGS +=
+
+# %jp{インクルードパスオプションの定義}
+CFLAGS_INC ?= $(patsubst %,-I%,$(INC_DIRS))
+
+# %jp{マクロ定義オプションの定義}
+CFLAGS_DEF ?= $(patsubst %,-D%,$(C_DEFS))
+
+# %jp{デバッグオプションの定義}
+CFLAGS_DBG ?= --debug
+
+# %jp{最適化オプションの定義}
+CFLAGS_OPT_NONE   ?= 
+CFLAGS_OPT_NORMAL ?= 
+CFLAGS_OPT_SIZE   ?= --opt-code-size
+CFLAGS_OPT_SPEED  ?= --opt-code-speed
+
+
+# ----------------------------------
+#  Assembler
+# ----------------------------------
+
+# %jp{共通オプションの設定}
+AFLAGS +=
+
+# %jp{インクルードパスオプションの定義}
+AFLAGS_INC ?= $(patsubst %,-I%,$(INC_DIRS))
+
+# %jp{マクロ定義オプションの定義}
+AFLAGS_DEF ?= 
+
+# %jp{デバッグオプションの定義}
+AFLAGS_DBG ?= --debug
+
+# %jp{最適化オプションの定義}
+AFLAGS_OPT_NONE   ?=
+AFLAGS_OPT_NORMAL ?=
+AFLAGS_OPT_SIZE   ?=
+AFLAGS_OPT_SPEED  ?=
+
+
+# end of file
diff --git a/kernel/build/common/gmake/sdcc_rul.inc b/kernel/build/common/gmake/sdcc_rul.inc
new file mode 100755 (executable)
index 0000000..332eed2
--- /dev/null
@@ -0,0 +1,35 @@
+# ----------------------------------------------------------------------------
+#  Hyper Operating System V4 Advance
+#
+#  Copyright (C) 1998-2006 by Project HOS
+#  http://sourceforge.jp/projects/hos/
+# ----------------------------------------------------------------------------
+
+define NEW-LINES
+
+       
+endef
+
+
+$(TARGET_EXE): $(OBJS) $(LIBS)
+       $(CMD_LINK) $(LNFLAGS) $(OBJS) $(LIBS) -o $(TARGET_EXE)
+
+
+$(TARGET_ASC): $(TARGET_EXE)
+       $(CMD_OBJCNV) -O srec $(TARGET_EXE) $(TARGET_ASC)
+
+
+# %jp{ライブラリ生成}
+$(TARGET_LIB): $(OBJS)
+       $(foreach obj,$(OBJS),$(CMD_LIBR) -a $(TARGET_LIB) $(obj)$(NEW-LINES))
+
+# %jp{Cコンパイル}
+$(OBJS_DIR)/%.$(EXT_OBJ) :: %.$(EXT_C)
+       $(CMD_CC) $(CFLAGS) -c $< -o $@
+
+# %jp{アセンブル}
+$(OBJS_DIR)/%.$(EXT_OBJ) :: %.$(EXT_ASM)
+       $(CMD_ASM) $(AFLAGS) -c $< -o $@
+
+
+# end of file
index 712db5e..a1f7354 100755 (executable)
@@ -543,6 +543,10 @@ SOURCE=..\..\..\..\source\object\tsk\slp_tsk.c
 # End Source File\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\source\object\tsk\sta_tsk.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\source\object\tsk\sus_tsk.c\r
 # End Source File\r
 # Begin Source File\r
@@ -859,12 +863,28 @@ SOURCE=..\..\..\..\source\object\dtq\trcv_dtq.c
 # PROP Default_Filter ""\r
 # Begin Source File\r
 \r
+SOURCE=..\..\..\..\source\object\cyc\acre_cyc.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\source\object\cyc\cre_cyc.c\r
+# End Source File\r
+# Begin Source File\r
+\r
 SOURCE=..\..\..\..\source\object\cyc\kcre_cyc.c\r
 # End Source File\r
 # Begin Source File\r
 \r
 SOURCE=..\..\..\..\source\object\cyc\kcyc_hdr.c\r
 # End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\source\object\cyc\sta_cyc.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\source\object\cyc\stp_cyc.c\r
+# End Source File\r
 # End Group\r
 # Begin Group "mtx"\r
 \r
index 9067ede..288abd4 100755 (executable)
@@ -3,6 +3,7 @@
 #include <ctype.h>
 #include <string>
 #include <vector>
+#include <list>
 using namespace std;
 
 
@@ -36,8 +37,8 @@ using namespace std;
 
 struct TTerm
 {
-       int iType;
-       int iValue;
+       int  iType;
+       long lValue;
 };
 
 
@@ -45,23 +46,108 @@ struct TTerm
 class CExpression
 {
 public:
-       static bool Calc(const char *pszExpression, int &piValue);                                      // 計算する
+       static bool Calc(const char *pszExpression, long &lValue);                                      // 計算する
 
 protected:
        static bool Scanner(vector<TTerm> &vectTerm, const char *pszExpression);        // レキシカルアナライザ
-       static bool Parser(vector<TTerm> &vectTerm, int iIndex);                                        // パーサー
+       static bool Parser(vector<TTerm> &vectTerm, int &iIndex, TTerm &Term);          // パーサー
 };
 
 
 // 計算する
-bool CExpression::Calc(const char *pszExpression, int &piValue)
+bool CExpression::Calc(const char *pszExpression, long &lValue)
 {
+       vector<TTerm> vectTerm;
+       TTerm         Term;
+
+//     Term.iType = TYPE_LP;
+//     vectTerm.push_back(Term);
+       
+       // スキャナを通す
+       if ( !Scanner(vectTerm, pszExpression) )
+       {
+               return false;
+       }
+
+       Term.iType = TYPE_RP;
+       vectTerm.push_back(Term);
+       
+       
 
+       return true;
 }
 
-bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &piValue)
+
+// パーサー
+static bool Parser(vector<TTerm> &vectTerm, int &iIndex, TTerm &RetVal)
+{
+       TTerm Term;
+       list<TTerm>           listTerm;
+       list<TTerm>::iterator it;
+
+       for ( ; ; )
+       {
+               if ( iIndex >= vectTerm.size() )
+               {
+                       return false;   // エラー
+               }
+               
+               // 右括弧で抜ける
+               Term = vectTerm.at(iIndex++);
+               if ( Term.iType == TYPE_RP )
+               {
+                       break;
+               }
+               
+               // 左括弧なら再帰処理
+               if ( Term.iType == TYPE_LP )
+               {
+                       if ( !Parser(vectTerm, iIndex, Term) == 0 )
+                       {
+                               return false;
+                       }
+               }
+
+               listTerm.push_back(Term);
+       }
+       
+       if ( listTerm.size() <= 0 )
+       {
+               return false;
+       }
+       
+       // 単項演算子(右結合)
+       {
+               list<int>::reverse_iterator it;
+
+               for ( it = listTerm.rbegin(); it != listTerm.rend(); it++ )
+               {
+
+       for ( i = vectWork.size() - 1; i >= 0; i-- )
+       {
+               if ( Term.iType == TYPE_PLUS )
+               {
+                       if ( i == 0 || vectWork.at(i - 1).iType != TYPE_INT )
+                       {
+                               if ( i + 1 >= vectWork.size() || vectWork.at(i + 1).iType != TYPE_INT )
+                               {
+                                       return false;   // エラーー
+                               }
+                               Term = vectWork.at(i + 1);
+                               Term.lValue = -Term.lValue;
+                               vectWork.erase(i);
+                               vectWork.erase(i + 1);
+                               vectWork.insert(i, Term);
+                       }
+               }
+               if ( Term.iType == TYPE_MINUS
+       }
+#endif
+}
+
+
+bool CExpression::Scanner(vector<TTerm> &vectTerm, const char *pszExpression)
 {
-       vector<TTerm> vectTerm;
        TTerm Term;
        int   c;
 
@@ -74,7 +160,7 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                        if ( (c == 'x' || c == 'X') && isxdigit(*pszExpression) )       /* HEX */
                        {
                                Term.iType  = TYPE_INT;
-                               Term.iValue = 0;
+                               Term.lValue = 0;
                                for ( ; ; )
                                {
                                        c = *pszExpression++;
@@ -84,18 +170,18 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                                                pszExpression--;
                                                break;
                                        }
-                                       Term.iValue *= 16;
+                                       Term.lValue *= 16;
                                        if ( c >= 'a' && c <= 'f' )
                                        {
-                                               Term.iValue += c - 'a' + 10;
+                                               Term.lValue += c - 'a' + 10;
                                        }
                                        else if ( c >= 'A' && c <= 'F' )
                                        {
-                                               Term.iValue += c - 'A' + 10;
+                                               Term.lValue += c - 'A' + 10;
                                        }
                                        else
                                        {
-                                               Term.iValue += c - '0';
+                                               Term.lValue += c - '0';
                                        }
                                }
                                continue;
@@ -103,7 +189,7 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                        else if ( c >= '0' && c <= '9' )        /* OCT */
                        {
                                Term.iType  = TYPE_INT;
-                               Term.iValue = 0;
+                               Term.lValue = 0;
                                for ( ; ; )
                                {
                                        c = *pszExpression++;
@@ -113,8 +199,8 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                                                pszExpression--;
                                                break;
                                        }
-                                       Term.iValue *= 8;
-                                       Term.iValue += c - '0';
+                                       Term.lValue *= 8;
+                                       Term.lValue += c - '0';
                                }
                                continue;
                        }
@@ -126,7 +212,7 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                else if ( isdigit(c) )          /* DEC */
                {
                        Term.iType  = TYPE_INT;
-                       Term.iValue = c - '0';
+                       Term.lValue = c - '0';
                        for ( ; ; )
                        {
                                c = *pszExpression++;
@@ -136,8 +222,8 @@ bool CExpression::Calc(vector<TTerm> &vectTerm, const char *pszExpression, int &
                                        pszExpression--;
                                        break;
                                }
-                               Term.iValue *= 10;
-                               Term.iValue += c - '0';
+                               Term.lValue *= 10;
+                               Term.lValue += c - '0';
                        }
                        continue;
                }
index ea5961a..b7dc660 100755 (executable)
@@ -4,7 +4,8 @@
 #include "param.h"
 #include "parser.h"
 
-
+#include <list>
+using namespace std;
 
 
 int main(int argc, char *argv[])
@@ -13,6 +14,22 @@ int main(int argc, char *argv[])
        FILE        *fp;
        TSourceInfo SrcInf;
 
+       {
+               list<int>           lst;
+               list<int>::reverse_iterator it;
+               
+               lst.push_back(11);
+               lst.push_back(22);
+               lst.push_back(33);
+               
+               for ( it = lst.rbegin(); it != lst.rend();  it++ )
+               {
+                       printf("%d\n", *it);
+               }
+               
+               return 0;
+       }
+
        // さしあたって適当にテスト
        if ( (fp = fopen("system.i", "r")) == NULL )
        {
diff --git a/kernel/include/arch/proc/8080/z80/proc.h b/kernel/include/arch/proc/8080/z80/proc.h
new file mode 100755 (executable)
index 0000000..e889abb
--- /dev/null
@@ -0,0 +1,74 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  proc.h
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef _KERNEL__arch__proc__8080__z80__proc_h__
+#define _KERNEL__arch__proc__8080__z80__proc_h__
+
+
+/** %jp{コンテキスト情報保存ブロック} */
+typedef struct _kernel_t_ctxcb
+{
+       VP_INT  sp;
+} _KERNEL_T_CTXCB;
+
+/** %jp{割込みコンテキスト制御ブロック} */
+typedef struct _kernel_t_ictxcb
+{
+       UB      intcnt;
+       VP      isp;
+} _KERNEL_T_ICTXCB;
+
+
+extern _KERNEL_T_ICTXCB _kernel_ictxcb;                /**< %jp{割込みコンテキスト制御ブロック} */
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+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_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_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{実行コンテキストの切替} */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define _KERNEL_INI_PRC()                      do {} while (0)                                                                                                 /**< %jp{プロセッサ固有の初期化} */
+
+#define _KERNEL_INI_INT(stksz, stk)    do { _kernel_ictxcb.isp = (VB *)(stk) + (stksz); } while (0)    /**< %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)) /**< %jp{実行コンテキストの作成} */  
+#define _KERNEL_DEL_CTX(pk_ctxcb)      do {} while (0)                                                                                                 /**< %jp{実行コンテキストの削除} */
+#define _KERNEL_RST_CTX(pk_ctxcb, stksz, stk, isp, entry, exinf1, exinf2)              \
+                                                                       _kernel_rst_ctx((exinf1), (exinf2), (entry), (isp))                             /**< %jp{実行コンテキストのリスタート} */
+#define _KERNEL_STA_CTX(pk_ctxcb)      _kernel_sta_ctx(pk_ctxcb)
+#define _KERNEL_SWI_CTX(pk_ctxcb_now, pk_ctxinf_nxt)                                                   \
+                                                                       _kernel_swi_ctx((pk_ctxinf_nxt), (pk_ctxcb_now))                                /**< %jp{実行コンテキストの切替} */
+
+
+
+#endif /* _KERNEL__arch__proc__8080__z80__proc_h__ */
+
+
+/* end of file */
diff --git a/kernel/include/arch/proc/8080/z80/procatr.h b/kernel/include/arch/proc/8080/z80/procatr.h
new file mode 100755 (executable)
index 0000000..ed15f45
--- /dev/null
@@ -0,0 +1,52 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  procatr.h
+ * @brief %jp{プロセッサアーキテクチャ固有機能}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef _KERNEL__arch__proc__8080__z80__procatr_h__
+#define _KERNEL__arch__proc__8080__z80__procatr_h__
+
+
+/* %jp{プロセッサアーキテクチャ定義のあるインクルードパス} */
+#define _KERNEL_PROCATR_INC_PATH                       "8080/z80"
+
+
+/* %jp{プロセッサアーキテクチャに依存した属性} */
+#define _KERNEL_PROCATR_CTX_STK                                FALSE           /**< %jp{コンテキスト生成にスタック領域の指定が必要か?} */
+#define _KERNEL_PROCATR_CTX_STKSZ                      FALSE           /**< %jp{コンテキスト生成にスタックサイズの指定が必要か?} */
+#define _KERNEL_PROCATR_CTX_ISP                                TRUE            /**< %jp{コンテキスト生成に初期スタックポインタ値が必要か?} */
+#define _KERNEL_PROCATR_CTX_DEL                                FALSE           /**< %jp{別コンテキストからのコンテキスト削除が必要か?} */
+#define _KERNEL_PROCATR_CTX_RST                                TRUE            /**< %jp{自コンテキストのリスタートが可能か?} */
+
+#define _KERNEL_PROCATR_TMIN_STKSZ                     (4*16)          /**< %jp{最低限必要なスタックサイズ(byte単位)} */
+
+#define _KERNEL_PROCATR_SPT_SMP                                FALSE           /**< %jp{SMPに対応しているか?} */
+#define _KERNEL_PROCATR_SPT_MULTINT                    FALSE           /**< %jp{多重割り込みに対応しているか?} */
+
+#define _KERNEL_PROCATR_TMIN_INHNO                     0                       /**< %jp{割込みハンドラ番号の最小値} */
+#define _KERNEL_PROCATR_TMAX_INHNO                     1                       /**< %jp{割込みハンドラ番号の最大値} */
+
+#define _KERNEL_PROCATR_TMIN_EXCNO                     0                       /**< %jp{CPU例外ハンドラ番号の最小値} */
+#define _KERNEL_PROCATR_TMAX_EXCNO                     0                       /**< %jp{CPU例外ハンドラ番号の最大値} */
+
+#define _KERNEL_PROCATR_SYSSTK_NUM                     1                       /**< %jp{システムスタックは何本必要か?} */
+
+#define _KERNEL_PROCATR_SIGNED_INT                     (-1)            /**< %jp{符号付整数と符号無し整数のどちらが得意か?(符号付き:1, 符号無し:-1, 同じ:0)} */
+#define _KERNEL_PROCATR_TBIT_INT                       16                      /**< %jp{プロセッサに最適な整数型のビット数} */
+#define _KERNEL_PROCATR_TBIT_PTR                       16                      /**< %jp{ポインタのビット数} */
+#define _KERNEL_PROCATR_MEM_ALIGN                      1                       /**< %jp{適切なメモリのアライメント(byte単位)} */
+#define _KERNEL_PROCATR_STK_ALIGN                      1                       /**< %jp{適切なスタックのアライメント(byte単位)} */
+#define _KERNEL_PROCATR_ALLOW_UNALIGN          TRUE            /**< %jp{アンアラインアクセスは可能か?} */
+
+
+
+#endif /* _KERNEL__arch__proc__8080__z80__procatr_h__ */
+
+
+/* end of file */
index 5c69a34..905aab3 100755 (executable)
@@ -16,7 +16,7 @@
 #define __STDC_VERSION__       0
 #endif
 
-#if __STDC_VERSION__ >= 199901L
+#if __STDC_VERSION__ >= 199901L && !defined(SDCC)
 
 /* C99(ISO/IEC 9899:1999) */
 #define _KERNEL_CMPL_STDINT_H                  TRUE                                            /**< %jp{stdint.hは利用可能か?} */
diff --git a/kernel/include/object/timobj.h b/kernel/include/object/timobj.h
deleted file mode 100755 (executable)
index b013433..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/**
- *  Hyper Operating System V4 Advance
- *
- * @file  timobj.h
- * @brief %jp{時間管理オジェクトのヘッダファイル}%en{Time object heder file}
- *
- * Copyright (C) 1998-2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef _KERNEL__object__timobj_h__
-#define _KERNEL__object__timobj_h__
-
-
-/* ------------------------------------------ */
-/*  Primitive type definition                 */
-/* ------------------------------------------ */
-
-/* %jp{タイムティックの除算結果} (TIC_NUME / TIC_DENO) */
-typedef RELTIM                                                 _KERNEL_TIMCB_T_TICDIV;
-#define _KERNEL_TIMCB_TBITDEF_TICDIV
-
-/* %jp{タイムティックの除算の余り結果} (TIC_NUME % TIC_DENO) */
-typedef RELTIM                                                 _KERNEL_TIMCB_T_TICMOD;
-#define _KERNEL_TIMCB_TBITDEF_TICMOD
-
-/* %jp{タイムティックの分母} (TIC_DENO) */
-typedef RELTIM                                                 _KERNEL_TIMCB_T_TICDENO;
-#define _KERNEL_TIMCB_TBITDEF_TICDENO
-
-/* %jp{分数繰上げ用のカウンタ} */
-typedef RELTIM                                                 _KERNEL_TIMCB_T_TICCNT;
-#define _KERNEL_TIMCB_TBITDEF_TICCNT
-
-
-
-/* ------------------------------------------ */
-/*  Control block                             */
-/* ------------------------------------------ */
-
-/** %jp{時間管理コントロールブロック(リードオンリー部)}%en{Time-Manegement Control Block(read-only)} */
-typedef struct _kernel_t_timcb_ro
-{
-#if _KERNEL_TIMCB_TICDIV
-       _KERNEL_TIMCB_T_TICDIV  ticdiv          _KERNEL_TIMCB_TBITDEF_TICDIV;           /**< %jp{タイムティックの除算結果} (TIC_NUME / TIC_DENO) */
-#endif
-
-#if _KERNEL_TIMCB_TICMOD
-       _KERNEL_TIMCB_T_TICMOD  ticmod          _KERNEL_TIMCB_TBITDEF_TICMOD;           /**< %jp{タイムティックの除算の余り結果} (TIC_NUME % TIC_DENO) */
-#endif
-
-#if _KERNEL_TIMCB_TICDENO
-       _KERNEL_TIMCB_T_TICDENO ticdeno         _KERNEL_TIMCB_TBITDEF_TICDENO;          /**< %jp{タイムティックの分母} (TIC_DENO) */
-#endif
-} _KERNEL_T_TIMCB_RO;
-
-
-/** %jp{時間管理コントロールブロック}%en{Time-Manegement Control Block} */
-typedef struct _kernel_t_timcb
-{
-#if _KERNEL_TIMCB_SYSTIM
-       SYSTIM                                  systim;                                                                                 /**< %jp{現在のシステム時刻} */
-#endif
-
-#if _KERNEL_TIMCB_TICCNT
-       _KERNEL_TIMCB_T_TICCNT  ticcnt          _KERNEL_TIMCB_TBITDEF_TICCNT;           /**< %jp{分数繰上げ用のカウンタ} */
-#endif
-} _KERNEL_T_TIMCB;
-
-
-
-/* ------------------------------------------ */
-/*  Control block tables                      */
-/* ------------------------------------------ */
-
-extern const _KERNEL_T_TIMCB_RO                _kernel_timcb_ro;
-extern _KERNEL_T_TIMCB                         _kernel_timcb;
-
-
-
-/* ------------------------------------------ */
-/*   Accessor for TIMCB                       */
-/* ------------------------------------------ */
-
-/* ticvid */
-#if _KERNEL_TIMCB_TICDIV
-#define _KERNEL_TIM_GET_TICDIV()                       (_kernel_timcb_ro.ticdiv)
-#else
-#define _KERNEL_TIM_GET_TICDIV()                       (1)
-#endif
-
-/* ticmod */
-#if _KERNEL_TIMCB_TICMOD
-#define _KERNEL_TIM_GET_TICMOD()                       (_kernel_timcb_ro.ticmod)
-#else
-#define _KERNEL_TIM_GET_TICMOD()                       (0)
-#endif
-
-/* ticdeno */
-#if _KERNEL_TIMCB_TICDENO
-#define _KERNEL_TIM_GET_TICDENO()                      (_kernel_timcb_ro.ticmod)
-#else
-#define _KERNEL_TIM_GET_TICDENO()                      (1)
-#endif
-
-/* systim */
-#if _KERNEL_TIMCB_SYSTIM
-#define _KERNEL_TIM_GET_SYSTIM()                       (&_kernel_timcb.systim)
-#define _KERNEL_TIM_SET_SYSTIM(p_tim)          do { _kernel_timcb.systim = *(p_tim); } while(0)
-#define _KERNEL_TIM_ADD_SYSTIM(tic)                    _KERNEL_SYSTIM_ADD(&_kernel_timcb.systim, (tic))
-#else
-#define _KERNEL_TIM_GET_SYSTIM()                       (NULL)
-#define _KERNEL_TIM_SET_SYSTIM(p_tim)          do {} while(0)
-#define _KERNEL_TIM_ADD_SYSTIM(tic)                    do {} while(0)
-#endif
-
-/* ticcnt */
-#if _KERNEL_TIMCB_TICCNT
-#define _KERNEL_TIM_GET_TICCNT()                       (_kernel_timcb.ticcnt)
-#define _KERNEL_TIM_SET_TICCNT(cnt)                    do { _kernel_timcb.ticcnt = (cnt); } while (0)
-#else
-#define _KERNEL_TIM_GET_TICCNT()                       (1)
-#define _KERNEL_TIM_SET_TICCNT(cnt)                    do {} while (0)
-#endif
-
-
-
-#endif /* _KERNEL__object__timobj_h__ */
-
-
-/* end of file */
diff --git a/kernel/source/object/cyc/acre_cyc.c b/kernel/source/object/cyc/acre_cyc.c
new file mode 100755 (executable)
index 0000000..31c8a20
--- /dev/null
@@ -0,0 +1,100 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  acre_cyc.c
+ * @brief %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "core/core.h"
+#include "object/cycobj.h"
+
+
+
+#if _KERNEL_SPT_ACRE_CYC
+
+/** %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ * @param  pk_ccyc           %jp{周期ハンドラ生成情報を入れたパケットへのポインタ}%en{Pointer to the packet containing the cyclic handler creation information}
+ * @retval %jp{正の値}%en{positiv-value} %jp{生成した周期ハンドラのID番号}%en{ID number of the created cyclic handler}
+ * @retval E_NOID  %jp{ID番号不足(割付可能な周期ハンドラIDが無い)}%en{No ID number available(there id no cyclic handler ID assignable)}
+ * @retval E_RSATR %jp{予約属性(cycatrが不正あるいは使用できない)}%en{Reserved attribute(cycatr is invalid or unusable)}
+ */
+ER_ID acre_cyc(const T_CCYC *pk_ccyc)
+{
+       ID    cycid;
+       ER_ID erid;
+
+       /* %jp{属性チェック}%en{check attribute} */
+#if _KERNEL_SPT_ACRE_CYC_E_RSATR
+       if ( ((pk_ccyc->cycatr & TA_TPRI) == 0 && !_KERNEL_SPT_CYC_TA_TFIFO)
+               || ((pk_ccyc->cycatr & TA_TPRI) != 0 && !_KERNEL_SPT_CYC_TA_TPRI) )
+       {
+               return E_RSATR; /* %jp{予約属性}%en{Reserved attribute} */
+       }
+#endif
+
+       _KERNEL_ENTER_SVC();            /* %jp{サービスコールに入る}%en{enter service-call} */
+       
+       /* %jp{空きID探索} */
+       for ( cycid = _KERNEL_CYC_TMAX_ID; cycid >= _KERNEL_CYC_TMIN_ID; cycid-- )
+       {
+               if ( !_KERNEL_CYC_CHECK_EXS(cycid) )
+               {
+                       break;
+               }
+       }
+
+       /* %jp{空きID探索チェック} */
+#if _KERNEL_SPT_ACRE_CYC_E_NOID
+       if ( cycid < _KERNEL_CYC_TMIN_ID )
+       {
+               _KERNEL_LEAVE_SVC();    /* %jp{サービスコールから出る}%en{leave service-call} */
+               return E_NOID;                  /* %jp{ID番号不足} */
+       }
+#endif
+       
+       /* %jp{オブジェクト生成} */
+#if (_KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_PTRARRAY) && _KERNEL_SPT_ACRE_CYC_E_NOMEM
+       erid = (ER_ID)_kernel_cre_cyc(cycid, pk_ccyc);
+       if ( erid == E_OK )
+       {
+               erid = (ER_ID)cycid;    /* %jp{エラーでなければ周期ハンドラIDを格納} */
+       }
+#else
+       _kernel_cre_cyc(cycid, pk_ccyc);
+       erid = (ER_ID)cycid;            /* %jp{周期ハンドラIDを格納} */
+#endif
+
+       _KERNEL_LEAVE_SVC();            /* %jp{サービスコールから出る}%en{leave service-call} */
+       
+       return erid;
+}
+
+
+#else  /* _KERNEL_SPT_ACRE_CYC */
+
+
+#if _KERNEL_SPT_ACRE_CYC_E_NOSPT
+
+
+/** %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ * @param  pk_ccyc  %jp{周期ハンドラ生成情報を入れたパケットへのポインタ}%en{Pointer to the packet containing the cyclic handler creation information}
+ * @retval E_NOSPT  %jp{未サポート機能}%en{Unsupported function}
+ */
+ER_ID acre_cyc(const T_CCYC *pk_ccyc)
+{
+       return E_NOSPT;
+}
+
+#endif
+
+
+#endif /* _KERNEL_SPT_ACRE_CYC */
+
+
+
+/* end of file */
diff --git a/kernel/source/object/cyc/cre_cyc.c b/kernel/source/object/cyc/cre_cyc.c
new file mode 100755 (executable)
index 0000000..3086457
--- /dev/null
@@ -0,0 +1,90 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  cre_cyc.c
+ * @brief %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "core/core.h"
+#include "object/cycobj.h"
+
+
+
+#if _KERNEL_SPT_CRE_CYC
+
+/** %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ * @param  cycid               %jp{生成対象の周期ハンドラのID番号}%en{ID number of the cyclic handler to be created}
+ * @param  pk_ccyc         %jp{周期ハンドラ生成情報を入れたパケットへのポインタ}%en{Pointer to the packet containing the cyclic handler creation information}
+ * @retval %jp{正の値}%en{positiv-value} %jp{生成した周期ハンドラのID番号}%en{ID number of the created cyclic handler}
+ * @retval E_NOID  %jp{ID番号不足(割付可能な周期ハンドラIDが無い)}%en{No ID number available(there id no cyclic handler ID assignable)}
+ * @retval E_RSATR %jp{予約属性(cycatrが不正あるいは使用できない)}%en{Reserved attribute(cycatr is invalid or unusable)}
+ */
+ID cre_cyc(ID cycid, const T_CCYC *pk_ccyc)
+{
+       ER_ID erid;
+
+       /* %jp{IDチェック}%en{check ID} */
+#if _KERNEL_SPT_CRE_CYC_E_ID
+       if ( !_KERNEL_CYC_CHECK_CYCID(cycid) )
+       {
+               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_CRE_CYC_E_OBJ
+       if ( _KERNEL_CYC_CHECK_EXS(cycid) )
+       {
+               _KERNEL_LEAVE_SVC();    /* %jp{サービスコールから出る}%en{leave service-call} */
+               return E_OBJ;                   /* %jp{オブジェクト状態エラー}%en{Object state error} */
+       }
+#endif
+       
+       /* %jp{オブジェクト生成} */
+#if (_KERNEL_CYCCB_ALGORITHM == _KERNEL_CYCCB_ALG_PTRARRAY) && _KERNEL_SPT_ACRE_CYC_E_NOMEM
+       erid = (ER_ID)_kernel_cre_cyc(cycid, pk_ccyc);
+       if ( erid == E_OK )
+       {
+               erid = (ER_ID)cycid;    /* %jp{エラーでなければ周期ハンドラIDを格納} */
+       }
+#else
+       _kernel_cre_cyc(cycid, pk_ccyc);
+       erid = (ER_ID)cycid;            /* %jp{周期ハンドラIDを格納} */
+#endif
+
+       _KERNEL_LEAVE_SVC();            /* %jp{サービスコールから出る}%en{leave service-call} */
+       
+       return erid;
+}
+
+
+#else  /* _KERNEL_SPT_ACRE_CYC */
+
+
+#if _KERNEL_SPT_ACRE_CYC_E_NOSPT
+
+
+/** %jp{周期ハンドラの生成(ID番号自動割付け)}%en{Create cyclic handler(ID Number Automatic Assignment)}
+ * @param  pk_ccyc  %jp{周期ハンドラ生成情報を入れたパケットへのポインタ}%en{Pointer to the packet containing the cyclic handler creation information}
+ * @retval E_NOSPT  %jp{未サポート機能}%en{Unsupported function}
+ */
+ID cre_cyc(ID cycid, const T_CCYC *pk_ccyc)
+{
+       return E_NOSPT;
+}
+
+#endif
+
+
+#endif /* _KERNEL_SPT_ACRE_CYC */
+
+
+
+/* end of file */
index 7f84150..83fc048 100755 (executable)
@@ -26,7 +26,7 @@ void _kernel_exe_inh(INHNO inhno)
                if ( pk_inhinf->inthdr != NULL )
                {
                        _KERNEL_ENA_INT();                      /* %jp{多重割込み許可} */
-                       pk_inhinf->inthdr(inhno);       /* %jp{割込みハンドラの処理} */
+                       pk_inhinf->inthdr();            /* %jp{割込みハンドラの処理} */
                        _KERNEL_DIS_INT();                      /* %jp{割込み禁止} */
                }
        }
diff --git a/kernel/source/object/tsk/sta_tsk.c b/kernel/source/object/tsk/sta_tsk.c
new file mode 100755 (executable)
index 0000000..c5f59fd
--- /dev/null
@@ -0,0 +1,112 @@
+/** 
+ *  Hyper Operating System V4 Advance
+ *
+ * @file  act_tsk.c
+ * @brief %en{Activate Task}%jp{タスクの起動}
+ *
+ * Copyright (C) 1998-2006 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "core/core.h"
+
+
+
+/** %jp{タスクの起動(起動コード指定)}%en{Start Task}
+ * @param  tskid   %en{ID number of the task to be activated}%jp{タスクID}
+ * @return void
+ */
+ER sta_tsk(
+               ID     tskid,
+               VP_INT stacd)
+{
+       _KERNEL_T_TSKHDL       tskhdl;
+       _KERNEL_T_TCB          *tcb;
+       const _KERNEL_T_TCB_RO *tcb_ro;
+
+       if ( tskid == TSK_SELF )                /* %jp{自タスク指定時の変換} */
+       {
+#ifdef _KERNEL_SPT_STA_TSK_E_ID
+               if ( _KERNEL_SYS_SNS_CTX() )
+               {
+                       return E_ID;            /* %jp{不正ID番号} */
+               }
+#endif
+               /* %jp{実行中タスクを取得} */
+               tskhdl = _KERNEL_SYS_GET_RUNTSK();
+
+               _KERNEL_ENTER_SVC();            /* %jp{enter service-call}%jp{サービスコールに入る} */
+       }
+       else
+       {
+#if _KERNEL_SPT_STA_TSK_E_ID
+               if ( !_KERNEL_TSK_CHECK_TSKID(tskid) )
+               {
+                       return E_ID;    /* %jp{不正ID番号} */
+               }
+#endif
+               
+               _KERNEL_ENTER_SVC();            /* %jp{enter service-call}%jp{サービスコールに入る} */
+               
+               /* %jp{オブジェクト存在チェック} */
+#ifdef _KERNEL_CFG_STA_TSK_E_NOEXS
+               if ( _KERNEL_TSK_CHECK_EXS(tskid) )
+               {
+                       _KERNEL_LEAVE_SVC();            /* %jp{leave service-call}%jp{サービスコールを出る} */
+                       return E_NOEXS;                 /* %jp{オブジェクト未生成} */
+               }
+#endif
+               /* ID番号指定時の変換 */
+               tskhdl = _KERNEL_TSK_ID2TSKHDL(tskid);
+       }
+       
+
+       /* %jp{TCB取得} */
+       tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
+
+       /* %jp{状態チェック} */
+#if _KERNEL_SPT_STA_TSK_E_OBJ
+       if ( _KERNEL_TSK_GET_TSKSTAT(tcb) != _KERNEL_TTS_DMT )          /* %jp{オブジェクト状態判定} */
+       {
+               _KERNEL_LEAVE_SVC();
+               return E_OBJ;           /* %jp{状態不正} */
+       }
+#endif
+
+       /* %jp{タスク状態初期化} */
+       tcb_ro = _KERNEL_TSK_GET_TCB_RO(tskid, tcb);
+       _KERNEL_TSK_SET_TSKPRI(tcb, _KERNEL_TSK_GET_ITSKPRI(tcb_ro));
+       _KERNEL_TSK_SET_TSKBPRI(tcb, _KERNEL_TSK_GET_ITSKPRI(tcb_ro));
+       _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_RDY);
+       _KERNEL_TSK_SET_ACTCNT(tcb, 0);
+       _KERNEL_TSK_SET_WUPCNT(tcb, 0);
+       _KERNEL_TSK_SET_SUSCNT(tcb, 0);
+       
+       /* %jp{コンテキスト生成} */
+       _KERNEL_CRE_CTX(
+                       _KERNEL_TSK_GET_CTXCB(tcb),                                     /* %jp{コンテキスト制御ブロック} */
+                       _KERNEL_TSK_GET_STKSZ(tcb_ro),                          /* %jp{タスクのスタック領域サイズ} */
+                       _KERNEL_TSK_GET_STK(tcb_ro),                            /* %jp{タスクのスタック領域の先頭番地} */
+                       (VP)_KERNEL_TSK_GET_ISP(tcb_ro),                        /* %jp{スタックポインタの初期値} */
+                       (FP)_kernel_ent_tsk,                                            /* %jp{コンテキストの開始アドレス} */
+                       stacd,                                                                          /* %jp{タスクの拡張情報} */
+                       (VP_INT)_KERNEL_TSK_GET_TASK(tcb_ro)            /* %jp{タスクの起動番地} */
+               );
+       
+       /* %jp{タスク実行可能状態に設定} */
+       _KERNEL_DSP_STA_TSK(tskhdl);
+       
+       /* %jp{タスクディスパッチの実行}%en{task dispatch} */
+       _KERNEL_DSP_TSK();
+       
+
+       _KERNEL_LEAVE_SVC();            /* %jp{leave service-call}%jp{サービスコールを出る} */
+       
+
+       return E_OK;    /* 成功 */
+}
+
+
+/* end of file */
index 58bc39a..1364957 100755 (executable)
@@ -32,11 +32,18 @@ typedef struct t_print_msg
 } T_PRINT_MSG;
 
 
+void CycHdr(VP_INT exinf)
+{
+       printf("hoge\n");
+}
+
+
 /** %jp{初期化ハンドラ} */
 void Sample_Initialize(VP_INT exinf)
 {
        T_CMPF cmpf;
        T_CMBX cmbx;
+       T_CCYC ccyc;
        
        /* %jp{固定長メモリプール生成} */
        cmpf.mpfatr = TA_TFIFO;                                 
@@ -58,6 +65,17 @@ void Sample_Initialize(VP_INT exinf)
        act_tsk(TSKID_SAMPLE3);
        act_tsk(TSKID_SAMPLE4);
        act_tsk(TSKID_SAMPLE5);
+
+       {
+               ER_ID erid;
+               ccyc.cycatr = TA_HLNG;
+               ccyc.cychdr = (FP)CycHdr;
+               ccyc.cycphs = 0;
+               ccyc.cyctim = 1000;
+               ccyc.exinf  = 0;
+               erid = acre_cyc(&ccyc);
+               sta_cyc(erid);
+       }
 }
 
 
index 51ee4b6..f2f5de5 100755 (executable)
@@ -17,6 +17,7 @@ KERNEL_MAX_TSKID(8);
 KERNEL_MAX_SEMID(8);
 KERNEL_MAX_MBXID(8);
 KERNEL_MAX_MPFID(8);
+KERNEL_MAX_CYCID(8);
 
 
 /* %jp{OSタイマの設定}%en{OS timer} */