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部)
};
{
return AddParams(pszParams);
}
- else if ( strcmp(pszApiName, "HOS_MAX_CYCID") == 0 )
+ else if ( strcmp(pszApiName, "KERNEL_MAX_CYCID") == 0 )
{
int iId;
return CFG_ERR_MULTIDEF;
}
- if ( m_iResObj > 0 )
- {
- return CFG_ERR_DEF_CONFLICT;
- }
-
if ( (iId = atoi(pszParams)) <= 0 )
{
return CFG_ERR_PARAM;
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;
}
{
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 )
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 );
}
"/* ------------------------------------------ */\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);
}
// &g_ApiCreMbf,
&g_ApiCreMpf,
&g_ApiTimTic,
-// &g_ApiCreCyc,
+ &g_ApiCreCyc,
// &g_ApiCreAlm,
&g_ApiDefInh,
&g_ApiAttIsr,
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);
--- /dev/null
+# ----------------------------------------------------------------------------
+# 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
--- /dev/null
+# ----------------------------------------------------------------------------
+# 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
--- /dev/null
+# ----------------------------------------------------------------------------
+# 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
# 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
# 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
#include <ctype.h>
#include <string>
#include <vector>
+#include <list>
using namespace std;
struct TTerm
{
- int iType;
- int iValue;
+ int iType;
+ long lValue;
};
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;
if ( (c == 'x' || c == 'X') && isxdigit(*pszExpression) ) /* HEX */
{
Term.iType = TYPE_INT;
- Term.iValue = 0;
+ Term.lValue = 0;
for ( ; ; )
{
c = *pszExpression++;
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;
else if ( c >= '0' && c <= '9' ) /* OCT */
{
Term.iType = TYPE_INT;
- Term.iValue = 0;
+ Term.lValue = 0;
for ( ; ; )
{
c = *pszExpression++;
pszExpression--;
break;
}
- Term.iValue *= 8;
- Term.iValue += c - '0';
+ Term.lValue *= 8;
+ Term.lValue += c - '0';
}
continue;
}
else if ( isdigit(c) ) /* DEC */
{
Term.iType = TYPE_INT;
- Term.iValue = c - '0';
+ Term.lValue = c - '0';
for ( ; ; )
{
c = *pszExpression++;
pszExpression--;
break;
}
- Term.iValue *= 10;
- Term.iValue += c - '0';
+ Term.lValue *= 10;
+ Term.lValue += c - '0';
}
continue;
}
#include "param.h"
#include "parser.h"
-
+#include <list>
+using namespace std;
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 )
{
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
#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は利用可能か?} */
+++ /dev/null
-/**
- * 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 */
--- /dev/null
+/**
+ * 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 */
--- /dev/null
+/**
+ * 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 */
if ( pk_inhinf->inthdr != NULL )
{
_KERNEL_ENA_INT(); /* %jp{多重割込み許可} */
- pk_inhinf->inthdr(inhno); /* %jp{割込みハンドラの処理} */
+ pk_inhinf->inthdr(); /* %jp{割込みハンドラの処理} */
_KERNEL_DIS_INT(); /* %jp{割込み禁止} */
}
}
--- /dev/null
+/**
+ * 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 */
} 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;
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);
+ }
}
KERNEL_MAX_SEMID(8);
KERNEL_MAX_MBXID(8);
KERNEL_MAX_MPFID(8);
+KERNEL_MAX_CYCID(8);
/* %jp{OSタイマの設定}%en{OS timer} */