From 95c4875549360289ac299e7c7d6a20283b876479 Mon Sep 17 00:00:00 2001 From: ryuz Date: Tue, 22 Jul 2008 13:36:48 +0000 Subject: [PATCH] (none) --- aplfw/application/filecmd/filecopy/filecopy_main.c | 2 +- .../syscmd/processlist/processlist_main.c | 2 +- .../syscmd/shell/shell_executecommand.c | 5 +- aplfw/application/syscmd/shell/shell_inputline.c | 4 +- aplfw/build/common/gmake/aplfwdep.inc | 1 + aplfw/build/common/gmake/aplfwsrc.inc | 1 + aplfw/build/common/nmake/aplfwdep.inc | 4 + aplfw/build/common/nmake/aplfwsrc.inc | 2 + aplfw/build/common/tmp_mkinc/mk_inc.pl | 1 + aplfw/driver/console/vt100/vt100drv_constructor.c | 4 +- aplfw/driver/tcpip/ipether/ipether_constructor.c | 3 +- aplfw/driver/tcpip/ipether/ipether_getmacaddr.c | 2 +- aplfw/driver/tcpip/ipether/ipether_iocontrol.c | 14 ++- aplfw/driver/tcpip/ipether/ipether_local.h | 2 +- aplfw/driver/tcpip/ipether/ipether_recv.c | 4 +- aplfw/driver/tcpip/tcpip/tcpip.h | 6 +- aplfw/driver/tcpip/tcpip/tcpip_close.c | 10 +- aplfw/driver/tcpip/tcpip/tcpip_constructor.c | 33 ++++- aplfw/driver/tcpip/tcpip/tcpip_create.c | 15 +-- aplfw/driver/tcpip/tcpip/tcpip_local.h | 2 +- aplfw/driver/tcpip/tcpip/tcpip_open.c | 8 +- aplfw/driver/tcpip/tcpip/tcpip_recv.c | 4 +- aplfw/driver/tcpip/tcpip/tcpip_stringtoaddr.c | 62 +++++++++ aplfw/driver/tcpip/tcpip/tcpip_write.c | 55 ++++---- aplfw/driver/tcpip/tcpip/tcpipfile.h | 1 + aplfw/driver/tcpip/tcpip/tcpipfile_create.c | 2 +- aplfw/driver/volume/fat/fatvol_clusterwrite.c | 6 + .../algorithm/ipchecksum/ipchecksum_getdigest.c | 5 +- aplfw/system/file/file.h | 6 +- aplfw/system/file/fileobj.h | 6 +- aplfw/system/file/fileobj_constructor.c | 6 +- aplfw/system/file/fileobj_destructor.c | 10 ++ aplfw/system/file/sysvol.h | 2 +- aplfw/system/process/process.h | 8 +- kernel/build/common/gmake/knldep.inc | 2 + kernel/build/common/gmake/knlsrc.inc | 2 + kernel/build/common/nmake/knldep.inc | 8 ++ kernel/build/common/nmake/knlsrc.inc | 4 + kernel/build/common/tmp_mkinc/mk_inc.pl | 2 + kernel/include/config/cfgknl.h | 32 ++--- kernel/include/core/dpc.h | 28 +++-- kernel/include/core/sys.h | 17 ++- kernel/include/object/flgobj.h | 1 + kernel/include/parser/parsknl.h | 7 ++ kernel/source/core/dpc/exe_dpc.c | 39 ++++-- kernel/source/core/dpc/ini_dpc.c | 32 +++++ kernel/source/core/dpc/req_dpc.c | 58 +++++++++ kernel/source/object/dtq/trcv_dtq.c | 8 +- kernel/source/object/flg/iset_flg.c | 34 ++--- kernel/source/object/flg/twai_flg.c | 140 +++++++++++++-------- kernel/source/object/inh/end_inh.c | 16 +-- kernel/source/object/sem/isig_sem.c | 40 +----- kernel/source/object/sys/sta_knl.c | 2 +- kernel/source/object/tim/isig_tim.c | 25 +--- 54 files changed, 536 insertions(+), 259 deletions(-) create mode 100755 aplfw/driver/tcpip/tcpip/tcpip_stringtoaddr.c create mode 100755 kernel/source/core/dpc/ini_dpc.c create mode 100755 kernel/source/core/dpc/req_dpc.c diff --git a/aplfw/application/filecmd/filecopy/filecopy_main.c b/aplfw/application/filecmd/filecopy/filecopy_main.c index 3c1ff6f..a21dac2 100755 --- a/aplfw/application/filecmd/filecopy/filecopy_main.c +++ b/aplfw/application/filecmd/filecopy/filecopy_main.c @@ -14,7 +14,7 @@ #include "filecopy.h" -#define FILECOPY_BUFSIZE (4 * 1024) +#define FILECOPY_BUFSIZE (32 * 1024) int FileCopy_Main(int argc, char *argv[]) diff --git a/aplfw/application/syscmd/processlist/processlist_main.c b/aplfw/application/syscmd/processlist/processlist_main.c index 2d29332..c11622d 100755 --- a/aplfw/application/syscmd/processlist/processlist_main.c +++ b/aplfw/application/syscmd/processlist/processlist_main.c @@ -21,7 +21,7 @@ int ProcessList_Main(int argc, char *argv[]) HANDLE hProcess; unsigned long ulExecSec; unsigned long ulExecNano; - int iIsr = 0; + int iIsr = 0; int i; /* オプション解析 */ diff --git a/aplfw/application/syscmd/shell/shell_executecommand.c b/aplfw/application/syscmd/shell/shell_executecommand.c index 2c520ef..91f1104 100755 --- a/aplfw/application/syscmd/shell/shell_executecommand.c +++ b/aplfw/application/syscmd/shell/shell_executecommand.c @@ -125,6 +125,7 @@ void Shell_CheckBackGround(C_SHELL *self) { T_SHELL_BACKGROUND *pBg; T_SHELL_BACKGROUND *pBgPrev; + T_SHELL_BACKGROUND *pBgNext; /* バックグランドジョブで終わったものが無いかチェック */ pBg = self->pBackGround; @@ -158,10 +159,12 @@ void Shell_CheckBackGround(C_SHELL *self) { pBgPrev->pNext = pBg->pNext; } - pBg = pBg->pNext; + pBgNext = pBg->pNext; /* メモリ開放 */ Memory_Free(pBg); + + pBg = pBgNext; } else { diff --git a/aplfw/application/syscmd/shell/shell_inputline.c b/aplfw/application/syscmd/shell/shell_inputline.c index 9f4c9b4..1d5f0fd 100755 --- a/aplfw/application/syscmd/shell/shell_inputline.c +++ b/aplfw/application/syscmd/shell/shell_inputline.c @@ -22,9 +22,9 @@ int Shell_InputLine(C_SHELL *self, char *pszBuf, int iBufSize) /* プロンプトを出す */ - StdIo_PutString("\r% "); + StdCon_PutString("\r% "); self->iCurScreenX = 2; - + self->iCommandLen = 0; self->iCurPos = 0; diff --git a/aplfw/build/common/gmake/aplfwdep.inc b/aplfw/build/common/gmake/aplfwdep.inc index 451caaa..974a8d5 100755 --- a/aplfw/build/common/gmake/aplfwdep.inc +++ b/aplfw/build/common/gmake/aplfwdep.inc @@ -286,6 +286,7 @@ $(OBJS_DIR)/tcpip_read.$(EXT_OBJ): $(TCPIP_DIR)/tcpip_read.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpip_write.$(EXT_OBJ): $(TCPIP_DIR)/tcpip_write.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpip_flush.$(EXT_OBJ): $(TCPIP_DIR)/tcpip_flush.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpip_recv.$(EXT_OBJ): $(TCPIP_DIR)/tcpip_recv.c $(COMMON_HEADERS) +$(OBJS_DIR)/tcpip_stringtoaddr.$(EXT_OBJ): $(TCPIP_DIR)/tcpip_stringtoaddr.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpipfile_create.$(EXT_OBJ): $(TCPIP_DIR)/tcpipfile_create.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpipfile_delete.$(EXT_OBJ): $(TCPIP_DIR)/tcpipfile_delete.c $(COMMON_HEADERS) $(OBJS_DIR)/tcpipfile_constructor.$(EXT_OBJ): $(TCPIP_DIR)/tcpipfile_constructor.c $(COMMON_HEADERS) diff --git a/aplfw/build/common/gmake/aplfwsrc.inc b/aplfw/build/common/gmake/aplfwsrc.inc index a9430f0..f8c39bd 100755 --- a/aplfw/build/common/gmake/aplfwsrc.inc +++ b/aplfw/build/common/gmake/aplfwsrc.inc @@ -537,6 +537,7 @@ CSRCS += $(TCPIP_DIR)/tcpip_read.c CSRCS += $(TCPIP_DIR)/tcpip_write.c CSRCS += $(TCPIP_DIR)/tcpip_flush.c CSRCS += $(TCPIP_DIR)/tcpip_recv.c +CSRCS += $(TCPIP_DIR)/tcpip_stringtoaddr.c CSRCS += $(TCPIP_DIR)/tcpipfile_create.c CSRCS += $(TCPIP_DIR)/tcpipfile_delete.c CSRCS += $(TCPIP_DIR)/tcpipfile_constructor.c diff --git a/aplfw/build/common/nmake/aplfwdep.inc b/aplfw/build/common/nmake/aplfwdep.inc index 3c36195..3b6b498 100755 --- a/aplfw/build/common/nmake/aplfwdep.inc +++ b/aplfw/build/common/nmake/aplfwdep.inc @@ -1056,6 +1056,9 @@ $(OBJS_DIR)\tcpip_flush.c : $(TCPIP_DIR)\tcpip_flush.c $(OBJS_DIR)\tcpip_recv.c : $(TCPIP_DIR)\tcpip_recv.c $(CMD_CP) $(TCPIP_DIR)\tcpip_recv.c $(OBJS_DIR)\ +$(OBJS_DIR)\tcpip_stringtoaddr.c : $(TCPIP_DIR)\tcpip_stringtoaddr.c + $(CMD_CP) $(TCPIP_DIR)\tcpip_stringtoaddr.c $(OBJS_DIR)\ + $(OBJS_DIR)\tcpipfile_create.c : $(TCPIP_DIR)\tcpipfile_create.c $(CMD_CP) $(TCPIP_DIR)\tcpipfile_create.c $(OBJS_DIR)\ @@ -2233,6 +2236,7 @@ $(OBJS_DIR)\tcpip_read.$(EXT_OBJ): $(OBJS_DIR)\tcpip_read.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpip_write.$(EXT_OBJ): $(OBJS_DIR)\tcpip_write.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpip_flush.$(EXT_OBJ): $(OBJS_DIR)\tcpip_flush.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpip_recv.$(EXT_OBJ): $(OBJS_DIR)\tcpip_recv.c $(COMMON_HEADERS) +$(OBJS_DIR)\tcpip_stringtoaddr.$(EXT_OBJ): $(OBJS_DIR)\tcpip_stringtoaddr.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpipfile_create.$(EXT_OBJ): $(OBJS_DIR)\tcpipfile_create.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpipfile_delete.$(EXT_OBJ): $(OBJS_DIR)\tcpipfile_delete.c $(COMMON_HEADERS) $(OBJS_DIR)\tcpipfile_constructor.$(EXT_OBJ): $(OBJS_DIR)\tcpipfile_constructor.c $(COMMON_HEADERS) diff --git a/aplfw/build/common/nmake/aplfwsrc.inc b/aplfw/build/common/nmake/aplfwsrc.inc index e4b2170..56b66c4 100755 --- a/aplfw/build/common/nmake/aplfwsrc.inc +++ b/aplfw/build/common/nmake/aplfwsrc.inc @@ -966,6 +966,8 @@ CSRCS = $(CSRCS) $(TCPIP_DIR)\tcpip_flush.c OBJS = $(OBJS) $(OBJS_DIR)\tcpip_flush.$(EXT_OBJ) CSRCS = $(CSRCS) $(TCPIP_DIR)\tcpip_recv.c OBJS = $(OBJS) $(OBJS_DIR)\tcpip_recv.$(EXT_OBJ) +CSRCS = $(CSRCS) $(TCPIP_DIR)\tcpip_stringtoaddr.c +OBJS = $(OBJS) $(OBJS_DIR)\tcpip_stringtoaddr.$(EXT_OBJ) CSRCS = $(CSRCS) $(TCPIP_DIR)\tcpipfile_create.c OBJS = $(OBJS) $(OBJS_DIR)\tcpipfile_create.$(EXT_OBJ) CSRCS = $(CSRCS) $(TCPIP_DIR)\tcpipfile_delete.c diff --git a/aplfw/build/common/tmp_mkinc/mk_inc.pl b/aplfw/build/common/tmp_mkinc/mk_inc.pl index adcd5f9..3d7f7c7 100755 --- a/aplfw/build/common/tmp_mkinc/mk_inc.pl +++ b/aplfw/build/common/tmp_mkinc/mk_inc.pl @@ -603,6 +603,7 @@ "tcpip_write.c", "tcpip_flush.c", "tcpip_recv.c", + "tcpip_stringtoaddr.c", "tcpipfile_create.c", "tcpipfile_delete.c", "tcpipfile_constructor.c", diff --git a/aplfw/driver/console/vt100/vt100drv_constructor.c b/aplfw/driver/console/vt100/vt100drv_constructor.c index db6a7a7..82221a5 100755 --- a/aplfw/driver/console/vt100/vt100drv_constructor.c +++ b/aplfw/driver/console/vt100/vt100drv_constructor.c @@ -21,7 +21,9 @@ void Vt100Drv_Constructor(C_VT100DRV *self, const T_DRVOBJ_METHODS *pMethods, HA DrvObj_Constructor(&self->DrvObj, pMethods); /* メンバ変数初期化 */ - self->hTty = hTty; + self->hTty = hTty; + self->iEscNum = 0; + self->iEscState = VT100DRV_ESC_IDLE; } diff --git a/aplfw/driver/tcpip/ipether/ipether_constructor.c b/aplfw/driver/tcpip/ipether/ipether_constructor.c index 5135800..f23ac43 100755 --- a/aplfw/driver/tcpip/ipether/ipether_constructor.c +++ b/aplfw/driver/tcpip/ipether/ipether_constructor.c @@ -46,7 +46,8 @@ FILE_ERR IpEther_Constructor(C_IPETHER *self, const T_DRVOBJ_METHODS *pMethods, /* 受信プロセス生成 */ self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL); - + SysPrc_Start(self->hPrcRecv); + return FILE_ERR_OK; } diff --git a/aplfw/driver/tcpip/ipether/ipether_getmacaddr.c b/aplfw/driver/tcpip/ipether/ipether_getmacaddr.c index 5807dad..f0a5a36 100755 --- a/aplfw/driver/tcpip/ipether/ipether_getmacaddr.c +++ b/aplfw/driver/tcpip/ipether/ipether_getmacaddr.c @@ -56,7 +56,7 @@ void IpEther_AddMacAddr(C_IPETHER *self, const unsigned char ubMacAddr[6], const memmove(&self->ArpTbl[0], &self->ArpTbl[1], (IPETHER_ARPTBL_SIZE-1) * sizeof(T_IPETHER_ARPTBL)); memcpy(self->ArpTbl[0].ubIpAddr, ubIpAddr, 4); memcpy(self->ArpTbl[0].ubMacAddr, ubMacAddr, 6); - + SysMtx_Unlock(self->hMtxArp); } diff --git a/aplfw/driver/tcpip/ipether/ipether_iocontrol.c b/aplfw/driver/tcpip/ipether/ipether_iocontrol.c index d923677..55fc6fd 100755 --- a/aplfw/driver/tcpip/ipether/ipether_iocontrol.c +++ b/aplfw/driver/tcpip/ipether/ipether_iocontrol.c @@ -16,11 +16,21 @@ FILE_ERR IpEther_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize) { C_IPETHER *self; + C_SYNCFILE *pFile; /* upper cast */ - self = (C_IPETHER *)pDrvObj; + self = (C_IPETHER *)pDrvObj; + pFile = (C_SYNCFILE *)pFileObj; - return FILE_ERR_NG; + switch ( iFunc ) + { + case FILE_IOCTL_IP_GETIP: + memcpy(pInBuf, self->ubMyIpAddr, 4); + return FILE_ERR_OK; + + default: + return SyncDrv_IoControl(pDrvObj, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize); + } } diff --git a/aplfw/driver/tcpip/ipether/ipether_local.h b/aplfw/driver/tcpip/ipether/ipether_local.h index 3e3b83b..610c62c 100755 --- a/aplfw/driver/tcpip/ipether/ipether_local.h +++ b/aplfw/driver/tcpip/ipether/ipether_local.h @@ -32,7 +32,7 @@ FILE_SIZE IpEther_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_ FILE_SIZE IpEther_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size); FILE_ERR IpEther_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj); -void IpEther_Recv(VPARAM Param); /* 受信プロセス */ +void IpEther_Recv(void); /* 受信プロセス */ FILE_ERR IpEther_GetMacAddr(C_IPETHER *self, unsigned char ubMacAddr[6], const unsigned char ubIpAddr[4]); /* MACアドレス解決 */ void IpEther_AddMacAddr(C_IPETHER *self, const unsigned char ubMacAddr[6], const unsigned char ubIpAddr[4]); /* MACアドレス登録 */ diff --git a/aplfw/driver/tcpip/ipether/ipether_recv.c b/aplfw/driver/tcpip/ipether/ipether_recv.c index 93aa9b9..65a732a 100755 --- a/aplfw/driver/tcpip/ipether/ipether_recv.c +++ b/aplfw/driver/tcpip/ipether/ipether_recv.c @@ -18,7 +18,7 @@ static void IpEther_RecvIp(C_IPETHER *self, unsigned char *pubBuf, int iSize); /* 受信プロセス */ -void IpEther_Recv(VPARAM Param) +void IpEther_Recv(void) { C_IPETHER *self; int iRecvTail; @@ -27,7 +27,7 @@ void IpEther_Recv(VPARAM Param) int iSize; /* upper cast */ - self = (C_IPETHER *)Param; + self = (C_IPETHER *)SysPrc_GetParam(SysPrc_GetCurrentHandle()); for ( ; ; ) { diff --git a/aplfw/driver/tcpip/tcpip/tcpip.h b/aplfw/driver/tcpip/tcpip/tcpip.h index 9530deb..efdea52 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip.h +++ b/aplfw/driver/tcpip/tcpip/tcpip.h @@ -60,8 +60,10 @@ typedef struct c_tcpip extern "C" { #endif -HANDLE TcpIp_Create(const char *pszIp); /**< コンストラクタ */ -void TcpIp_Delete(HANDLE hDriver); /**< デストラクタ */ +HANDLE TcpIp_Create(const char *pszIp); /**< コンストラクタ */ +void TcpIp_Delete(HANDLE hDriver); /**< デストラクタ */ + +FILE_ERR TcpIp_StringToAddr(T_TCPIP_ADDRESS *pAddr, const char *pszString); #ifdef __cplusplus } diff --git a/aplfw/driver/tcpip/tcpip/tcpip_close.c b/aplfw/driver/tcpip/tcpip/tcpip_close.c index d6f8d2d..5254664 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_close.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_close.c @@ -15,9 +15,17 @@ void TcpIp_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj) { C_TCPIP *self; + C_TCPIPFILE *pFile; /* upper cast */ - self = (C_TCPIP *)pDrvObj; + self = (C_TCPIP *)pDrvObj; + pFile = (C_TCPIPFILE *)pFileObj; + + /* クローズ処理 */ + self->iOpenCount--; + + /* ディスクリプタ削除 */ + TcpIpFile_Delete(pFile); } diff --git a/aplfw/driver/tcpip/tcpip/tcpip_constructor.c b/aplfw/driver/tcpip/tcpip/tcpip_constructor.c index 0c8baf2..7c3c6a9 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_constructor.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_constructor.c @@ -13,21 +13,47 @@ #include "tcpip_local.h" +/* 仮想関数テーブル */ +static const T_DRVOBJ_METHODS TcpIp_Methods = + { + { TcpIp_Delete }, + TcpIp_Open, + TcpIp_Close, + TcpIp_IoControl, + TcpIp_Seek, + TcpIp_Read, + TcpIp_Write, + TcpIp_Flush, + }; + + /** コンストラクタ */ -FILE_ERR TcpIp_Constructor(C_TCPIP *self, const T_DRVOBJ_METHODS *pMethods, const char *pszIp) +FILE_ERR TcpIp_Constructor(C_TCPIP *self, const T_DRVOBJ_METHODS *pMethods, const char *pszIp) { + if ( pMethods == NULL ) + { + pMethods = &TcpIp_Methods; + } + + /* IP層オープン */ self->hIp = File_Open(pszIp, FILE_OPEN_READ | FILE_OPEN_WRITE | FILE_OPEN_EXIST); if ( self->hIp == HANDLE_NULL ) { return FILE_ERR_NG; } - + + /* IPアドレス取得 */ + File_IoControl(self->hIp, FILE_IOCTL_IP_GETIP, self->ubMyIpAddr, 4, NULL, 0); + + /* 親クラスコンストラクタ呼び出し */ SyncDrv_Constructor(&self->SyncDrv, pMethods, SYNCDRV_FACTOR_NUM); /* メンバ変数初期化 */ self->iOpenCount = 0; + self->pUdpHead = NULL; + self->pTcpHead = NULL; /* ミューテックス生成 */ self->hMtxLock = SysMtx_Create(SYSMTX_ATTR_NORMAL); @@ -35,9 +61,10 @@ FILE_ERR TcpIp_Constructor(C_TCPIP *self, const T_DRVOBJ_METHODS *pMethods, con /* 受信プロセス生成 */ self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL); + SysPrc_Start(self->hPrcRecv); return FILE_ERR_OK; } -/* endof file */ +/* end of file */ diff --git a/aplfw/driver/tcpip/tcpip/tcpip_create.c b/aplfw/driver/tcpip/tcpip/tcpip_create.c index 7448646..19840a6 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_create.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_create.c @@ -13,19 +13,6 @@ #include "tcpip_local.h" -/* 仮想関数テーブル */ -static const T_DRVOBJ_METHODS TcpIp_Methods = - { - { TcpIp_Delete }, - TcpIp_Open, - TcpIp_Close, - TcpIp_IoControl, - TcpIp_Seek, - TcpIp_Read, - TcpIp_Write, - TcpIp_Flush, - }; - /** 生成 */ HANDLE TcpIp_Create(const char *pszIp) @@ -39,7 +26,7 @@ HANDLE TcpIp_Create(const char *pszIp) } /* コンストラクタ呼び出し */ - if ( TcpIp_Constructor(self, &TcpIp_Methods, pszIp) != FILE_ERR_OK ) + if ( TcpIp_Constructor(self, NULL, pszIp) != FILE_ERR_OK ) { SysMem_Free(self); return HANDLE_NULL; diff --git a/aplfw/driver/tcpip/tcpip/tcpip_local.h b/aplfw/driver/tcpip/tcpip/tcpip_local.h index 82fc1ee..59307ee 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_local.h +++ b/aplfw/driver/tcpip/tcpip/tcpip_local.h @@ -44,7 +44,7 @@ FILE_ERR TcpIp_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj); int TcpIp_GetSendBuf(C_TCPIP *self, void **ppBuf); /* IPデータグラム送信バッファ取得 */ void TcpIp_SendBuf(C_TCPIP *self, void **ppBuf); /* IPデータグラムバッファ送信 */ -void TcpIp_Recv(VPARAM Param); /* IPパケット受信プロセス */ +void TcpIp_Recv(void); /* IPパケット受信プロセス */ #ifdef __cplusplus diff --git a/aplfw/driver/tcpip/tcpip/tcpip_open.c b/aplfw/driver/tcpip/tcpip/tcpip_open.c index d907144..46e9ec0 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_open.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_open.c @@ -28,19 +28,15 @@ HANDLE TcpIp_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode) { return HANDLE_NULL; } - - if ( (hFile = SysMem_Alloc(sizeof(C_TCPIPFILE))) == NULL ) - { - return HANDLE_NULL; - } pFile = (C_TCPIPFILE *)hFile; - /* デバイスオープン処理 */ if ( self->iOpenCount++ == 0 ) { + /* デバイスオープン処理 */ } + /* オープン処理 */ if ( strncmp(pszPath, "udp:", 4) == 0 ) { diff --git a/aplfw/driver/tcpip/tcpip/tcpip_recv.c b/aplfw/driver/tcpip/tcpip/tcpip_recv.c index 03cee48..763ca54 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_recv.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_recv.c @@ -21,14 +21,14 @@ static void TcpIp_TcpRecv(C_TCPIP *self, const unsigned char *pubBuf, int iSize) /* 受信プロセス */ -void TcpIp_Recv(VPARAM Param) +void TcpIp_Recv(void) { C_TCPIP *self; unsigned char *pubRecvBuf; int iSize; /* upper cast */ - self = (C_TCPIP *)Param; + self = (C_TCPIP *)SysPrc_GetParam(SysPrc_GetCurrentHandle()); pubRecvBuf = self->ubRecvBuf; diff --git a/aplfw/driver/tcpip/tcpip/tcpip_stringtoaddr.c b/aplfw/driver/tcpip/tcpip/tcpip_stringtoaddr.c new file mode 100755 index 0000000..f159c5b --- /dev/null +++ b/aplfw/driver/tcpip/tcpip/tcpip_stringtoaddr.c @@ -0,0 +1,62 @@ +/** + * Hyper Operating System Application Framework + * + * @file tcpip.h + * @brief %jp{TCP/IP プロトコル} + * + * Copyright (C) 2006-2007 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "tcpip_local.h" + + +FILE_ERR TcpIp_StringToAddr(T_TCPIP_ADDRESS *pAddr, const char *pszString) +{ + int iState = 0; + int c; + + /* 初期化 */ + pAddr->ubAddress[0] = 0; + pAddr->ubAddress[1] = 0; + pAddr->ubAddress[2] = 0; + pAddr->ubAddress[3] = 0; + pAddr->uhPort = 0; + + while ( (c = *pszString++) != '\0' ) + { + if ( c == '.' ) + { + if ( iState >= 3 ) + { + return FILE_ERR_NG; + } + iState++; + } + else if ( c == ':' ) + { + iState = 4; + } + else if ( c >= '0' && c <= '9' ) + { + if ( iState < 4 ) + { + pAddr->ubAddress[iState] = (c - '0') + (pAddr->ubAddress[iState] * 10); + } + else + { + pAddr->uhPort = (c - '0') + (pAddr->uhPort * 10); + } + } + else + { + return FILE_ERR_NG; + } + } + + return FILE_ERR_OK; +} + + +/* endof file */ diff --git a/aplfw/driver/tcpip/tcpip/tcpip_write.c b/aplfw/driver/tcpip/tcpip/tcpip_write.c index 0133344..37e3a96 100755 --- a/aplfw/driver/tcpip/tcpip/tcpip_write.c +++ b/aplfw/driver/tcpip/tcpip/tcpip_write.c @@ -20,9 +20,8 @@ FILE_SIZE TcpIp_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, C_TCPIP *self; C_TCPIPFILE *pFile; C_IPCHECKSUM ics; - unsigned short uhSum; unsigned char *pubSendBuf; - int iSendSize; + unsigned short uhSendSize; /* upper cast */ self = (C_TCPIP *)pDrvObj; @@ -31,19 +30,23 @@ FILE_SIZE TcpIp_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, if ( pFile->iType == TCPIPFILE_TYPE_UDP ) { + unsigned char ubDumyHeader[2] = {0x00, 0x11}; const T_TCPIP_ADDRESS *pAddr; - const unsigned char *pubData; + const unsigned char *pubPayload; + unsigned short uhPayloadSize; + unsigned short uhSum; - pAddr = (const T_TCPIP_ADDRESS *)pData; - pubData = (const unsigned char *)pData + sizeof(T_TCPIP_ADDRESS); + pAddr = (const T_TCPIP_ADDRESS *)pData; + pubPayload = (const unsigned char *)pData + sizeof(T_TCPIP_ADDRESS); + uhPayloadSize = Size - sizeof(T_TCPIP_ADDRESS); + uhSendSize = uhPayloadSize + 28; + /* バッファ準備 */ + pubSendBuf = pFile->ubSendBuf; - SysMtx_Lock(self->hMtxSend); - - pubSendBuf = self->ubSendBuf; /******** IPヘッダ ********/ - + /* バージョン4, ヘッダ長 0x14 */ pubSendBuf[0] = 0x45; @@ -51,12 +54,10 @@ FILE_SIZE TcpIp_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, pubSendBuf[1] = 0x00; /* データ長 */ - pubSendBuf[2] = iSendSize / 256; - pubSendBuf[3] = iSendSize % 256; + IP_SET_HALFWORD(&pubSendBuf[2], uhSendSize); /* ID */ - pubSendBuf[4] = self->uhPacketId / 256; - pubSendBuf[5] = self->uhPacketId % 256; + IP_SET_HALFWORD(&pubSendBuf[4], self->uhPacketId); self->uhPacketId++; /* フラグメント */ @@ -67,14 +68,13 @@ FILE_SIZE TcpIp_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, pubSendBuf[8] = 0xff; /* プロトコル */ - pubSendBuf[9] = 0x17; /* UDP */ + pubSendBuf[9] = 17; /* UDP */ /* チェックサム */ - pubSendBuf[10] = 0; - pubSendBuf[11] = 0; + IP_SET_HALFWORD(&pubSendBuf[10], 0); /* 送信元IPアドレス */ -/* memcpy(&pubSendBuf[12], self->ubMyIpAddr, 4); */ + memcpy(&pubSendBuf[12], self->ubMyIpAddr, 4); /* 送信先IPアドレス */ memcpy(&pubSendBuf[16], &pAddr->ubAddress, 4); @@ -86,17 +86,30 @@ FILE_SIZE TcpIp_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, IP_SET_HALFWORD(&pubSendBuf[20], pFile->uhPortNum); /* 発信先ポート番号 */ - IP_SET_HALFWORD(&pubSendBuf[22], pFile->uhPortNum); + IP_SET_HALFWORD(&pubSendBuf[22], pAddr->uhPort); /* データ長 */ - IP_SET_HALFWORD(&pubSendBuf[24], Size - sizeof(T_TCPIP_ADDRESS) + 8); + IP_SET_HALFWORD(&pubSendBuf[24], uhPayloadSize + 8); /* チェックサム */ IP_SET_HALFWORD(&pubSendBuf[26], 0); - /* データ */ - memcpy(&pubSendBuf[28], pubData, Size - sizeof(T_TCPIP_ADDRESS)); + /* ペイロードデータ */ + memcpy(&pubSendBuf[28], pubPayload, uhPayloadSize); + + /* チェックサム計算 */ + IpCheckSum_Create(&ics); + IpCheckSum_Update(&ics, &pubSendBuf[12], 8); /* 送信元IP+宛先IP */ + IpCheckSum_Update(&ics, ubDumyHeader, 2); /* 00h, 11h */ + IpCheckSum_Update(&ics, &pubSendBuf[24], 2); /* UDPデータ長 */ + IpCheckSum_Update(&ics, &pubSendBuf[20], 8 + uhPayloadSize); /* UDPヘッダ+ペイロード */ + uhSum = IpCheckSum_GetDigest(&ics); + IP_SET_HALFWORD(&pubSendBuf[26], uhSum); + IpCheckSum_Delete(&ics); + SysMtx_Lock(self->hMtxSend); + File_Write(self->hIp, pubSendBuf, uhSendSize); + SysMtx_Unlock(self->hMtxSend); } return Size; diff --git a/aplfw/driver/tcpip/tcpip/tcpipfile.h b/aplfw/driver/tcpip/tcpip/tcpipfile.h index 41e696f..ed33806 100755 --- a/aplfw/driver/tcpip/tcpip/tcpipfile.h +++ b/aplfw/driver/tcpip/tcpip/tcpipfile.h @@ -39,6 +39,7 @@ typedef struct c_tcpipfile C_STREAMBUF RecvBuf; unsigned char ubRecvBuf[TCPIPFILE_RECV_BUFSIZE]; + unsigned char ubSendBuf[TCPIPFILE_RECV_BUFSIZE]; } C_TCPIPFILE; diff --git a/aplfw/driver/tcpip/tcpip/tcpipfile_create.c b/aplfw/driver/tcpip/tcpip/tcpipfile_create.c index a10a7ae..c0d1c02 100755 --- a/aplfw/driver/tcpip/tcpip/tcpipfile_create.c +++ b/aplfw/driver/tcpip/tcpip/tcpipfile_create.c @@ -29,7 +29,7 @@ HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp, int iMode) } /* コンストラクタ呼び出し */ - FatFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp, iMode); + TcpIpFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp, iMode); return (HANDLE)self; } diff --git a/aplfw/driver/volume/fat/fatvol_clusterwrite.c b/aplfw/driver/volume/fat/fatvol_clusterwrite.c index 48df43e..d11bae0 100755 --- a/aplfw/driver/volume/fat/fatvol_clusterwrite.c +++ b/aplfw/driver/volume/fat/fatvol_clusterwrite.c @@ -12,6 +12,9 @@ #include "fatvol_local.h" +#include "hosaplfw.h" + + /** クラスタ書き込み */ int FatVol_ClusterWrite( C_FATVOL *self, @@ -21,6 +24,9 @@ int FatVol_ClusterWrite( FATVOL_UINT uiPos; FATVOL_UINT uiSize; +/* StdIo_PrintFormat("[FatLol] write cluster %08x\n", uiCluster); */ + + if ( uiCluster >= 0xf0000000 && (self->iFatType == FATVOL_TYPE_FAT12 || self->iFatType == FATVOL_TYPE_FAT16) ) { /* FAT12/16 のルートディレクトリを 0xf0000000 にマップ */ diff --git a/aplfw/library/algorithm/ipchecksum/ipchecksum_getdigest.c b/aplfw/library/algorithm/ipchecksum/ipchecksum_getdigest.c index a0e5228..471eaae 100755 --- a/aplfw/library/algorithm/ipchecksum/ipchecksum_getdigest.c +++ b/aplfw/library/algorithm/ipchecksum/ipchecksum_getdigest.c @@ -20,9 +20,8 @@ unsigned short IpCheckSum_GetDigest(C_IPCHECKSUM *self) uwSum = (uwSum & 0xffff) + (uwSum >> 16); uwSum = (uwSum & 0xffff) + (uwSum >> 16); - uwSum = (~uwSum & 0xffff); - - return (unsigned short)uwSum; + + return (unsigned short)~uwSum; } diff --git a/aplfw/system/file/file.h b/aplfw/system/file/file.h index 6fe6d95..54ed1c0 100755 --- a/aplfw/system/file/file.h +++ b/aplfw/system/file/file.h @@ -26,6 +26,7 @@ #define FILE_ERR_NG (-1) /* エラー */ #define FILE_ERR_BUSY (-2) /* 他のプロセスが利用中(ブロッキングモード以外でポーリング失敗) */ #define FILE_ERR_BACKGROUND (-3) /* バックグラウンドで処理受付成功 */ +#define FILE_ERR_TIMEOUT (-4) /* タイムアウト */ /* 定数定義 */ #define FILE_EOF (-1) @@ -227,10 +228,11 @@ FILE_ERR File_ReadDir(HANDLE hFile, T_FILE_FILEINF *pFileInf); FILE_POS File_GetFileSize(HANDLE hFile); FILE_SIZE File_GetReadSize(HANDLE hFile); FILE_SIZE File_GetWriteSize(HANDLE hFile); + FILE_SIZE File_GetReadBuf(HANDLE hFile, void **ppBuf); -FILE_SIZE File_RelReadBuf(HANDLE hFile, void *pBuf, long lSize); +FILE_SIZE File_RelReadBuf(HANDLE hFile, void *pBuf, FILE_SIZE Size); FILE_SIZE File_GetWriteBuf(HANDLE hFile, void **ppBuf); -FILE_SIZE File_SendWriteBuf(HANDLE hFile, void *pBuf, long lSize); +FILE_SIZE File_SendWriteBuf(HANDLE hFile, void *pBuf, FILE_SIZE Size); FILE_ERR File_CanWriteBuf(HANDLE hFile, void *pBuf); /* ディレクトリ操作 */ diff --git a/aplfw/system/file/fileobj.h b/aplfw/system/file/fileobj.h index 73bede6..a20c151 100755 --- a/aplfw/system/file/fileobj.h +++ b/aplfw/system/file/fileobj.h @@ -32,9 +32,11 @@ typedef struct c_fileobj { C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */ - int iMode; /* オープン時のモード */ - struct c_drvobj *pDrvObj; /* ドライバへの参照 */ + + int iMode; /* オープン時のモード */ + void *pReadBuf; /* リードバッファ */ + void *pWriteBuf; /* ライトバッファ */ } C_FILEOBJ; diff --git a/aplfw/system/file/fileobj_constructor.c b/aplfw/system/file/fileobj_constructor.c index f6fa346..f485434 100755 --- a/aplfw/system/file/fileobj_constructor.c +++ b/aplfw/system/file/fileobj_constructor.c @@ -19,8 +19,10 @@ void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, C_D HandleObj_Constructor(&self->HandleObj, &pMethods->HandlObjMethods); /* メンバ変数初期化 */ - self->pDrvObj = pDrvObj; - self->iMode = iMode; + self->pDrvObj = pDrvObj; + self->iMode = iMode; + self->pReadBuf = NULL; + self->pWriteBuf = NULL; } diff --git a/aplfw/system/file/fileobj_destructor.c b/aplfw/system/file/fileobj_destructor.c index 86477da..fd8c2fd 100755 --- a/aplfw/system/file/fileobj_destructor.c +++ b/aplfw/system/file/fileobj_destructor.c @@ -13,6 +13,16 @@ void FileObj_Destructor(C_FILEOBJ *self) { + /* バッファを確保していれば開放 */ + if ( self->pReadBuf != NULL ) + { + SysMem_Free(self->pReadBuf); + } + if ( self->pWriteBuf != NULL ) + { + SysMem_Free(self->pWriteBuf); + } + /* 親クラスデストラクタ呼び出し */ HandleObj_Destructor(&self->HandleObj); } diff --git a/aplfw/system/file/sysvol.h b/aplfw/system/file/sysvol.h index 3a5b252..e503913 100755 --- a/aplfw/system/file/sysvol.h +++ b/aplfw/system/file/sysvol.h @@ -19,7 +19,7 @@ #include "system/file/volumeobj.h" -#define DEVVOL_MAX_DEVICE 8 +#define DEVVOL_MAX_DEVICE 16 #define DEVVOL_MAX_NAME 16 /* デバイス情報 */ diff --git a/aplfw/system/process/process.h b/aplfw/system/process/process.h index 313c84e..c176fe8 100755 --- a/aplfw/system/process/process.h +++ b/aplfw/system/process/process.h @@ -20,10 +20,10 @@ /* (とりあえず適当、そのうちTSSとか真面目にやるときの為にひとまず) */ -#define PROCESS_PRIORITY_IDLE 14 -#define PROCESS_PRIORITY_LOW 13 -#define PROCESS_PRIORITY_NORMAL 12 -#define PROCESS_PRIORITY_HIGH 11 +#define PROCESS_PRIORITY_IDLE 50 +#define PROCESS_PRIORITY_LOW 40 +#define PROCESS_PRIORITY_NORMAL 30 +#define PROCESS_PRIORITY_HIGH 20 #define PROCESS_PRIORITY_REALTIME 10 #define PROCESS_SIGNAL_HUP 1 diff --git a/kernel/build/common/gmake/knldep.inc b/kernel/build/common/gmake/knldep.inc index 82598ab..32c4f8a 100755 --- a/kernel/build/common/gmake/knldep.inc +++ b/kernel/build/common/gmake/knldep.inc @@ -50,6 +50,8 @@ $(OBJS_DIR)/cre_hep.$(EXT_OBJ): $(HEP_DIR)/cre_hep.c $(COMMON_HEADERS) $(OBJS_DIR)/alc_hep.$(EXT_OBJ): $(HEP_DIR)/alc_hep.c $(COMMON_HEADERS) $(OBJS_DIR)/fre_hep.$(EXT_OBJ): $(HEP_DIR)/fre_hep.c $(COMMON_HEADERS) +$(OBJS_DIR)/ini_dpc.$(EXT_OBJ): $(DPC_DIR)/ini_dpc.c $(COMMON_HEADERS) +$(OBJS_DIR)/req_dpc.$(EXT_OBJ): $(DPC_DIR)/req_dpc.c $(COMMON_HEADERS) $(OBJS_DIR)/exe_dpc.$(EXT_OBJ): $(DPC_DIR)/exe_dpc.c $(COMMON_HEADERS) $(OBJS_DIR)/frcv_adq.$(EXT_OBJ): $(ADTQ_DIR)/frcv_adq.c $(COMMON_HEADERS) diff --git a/kernel/build/common/gmake/knlsrc.inc b/kernel/build/common/gmake/knlsrc.inc index 66e1e6f..9072df4 100755 --- a/kernel/build/common/gmake/knlsrc.inc +++ b/kernel/build/common/gmake/knlsrc.inc @@ -154,6 +154,8 @@ CSRCS += $(HEP_DIR)/fre_hep.c # Deferrable procedure call DPC_DIR = $(KERNEL_CORE_DIR)/dpc SRC_DIRS += $(DPC_DIR) +CSRCS += $(DPC_DIR)/ini_dpc.c +CSRCS += $(DPC_DIR)/req_dpc.c CSRCS += $(DPC_DIR)/exe_dpc.c diff --git a/kernel/build/common/nmake/knldep.inc b/kernel/build/common/nmake/knldep.inc index 36f8faa..edd2466 100755 --- a/kernel/build/common/nmake/knldep.inc +++ b/kernel/build/common/nmake/knldep.inc @@ -124,6 +124,12 @@ $(OBJS_DIR)\fre_hep.c : $(HEP_DIR)\fre_hep.c $(CMD_CP) $(HEP_DIR)\fre_hep.c $(OBJS_DIR)\ +$(OBJS_DIR)\ini_dpc.c : $(DPC_DIR)\ini_dpc.c + $(CMD_CP) $(DPC_DIR)\ini_dpc.c $(OBJS_DIR)\ + +$(OBJS_DIR)\req_dpc.c : $(DPC_DIR)\req_dpc.c + $(CMD_CP) $(DPC_DIR)\req_dpc.c $(OBJS_DIR)\ + $(OBJS_DIR)\exe_dpc.c : $(DPC_DIR)\exe_dpc.c $(CMD_CP) $(DPC_DIR)\exe_dpc.c $(OBJS_DIR)\ @@ -484,6 +490,8 @@ $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\cre_hep.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\alc_hep.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\fre_hep.c $(COMMON_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\ini_dpc.c $(COMMON_HEADERS) +$(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\req_dpc.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\exe_dpc.c $(COMMON_HEADERS) $(OBJS_DIR)\exe_isr..$(EXT_OBJ): $(OBJS_DIR)\frcv_adq.c $(COMMON_HEADERS) diff --git a/kernel/build/common/nmake/knlsrc.inc b/kernel/build/common/nmake/knlsrc.inc index 58768e3..d0c5a4d 100755 --- a/kernel/build/common/nmake/knlsrc.inc +++ b/kernel/build/common/nmake/knlsrc.inc @@ -180,7 +180,11 @@ OBJS = $(OBJS) $(OBJS_DIR)\fre_hep.$(EXT_OBJ) # Deferrable procedure call DPC_DIR = $(KERNEL_CORE_DIR)\dpc +CSRCS = $(CSRCS) $(DPC_DIR)\ini_dpc.c +CSRCS = $(CSRCS) $(DPC_DIR)\req_dpc.c CSRCS = $(CSRCS) $(DPC_DIR)\exe_dpc.c +OBJS = $(OBJS) $(OBJS_DIR)\ini_dpc.$(EXT_OBJ) +OBJS = $(OBJS) $(OBJS_DIR)\req_dpc.$(EXT_OBJ) OBJS = $(OBJS) $(OBJS_DIR)\exe_dpc.$(EXT_OBJ) diff --git a/kernel/build/common/tmp_mkinc/mk_inc.pl b/kernel/build/common/tmp_mkinc/mk_inc.pl index 3965a81..695cf2c 100755 --- a/kernel/build/common/tmp_mkinc/mk_inc.pl +++ b/kernel/build/common/tmp_mkinc/mk_inc.pl @@ -85,6 +85,8 @@ "\$(COMMON_HEADERS)", "\$(KERNEL_CORE_DIR)/dpc", "DPC_DIR", + "ini_dpc.c", + "req_dpc.c", "exe_dpc.c", ], [ diff --git a/kernel/include/config/cfgknl.h b/kernel/include/config/cfgknl.h index 5a7941d..734f801 100755 --- a/kernel/include/config/cfgknl.h +++ b/kernel/include/config/cfgknl.h @@ -339,25 +339,25 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_ACRE_TSK TRUE /* acre_tsk */ #define _KERNEL_CFG_DEL_TSK TRUE /* del_tsk */ #define _KERNEL_CFG_ACT_TSK TRUE /* act_tsk */ -#define _KERNEL_CFG_IACT_TSK FALSE /* iact_tsk */ -#define _KERNEL_CFG_CAN_ACT FALSE /* can_act */ -#define _KERNEL_CFG_STA_TSK FALSE /* sta_tsk */ -#define _KERNEL_CFG_EXT_TSK FALSE /* ext_tsk */ -#define _KERNEL_CFG_EXD_TSK FALSE /* exd_tsk */ -#define _KERNEL_CFG_TER_TSK FALSE /* ter_tsk */ +#define _KERNEL_CFG_IACT_TSK TRUE /* iact_tsk */ +#define _KERNEL_CFG_CAN_ACT TRUE /* can_act */ +#define _KERNEL_CFG_STA_TSK TRUE /* sta_tsk */ +#define _KERNEL_CFG_EXT_TSK TRUE /* ext_tsk */ +#define _KERNEL_CFG_EXD_TSK TRUE /* exd_tsk */ +#define _KERNEL_CFG_TER_TSK TRUE /* ter_tsk */ #define _KERNEL_CFG_CHG_PRI TRUE /* chg_pri */ -#define _KERNEL_CFG_GET_PRI FALSE /* get_pri */ +#define _KERNEL_CFG_GET_PRI TRUE /* get_pri */ #define _KERNEL_CFG_REF_TSK TRUE /* ref_tsk */ -#define _KERNEL_CFG_REF_TST FALSE /* ref_tst */ +#define _KERNEL_CFG_REF_TST TRUE /* ref_tst */ /* Task dependent synchronization functions */ #define _KERNEL_CFG_SLP_TSK TRUE /* slp_tsk */ -#define _KERNEL_CFG_TSLP_TSK FALSE /* tslp_tsk */ +#define _KERNEL_CFG_TSLP_TSK TRUE /* tslp_tsk */ #define _KERNEL_CFG_WUP_TSK TRUE /* wup_tsk */ -#define _KERNEL_CFG_IWUP_TSK FALSE /* iwup_tsk */ -#define _KERNEL_CFG_CAN_WUP FALSE /* can_wup */ +#define _KERNEL_CFG_IWUP_TSK TRUE /* iwup_tsk */ +#define _KERNEL_CFG_CAN_WUP TRUE /* can_wup */ #define _KERNEL_CFG_REL_WAI TRUE /* rel_wai */ -#define _KERNEL_CFG_IREL_WAI FALSE /* irel_wai */ +#define _KERNEL_CFG_IREL_WAI TRUE /* irel_wai */ #define _KERNEL_CFG_SUS_TSK TRUE /* sus_tsk */ #define _KERNEL_CFG_RSM_TSK TRUE /* rsm_tsk */ #define _KERNEL_CFG_FRSM_TSK TRUE /* frsm_tsk */ @@ -392,7 +392,7 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_CLR_FLG TRUE /* clr_flg */ #define _KERNEL_CFG_WAI_FLG TRUE /* wai_flg */ #define _KERNEL_CFG_POL_FLG TRUE /* pol_flg */ -#define _KERNEL_CFG_TWAI_FLG FALSE /* twai_flg */ +#define _KERNEL_CFG_TWAI_FLG TRUE /* twai_flg */ #define _KERNEL_CFG_REF_FLG TRUE /* ref_flg */ /* Data queues */ @@ -401,12 +401,12 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_DEL_DTQ TRUE /* del_dtq */ #define _KERNEL_CFG_SND_DTQ TRUE /* snd_dtq */ #define _KERNEL_CFG_IPSND_DT TRUE /* ipsnd_dtq */ -#define _KERNEL_CFG_TSND_DTQ FALSE /* tsnd_dtq */ +#define _KERNEL_CFG_TSND_DTQ TRUE /* tsnd_dtq */ #define _KERNEL_CFG_FSND_DTQ TRUE /* fsnd_dtq */ #define _KERNEL_CFG_IFSND_DT TRUE /* ifsnd_dtq */ #define _KERNEL_CFG_RCV_DTQ TRUE /* rcv_dtq */ #define _KERNEL_CFG_PRCV_DTQ TRUE /* prcv_dtq */ -#define _KERNEL_CFG_TRCV_DTQ FALSE /* trcv_dtq */ +#define _KERNEL_CFG_TRCV_DTQ TRUE /* trcv_dtq */ #define _KERNEL_CFG_REF_DTQ TRUE /* ref_dtq */ /* Mailboxes */ @@ -416,7 +416,7 @@ C言語構文(例えばtypedefなど)はこの中には記載せず、マクロ #define _KERNEL_CFG_SND_MBX TRUE /* snd_mbx */ #define _KERNEL_CFG_RCV_MBX TRUE /* rcv_mbx */ #define _KERNEL_CFG_PRCV_MBX TRUE /* prcv_mbx */ -#define _KERNEL_CFG_TRCV_MBX FALSE /* trcv_mbx */ +#define _KERNEL_CFG_TRCV_MBX TRUE /* trcv_mbx */ #define _KERNEL_CFG_REF_MBX TRUE /* ref_mbx */ /* Mutexes */ diff --git a/kernel/include/core/dpc.h b/kernel/include/core/dpc.h index 0bd6f64..0446b1d 100755 --- a/kernel/include/core/dpc.h +++ b/kernel/include/core/dpc.h @@ -4,7 +4,7 @@ * @file dpc.h * @brief %jp{遅延プロシージャーコールヘッダファイル}%en{Deferred Procedure Call header file} * - * Copyright (C) 1998-2006 by Project HOS + * Copyright (C) 1998-2008 by Project HOS * http://sourceforge.jp/projects/hos/ */ @@ -13,12 +13,21 @@ #define _KERNEL__core__dpc_h__ -#include "core/adtq.h" + +typedef struct _kernel_t_dpcmsg +{ + void (*svc)(ID id, VP_INT param); + ID id; + VP_INT param; +} _KERNEL_T_DPCMSG; typedef struct _kernel_t_dpccb { - _KERNEL_T_ADTQCB adtq; /**< 遅延プロシージャコール用非同期メッセージキュー */ + volatile _KERNEL_T_DPCMSG *que; + UH quecnt; + volatile UH head; + volatile UH tail; } _KERNEL_T_DPCCB; @@ -26,18 +35,17 @@ typedef struct _kernel_t_dpccb extern "C" { #endif -void _kernel_exe_dpc(void); +void _kernel_ini_dpc(_KERNEL_T_DPCCB *dcpcb, _KERNEL_T_DPCMSG *que, INT quecnt); +ER _kernel_req_dpc(_KERNEL_T_DPCCB *dcpcb, void (*svc)(ID id, VP_INT param), ID id, VP_INT param); +void _kernel_exe_dpc(_KERNEL_T_DPCCB *dcpcb); #ifdef __cplusplus } #endif -#define _KERNEL_DPC_INI_DPC(dcpcb, que, quecnt) _KERNEL_ADTQ_INI_QUE(&(dcpcb)->adtq, que, quecnt) -#define _KERNEL_DPC_EXE_DPC() _kernel_exe_dpc() -#define _KERNEL_DPC_SND_MSG(dcpcb, msg) _KERNEL_ADTQ_FSND_DAT(&(dcpcb)->adtq, (msg)) -#define _KERNEL_DPC_RCV_MSG(dcpcb) _KERNEL_ADTQ_FRCV_DAT(&(dcpcb)->adtq) -#define _KERNEL_DPC_REF_DAT(dcpcb) _KERNEL_ADTQ_REF_SDTQNT(&(dcpcb)->adtq) /* データ数参照 */ -#define _KERNEL_DPC_REF_FRE(dcpcb) _KERNEL_ADTQ_REF_FDTQNT(&(dcpcb)->adtq) /* 空き領域参照 */ +#define _KERNEL_INI_DPC(dcpcb, que, quecnt) _kernel_ini_dpc(dcpcb, que, quecnt) /**< %jp{DPCキューの初期化} */ +#define _KERNEL_REQ_DPC(dcpcb, svc, id, param) _kernel_req_dpc(dcpcb, svc, id, param) /**< %jp{DPCキューへ実行リクエスト} */ +#define _KERNEL_EXE_DPC(dcpcb) _kernel_exe_dpc(dcpcb) /**< %jp{DPCキューの実行} */ #endif /* _KERNEL__core__dpc_h__ */ diff --git a/kernel/include/core/sys.h b/kernel/include/core/sys.h index c8ac7ef..94585b1 100755 --- a/kernel/include/core/sys.h +++ b/kernel/include/core/sys.h @@ -130,6 +130,20 @@ extern const _KERNEL_T_SYSCB_RO _kernel_syscb_ro; #define _KERNEL_SYS_FRE_HEP(ptr) _KERNEL_FRE_HEP(_KERNEL_SYS_GET_HEP(), (ptr)) /**< %jp{カーネルメモリの開放} */ #define _KERNEL_SYS_ALG_HEP(size) _KERNEL_ALG_HEP(_KERNEL_SYS_GET_HEP(), (size)) /**< %jp{カーネルメモリのサイズアライメント} */ +/* kernel dpc queue */ +#if _KERNEL_SPT_DPC +#define _KERNEL_SYS_GET_DPC() (&_kernel_syscb.dpccb) /**< %jp{DPCキューの取得} */ +#define _KERNEL_SYS_INI_DPC(que, quecnt) _KERNEL_INI_DPC(_KERNEL_SYS_GET_DPC(), (que), (quecnt)) /**< %jp{DPCキューの初期化} */ +#define _KERNEL_SYS_REQ_DPC(svc, id, param) _KERNEL_REQ_DPC(_KERNEL_SYS_GET_DPC(), (svc), (id), (param)) /**< %jp{DPCキューへ実行リクエスト} */ +#define _KERNEL_SYS_EXE_DPC() _KERNEL_EXE_DPC(_KERNEL_SYS_GET_DPC()) /**< %jp{DPCキューの実行} */ +#else +#define _KERNEL_SYS_GET_DPC() NULL /**< %jp{DPCキューの取得} */ +#define _KERNEL_SYS_INI_DPC(que, quecnt) do {} while (0) /**< %jp{DPCキューの初期化} */ +#define _KERNEL_SYS_REQ_DPC(svc, id, param) E_NOMEM /**< %jp{DPCキューへ実行リクエスト} */ +#define _KERNEL_SYS_EXE_DPC() do {} while (0) /**< %jp{DPCキューの実行} */ +#endif + + #define _KERNEL_SYS_INI_SYSSTK(stksz, stk) do { _KERNEL_SYS_GET_PRCCB()->sysstksz = (stksz); _KERNEL_SYS_GET_PRCCB()->sysstk = (stk); } while(0) /**< %jp{システムスタックの初期化} */ @@ -176,9 +190,8 @@ extern const _KERNEL_T_SYSCB_RO _kernel_syscb_ro; #define _KERNEL_SYS_SNS_SVC() (_KERNEL_SYS_GET_PRCCB()->svcent) #define _KERNEL_ENTER_SVC() do { _KERNEL_SYS_SET_SVC(); } while (0) -#define _KERNEL_LEAVE_SVC() do { _KERNEL_DPC_EXE_DPC(); _KERNEL_SYS_CLR_SVC(); } while (0) +#define _KERNEL_LEAVE_SVC() do { _KERNEL_SYS_EXE_DPC(); } while (0) -#define _KERNEL_SYS_INI_DPC(que, quecnt) _KERNEL_DPC_INI_DPC(&_kernel_syscb.dpccb, (que), (quecnt)) /**< %jp{DPCの初期化} */ #define _KERNEL_SYS_LOC_DPC() do { _KERNEL_DIS_INT(); } while (0) #define _KERNEL_SYS_UNL_DPC() do { if (!(_KERNEL_SYS_GET_STST() & _KERNEL_TSS_LOC)){ _KERNEL_ENA_INT(); } } while (0) #define _KERNEL_SYS_SND_DPC(msg) _KERNEL_DPC_SND_MSG(&_kernel_syscb.dpccb, (msg)) diff --git a/kernel/include/object/flgobj.h b/kernel/include/object/flgobj.h index 3f88dae..8404739 100755 --- a/kernel/include/object/flgobj.h +++ b/kernel/include/object/flgobj.h @@ -296,6 +296,7 @@ extern "C" { #endif ER _kernel_cre_flg(ID flgid, const T_CFLG *pk_cflg); +ER _kernel_wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout); BOOL _kernel_chk_flg(_KERNEL_T_FLGCB *flgcb, _KERNEL_T_FLGINF *pk_flginf); #ifdef __cplusplus diff --git a/kernel/include/parser/parsknl.h b/kernel/include/parser/parsknl.h index 971bf1f..a114415 100755 --- a/kernel/include/parser/parsknl.h +++ b/kernel/include/parser/parsknl.h @@ -154,6 +154,13 @@ #define _KERNEL_SPT_TWAI_FLG _KERNEL_CFG_TWAI_FLG /* twai_flg */ #define _KERNEL_SPT_REF_FLG _KERNEL_CFG_REF_FLG /* ref_flg */ +#if _KERNEL_SPT_TWAI_FLG || (_KERNEL_SPT_WAI_FLG && _KERNEL_SPT_POL_FLG) +#define _KERNEL_SPT_KWAI_FLG TRUE +#else +#define _KERNEL_SPT_KWAI_FLG FALSE +#endif + + /* Data queues */ #define _KERNEL_SPT_CRE_DTQ _KERNEL_CFG_CRE_DTQ /* cre_dtq */ #define _KERNEL_SPT_ACRE_DTQ _KERNEL_CFG_ACRE_DTQ /* acre_dtq */ diff --git a/kernel/source/core/dpc/exe_dpc.c b/kernel/source/core/dpc/exe_dpc.c index 0389493..d5da1b9 100755 --- a/kernel/source/core/dpc/exe_dpc.c +++ b/kernel/source/core/dpc/exe_dpc.c @@ -15,20 +15,41 @@ #if _KERNEL_SPT_DPC + /* サービスコール退出時の処理 */ -void _kernel_exe_dpc(void) +void _kernel_exe_dpc(_KERNEL_T_DPCCB *dcpcb) { - FP fncSvc; + _KERNEL_T_DPCMSG msg; + UINT head; - /* 遅延プロシージャ呼び出し */ - while ( _KERNEL_SYS_RDT_DPC() > 0 ) + for ( ; ; ) { - fncSvc = (FP)_KERNEL_SYS_RCV_DPC(); - fncSvc(); + /* %jp{キューチェック} */ + _KERNEL_SYS_LOC_DPC(); /* %jp{ロックをかける} */ + head = dcpcb->head; + if ( head == dcpcb->tail ) + { + _KERNEL_SYS_CLR_SVC(); /* サービスコール実行中フラグを倒す */ + _KERNEL_DSP_TSK(); /* %jp{タスクディスパッチの実行} */ + _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ + return; + } + _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ + + /* メッセージ取り出し */ + msg = dcpcb->que[head]; + + /* ポインタを進める */ + head = head + 1; + if ( head >= dcpcb->quecnt ) + { + head = 0; + } + dcpcb->head = head; + + /* 遅延プロシージャ呼び出し */ + msg.svc(msg.id, msg.param); } - - /* タスクディスパッチの実施 */ - _KERNEL_DSP_TSK(); } diff --git a/kernel/source/core/dpc/ini_dpc.c b/kernel/source/core/dpc/ini_dpc.c new file mode 100755 index 0000000..269b5a5 --- /dev/null +++ b/kernel/source/core/dpc/ini_dpc.c @@ -0,0 +1,32 @@ +/** + * Hyper Operating System V4 Advance + * + * @file dpc.h + * @brief %jp{遅延プロシージャーコールヘッダファイル}%en{Deferred Procedure Call header file} + * + * Copyright (C) 1998-2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "core/core.h" +#include "core/dpc.h" + + +#if _KERNEL_SPT_DPC + + +/* 遅延プロシージャーコールの初期化 */ +void _kernel_ini_dpc(_KERNEL_T_DPCCB *dcpcb, _KERNEL_T_DPCMSG *que, INT quecnt) +{ + dcpcb->que = que; + dcpcb->quecnt = quecnt; + dcpcb->head = 0; + dcpcb->tail = 0; +} + + +#endif /* _KERNEL_SPT_DPC */ + + +/* end of file */ diff --git a/kernel/source/core/dpc/req_dpc.c b/kernel/source/core/dpc/req_dpc.c new file mode 100755 index 0000000..23eea45 --- /dev/null +++ b/kernel/source/core/dpc/req_dpc.c @@ -0,0 +1,58 @@ +/** + * Hyper Operating System V4 Advance + * + * @file dpc.h + * @brief %jp{遅延プロシージャーコールヘッダファイル}%en{Deferred Procedure Call header file} + * + * Copyright (C) 1998-2006 by Project HOS + * http://sourceforge.jp/projects/hos/ + */ + + +#include "core/core.h" +#include "core/dpc.h" + + +#if _KERNEL_SPT_DPC + + +ER _kernel_req_dpc(_KERNEL_T_DPCCB *dcpcb, void (*svc)(ID id, VP_INT param1), ID id, VP_INT param) +{ + volatile _KERNEL_T_DPCMSG *msg; + UINT tail; + UINT next_tail; + + _KERNEL_SYS_LOC_DPC(); /* %jp{多重割り込み対策でロックをかける} */ + + tail = dcpcb->tail; + next_tail = tail + 1; + if ( next_tail >= dcpcb->quecnt ) + { + next_tail = 0; + } + + if ( next_tail == dcpcb->head ) + { + _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ + return E_NOMEM; + } + + dcpcb->tail = next_tail; + + _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ + + /* %jp{実行予約} */ + msg = &dcpcb->que[tail]; + msg->svc = svc; + msg->id = id; + msg->param = param; + + + return E_OK; +} + + +#endif /* _KERNEL_SPT_DPC */ + + +/* end of file */ diff --git a/kernel/source/object/dtq/trcv_dtq.c b/kernel/source/object/dtq/trcv_dtq.c index b99bbd9..4ddf1a9 100755 --- a/kernel/source/object/dtq/trcv_dtq.c +++ b/kernel/source/object/dtq/trcv_dtq.c @@ -29,9 +29,9 @@ * @retval E_TMOUT %jp{タイムアウト}%en{Timeout} * @retval E_DLT %jp{待ちオブジェクトの削除(待ち状態の間に対象データキューが削除)}%en{Waiting object deleted(data queue is deleted waiting)} */ -ER trcv_dtq(ID dtqid, TMO tmout) +ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) { - return _kernel_rcv_dtq(dtqid, tmout); + return _kernel_rcv_dtq(dtqid, p_data, tmout); } @@ -44,7 +44,7 @@ ER trcv_dtq(ID dtqid, TMO tmout) * @param dtqid %jp{資源獲得対象のデータキューID番号}%en{ID number of the data queue from which resource is acquired} * @retval E_NOSPT %jp{未サポート機能}%en{Unsupported function} */ -ER trcv_dtq(ID dtqid, TMO tmout) +ER trcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) { return E_NOSPT; } @@ -70,7 +70,7 @@ ER trcv_dtq(ID dtqid, TMO tmout) * @retval E_TMOUT %jp{タイムアウト}%en{Timeout} * @retval E_DLT %jp{待ちオブジェクトの削除(待ち状態の間に対象データキューが削除)}%en{Waiting object deleted(data queue is deleted waiting)} */ -ER _kernel_rcv_dtq(ID dtqid, TMO tmout) +ER _kernel_rcv_dtq(ID dtqid, VP_INT *p_data, TMO tmout) { _KERNEL_T_DTQCB_PTR dtqcb; _KERNEL_T_TSKHDL tskhdl; diff --git a/kernel/source/object/flg/iset_flg.c b/kernel/source/object/flg/iset_flg.c index 645f116..b00cdb3 100755 --- a/kernel/source/object/flg/iset_flg.c +++ b/kernel/source/object/flg/iset_flg.c @@ -18,7 +18,7 @@ #if _KERNEL_SPT_DPC -static void _kernel_dpc_set_flg(void); +static void _kernel_dpc_set_flg(ID flgid, VP_INT param); /** %jp{イベントフラグのセット}%en{Set Eventflag} * @param flgid %jp{セット対象のイベントフラグのID番号}%en{ID number of the eventflag to be set} @@ -29,8 +29,6 @@ static void _kernel_dpc_set_flg(void); */ ER iset_flg(ID flgid, FLGPTN setptn) { - ER ercd; - /* %jp{ID のチェック} */ #if _KERNEL_SPT_ISET_FLG_E_ID if ( !_KERNEL_FLG_CHECK_FLGID(flgid) ) @@ -39,27 +37,12 @@ ER iset_flg(ID flgid, FLGPTN setptn) } #endif - _KERNEL_SYS_LOC_DPC(); /* %jp{多重割り込み対策でロックをかける} */ - - if ( _KERNEL_SYS_RFR_DPC() >= 3 ) - { - _KERNEL_SYS_SND_DPC((VP_INT)_kernel_dpc_set_flg); - _KERNEL_SYS_SND_DPC((VP_INT)flgid); - _KERNEL_SYS_SND_DPC((VP_INT)setptn); - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ - } - else - { - ercd = E_NOMEM; /* %jp{遅延実行用のキューイングメモリ不足}%en{Insufficient memory to store a service call for delayed execution} */ - } - - _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ - - return ercd; + return _KERNEL_SYS_REQ_DPC(_kernel_dpc_set_flg, flgid, (VP_INT)setptn); } + /** %jp{set_flgの遅延実行}%en{service call for delayed execution(set_flg)} */ -void _kernel_dpc_set_flg(void) +void _kernel_dpc_set_flg(ID flgid, VP_INT param) { _KERNEL_T_QUE *pk_que; _KERNEL_T_FLGCB *flgcb; @@ -67,13 +50,12 @@ void _kernel_dpc_set_flg(void) _KERNEL_T_TSKHDL tskhdl; _KERNEL_T_TSKHDL tskhdl_next; _KERNEL_T_TCB *tcb; - ID flgid; FLGPTN setptn; - /* %jp{パラメータ取り出し} */ - flgid = (ID)_KERNEL_SYS_RCV_DPC(); - setptn = (FLGPTN)_KERNEL_SYS_RCV_DPC(); - + /* %jp{パラメータ変換} */ + setptn = (FLGPTN) param; + + /* %jp{オブジェクト存在チェック} */ #if _KERNEL_SPT_ISET_FLG_E_NOEXS if ( !_KERNEL_FLG_CHECK_EXS(flgid) ) diff --git a/kernel/source/object/flg/twai_flg.c b/kernel/source/object/flg/twai_flg.c index f0e7d74..e7993d4 100755 --- a/kernel/source/object/flg/twai_flg.c +++ b/kernel/source/object/flg/twai_flg.c @@ -34,40 +34,86 @@ */ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) { + return _kernel_wai_flg(flgid, waiptn, wfmode, p_flgptn, tmout); +} + +#else /* _KERNEL_SPT_TWAI_FLG */ + + +#if _KERNEL_SPT_TWAI_FLG_E_NOSPT + +/** %jp{イベントフラグ待ち(タイムアウトあり)}%en{Wait for Eventflag(with Timeout)} + * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set} + * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern} + * @param wfmode %jp{待ちモード}%en{Wait mode} + * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting} + * @retval E_NOSPT %jp{未サポート機能}%en{Unsupported function} + */ +ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) +{ + return E_NOSPT; +} + +#endif + + +#endif /* _KERNEL_SPT_TWAI_FLG */ + + + + +#if _KERNEL_SPT_KWAI_FLG + +/** %jp{イベントフラグ待ち(タイムアウトあり)}%en{Wait for Eventflag(with Timeout)} + * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set} + * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern} + * @param wfmode %jp{待ちモード}%en{Wait mode} + * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting} + * @retval E_OK %jp{正常終了}%en{Normal completion} + * @retval E_ID %jp{不正ID番号(flgidが不正あるいは使用できない)}%en{Invalid ID number(flgid is invalid or unusable)} + * @retval E_CTX %jp{コンテキストエラー}%en{Context error} + * @retval E_NOEXS %jp{オブジェクト未生成(対象イベントフラグが未登録)}%en{Non-existant object(specified eventflag is not registerd)} + * @retval E_PAR %jp{パラメータエラー(waiptn, wfmode, p_flgptnが不正)}%en{Parameter error(waiptn, wfmode, or p_flgptn is invalid)} + * @retval E_ILUSE %jp{サービスコール不正使用(TA_WSGL属性が指定されたイベントフラグで待ちタスクあり}%en{Illegal service call use(there is already a task waiting for an eventflag with tahe TA_WSGL attribute)} + * @retval E_RLWAI %jp{待ち状態の強制解除(待ち状態の間にrel_waiを受付)}%en{Forced release from waiting(accept rel_wai while waiting)} + * @retval E_DLT %jp{待ちオブジェクトの削除(待ち状態の間に対象イベントフラグが削除)}%en{Waiting object deleted(eventflag is deleted waiting)} + */ +ER _kernel_wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) +{ + _KERNEL_T_FLGCB *flgcb; _KERNEL_T_FLGINF flginf; - _KERNEL_T_FLGHDL flghdl; _KERNEL_T_TSKHDL tskhdl; + _KERNEL_T_TCB *tcb; ER ercd; /* %jp{コンテキストチェック} */ #if _KERNEL_SPT_WAI_FLG_E_CTX - if ( _KERNEL_SYS_SNS_DPN() && tmout != TMO_POL ) + if ( _KERNEL_SYS_SNS_DPN() ) { return E_CTX; /* %jp{コンテキストエラー}%en{Context error} */ } #endif /* %jp{ID のチェック} */ -#if _KERNEL_SPT_TWAI_FLG_E_ID +#if _KERNEL_SPT_WAI_FLG_E_ID if ( !_KERNEL_FLG_CHECK_FLGID(flgid) ) { return E_ID; /* %jp{ID不正} */ } #endif - + /* %jp{パラメータのチェック} */ -#if _KERNEL_SPT_TWAI_FLG_E_PAR +#if _KERNEL_SPT_WAI_FLG_E_PAR if ( waiptn == 0 ) { return E_PAR; /* %jp{パラメータ不正} */ } #endif - - + _KERNEL_ENTER_SVC(); /* %jp{サービスコール開始} */ /* %jp{オブジェクト存在チェック} */ -#if _KERNEL_SPT_TWAI_FLG_E_NOEXS +#if _KERNEL_SPT_WAI_FLG_E_NOEXS if ( !_KERNEL_FLG_CHECK_EXS(flgid) ) { _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */ @@ -75,11 +121,12 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) } #endif - /* %jp{イベントフラグハンドル取得} */ - flghdl = _KERNEL_FLG_ID2FLGHDL(flgid); + /* %jp{コントロールブロック取得} */ + flgcb = _KERNEL_FLG_ID2FLGCB(flgid); -#if _KERNEL_SPT_TWAI_FLG_E_ILUSE - if ( !(_KERNEL_FLG_GET_FLGATR(flghdl) & TA_WMUL) && _kernel_ref_que(pk_que) != _KERNEL_TSKHDL_NULL && tmout != TMO_POL ) +#if _KERNEL_SPT_WAI_FLG_E_ILUSE + if ( !(_KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_WMUL) + && _KERNEL_REF_QUE(_KERNEL_FLG_GET_QUE(flgcb)) != _KERNEL_TSKHDL_NULL ) { _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */ return E_ILUSE; @@ -91,15 +138,18 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) flginf.wfmode = wfmode; /* %jp{フラグチェック} */ - if ( _kernel_chk_flg(flghdl, &flginf) ) + if ( _kernel_chk_flg(flgcb, &flginf) ) { /* %jp{既に条件を満たしているなら} */ - *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flghdl); /* %jp{解除時のフラグパターンを格納} */ - + if ( p_flgptn != NULL ) + { + *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb); /* %jp{解除時のフラグパターンを格納} */ + } + #if _KERNEL_SPT_FLG_TA_CLR - if ( _KERNEL_FLG_GET_FLGATR(flghdl) & TA_CLR ) + if ( _KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_CLR ) { - _KERNEL_FLG_SET_FLGPTN(flghdl, 0); /* %jp{クリア属性があればクリア} */ + _KERNEL_FLG_SET_FLGPTN(flgcb, 0); /* %jp{クリア属性があればクリア} */ } #endif @@ -107,41 +157,46 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) } else { - if ( tmout != TMO_POL ) +#if _KERNEL_SPT_TWAI_FLG || _KERNEL_SPT_POL_FLG + if ( tmout == TMO_POL ) + { + ercd = E_TMOUT; /* %jp{タイムアウト}%en{Timeout} */ + } + else +#endif { /* %jp{タスクを待ち状態にする} */ tskhdl = _KERNEL_SYS_GET_RUNTSK(); + tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl); /* %jp{TCB取得} */ + _KERNEL_TSK_SET_TSKSTAT(tcb, _KERNEL_TTS_WAI); + _KERNEL_TSK_SET_TSKWAIT(tcb, _KERNEL_TTW_SEM); + _KERNEL_TSK_SET_WOBJID(tcb, flgid); + _KERNEL_TSK_SET_DATA(tcb, (VP_INT)&flginf); _KERNEL_DSP_WAI_TSK(tskhdl); - _KERNEL_TSK_SET_TSKSTAT(tskhdl, _KERNEL_TTS_WAI); - _KERNEL_TSK_SET_TSKWAIT(tskhdl, _KERNEL_TTW_SEM); - _KERNEL_TSK_SET_WOBJID(tskhdl, flgid); - _KERNEL_TSK_SET_DATA(tskhdl, (VP_INT)&flginf); - _KERNEL_FLG_ADD_QUE(flghdl, tskhdl); /* %jp{待ち行列に追加} */ - + _KERNEL_FLG_ADD_QUE(flgcb, _KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb), tskhdl); /* %jp{待ち行列に追加} */ + +#if _KERNEL_SPT_TWAI_FLG if ( tmout != TMO_FEVR ) { - _KERNEL_ADD_TOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */ + _KERNEL_FLG_ADD_TOQ(tskhdl, tmout); /* %jp{タイムアウトキューに追加} */ } - +#endif + /* %jp{タスクディスパッチの実行} */ _KERNEL_DSP_TSK(); /* %jp{エラーコードの取得} */ - ercd = _KERNEL_TSK_GET_ERCD(tskhdl); + ercd = _KERNEL_TSK_GET_ERCD(tcb); /* %jp{条件を満たして解除されたのなら} */ if ( ercd == E_OK ) { if ( p_flgptn != NULL ) { - *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */ + *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */ } } } - else - { - ercd = E_TMOUT; /* %jp{タイムアウト}%en{Timeout} */ - } } _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */ @@ -150,26 +205,7 @@ ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) } -#else /* _KERNEL_SPT_TWAI_FLG */ - - -#if _KERNEL_SPT_TWAI_FLG_E_NOSPT - -/** %jp{イベントフラグ待ち}%en{Wait for Eventflag} - * @param flgid %jp{待ち対象のイベントフラグのID番号}%en{ID number of the eventflag to be set} - * @param flgptn %jp{待ちビットパターン}%en{Wait bit pattern} - * @param wfmode %jp{待ちモード}%en{Wait mode} - * @param p_flgptn %jp{待ち解除時のビットパターンの返却アドレス}%en{Bit pattern causing a task to be released from waiting} - * @retval E_NOSPT %jp{未サポート機能}%en{Unsupported function} - */ -ER twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout) -{ - return E_NOSPT; -} - -#endif - -#endif /* _KERNEL_SPT_TWAI_FLG */ +#endif /* _KERNEL_SPT_KWAI_FLG */ /* end of file */ diff --git a/kernel/source/object/inh/end_inh.c b/kernel/source/object/inh/end_inh.c index 1f46df1..a31fef3 100755 --- a/kernel/source/object/inh/end_inh.c +++ b/kernel/source/object/inh/end_inh.c @@ -24,20 +24,22 @@ void _kernel_end_inh(void) { /* %jp{割り込みコンテキストを抜ける} */ _KERNEL_SYS_CLR_CTX(); - - _KERNEL_ENA_INT(); /* %jp{割込み許可} */ - + + if ( !_KERNEL_SYS_SNS_SVC() ) { - _KERNEL_DPC_EXE_DPC(); - } - - _KERNEL_DIS_INT(); /* %jp{割込み禁止} */ + _KERNEL_SYS_SET_SVC(); + + _KERNEL_ENA_INT(); /* %jp{割込み許可} */ + _KERNEL_SYS_EXE_DPC(); + _KERNEL_DIS_INT(); /* %jp{割込み禁止} */ + } } #else + /** %jp{割り込み処理開始} * @return void */ diff --git a/kernel/source/object/sem/isig_sem.c b/kernel/source/object/sem/isig_sem.c index f37da46..ff8e1e9 100755 --- a/kernel/source/object/sem/isig_sem.c +++ b/kernel/source/object/sem/isig_sem.c @@ -19,7 +19,7 @@ #if _KERNEL_SPT_DPC -static void _kernel_dpc_sig_sem(void); +static void _kernel_dpc_sig_sem(ID semid, VP_INT param); /** %jp{セマフォ資源の返却}%en{Release Semaphore Resource} * @param semid %jp{セマフォ資源返却対象のセマフォのID番号}%en{ID number of the semaphore to which resource is released} @@ -29,8 +29,6 @@ static void _kernel_dpc_sig_sem(void); */ ER isig_sem(ID semid) { - ER ercd; - /* %jp{ID のチェック} */ #if _KERNEL_SPT_ISIG_SEM_E_ID if ( !_KERNEL_SEM_CHECK_SEMID(semid) ) @@ -38,45 +36,19 @@ ER isig_sem(ID semid) return E_ID; /* %jp{不正ID番号}%en{Invalid ID number} */ } #endif - - _KERNEL_SYS_LOC_DPC(); /* %jp{多重割り込み対策でロックをかける} */ - - if ( _KERNEL_SYS_RFR_DPC() >= 2 ) - { - _KERNEL_SYS_SND_DPC((VP_INT)_kernel_dpc_sig_sem); - _KERNEL_SYS_SND_DPC((VP_INT)semid); - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ - } - else - { - ercd = E_NOMEM; /* %jp{遅延実行用のキューイングメモリ不足}%en{Insufficient memory to store a service call for delayed execution} */ - } - - _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ - - return ercd; + + return _KERNEL_SYS_REQ_DPC(_kernel_dpc_sig_sem, semid, 0); } + /** %jp{sig_semの遅延実行}%en{service call for delayed execution(sig_sem)} */ -void _kernel_dpc_sig_sem(void) +void _kernel_dpc_sig_sem(ID semid, VP_INT param) { _KERNEL_T_SEMCB_PTR semcb; _KERNEL_T_TSKHDL tskhdl; _KERNEL_T_TCB *tcb; _KERNEL_SEM_T_SEMCNT semcnt; - ID semid; - /* %jp{パラメータ取り出し} */ - semid = (ID)_KERNEL_SYS_RCV_DPC(); - - /* %jp{オブジェクト存在チェック} */ -#if _KERNEL_SPT_ISIG_SEM_E_NOEXS - if ( !_KERNEL_SEM_CHECK_EXS(semid) ) - { - _KERNEL_LEAVE_SVC(); /* %jp{サービスコール終了} */ - return; /* %jp{オブジェクト未生成} */ - } -#endif /* %jp{セマフォコントロールブロック取得} */ semcb = _KERNEL_SEM_ID2SEMCB(semid); @@ -89,7 +61,7 @@ void _kernel_dpc_sig_sem(void) _KERNEL_TSK_SET_ERCD(tcb, E_OK); /* %jp{エラーコード設定} */ _KERNEL_DSP_WUP_TSK(tskhdl); /* %jp{タスクの待ち解除} */ _KERNEL_SEM_RMV_TOQ(tskhdl); - + /* %jp{待ち解除発生をマーク} */ _KERNEL_SYS_SET_DLY(); } diff --git a/kernel/source/object/sys/sta_knl.c b/kernel/source/object/sys/sta_knl.c index 7767b1c..b454db2 100755 --- a/kernel/source/object/sys/sta_knl.c +++ b/kernel/source/object/sys/sta_knl.c @@ -15,7 +15,7 @@ /**** 暫定の手抜き(ここから) *****/ #if _KERNEL_SPT_DPC -VP_INT dpc_buf[32]; +_KERNEL_T_DPCMSG dpc_buf[32]; #endif /**** 暫定の手抜き(ここまで) *****/ diff --git a/kernel/source/object/tim/isig_tim.c b/kernel/source/object/tim/isig_tim.c index 8b46f05..1504822 100755 --- a/kernel/source/object/tim/isig_tim.c +++ b/kernel/source/object/tim/isig_tim.c @@ -19,7 +19,7 @@ #if _KERNEL_SPT_DPC -static void _kernel_dpc_sig_tim(void); +static void _kernel_dpc_sig_tim(ID id, VP_INT param); /** %jp{タイムティックの供給}%en{Supply Time Tick} @@ -27,27 +27,12 @@ static void _kernel_dpc_sig_tim(void); */ ER isig_tim(void) { - ER ercd; - - _KERNEL_SYS_LOC_DPC(); /* %jp{多重割り込み対策でロックをかける} */ - - if ( _KERNEL_SYS_RFR_DPC() >= 1 ) - { - _KERNEL_SYS_SND_DPC((VP_INT)_kernel_dpc_sig_tim); - ercd = E_OK; /* %jp{正常終了}%en{Normal completion} */ - } - else - { - ercd = E_NOMEM; /* %jp{遅延実行用のキューイングメモリ不足}%en{Insufficient memory to store a service call for delayed execution} */ - } - - _KERNEL_SYS_UNL_DPC(); /* %jp{ロック解除} */ - - return ercd; + return _KERNEL_SYS_REQ_DPC(_kernel_dpc_sig_tim, 0, 0); } + /** %jp{タイムティックの供給}%en{Supply Time Tick} */ -void _kernel_dpc_sig_tim(void) +void _kernel_dpc_sig_tim(ID id, VP_INT param) { RELTIM tictim; @@ -57,7 +42,7 @@ void _kernel_dpc_sig_tim(void) #if _KERNEL_SPT_TMQ _KERNEL_SYS_SIG_TMQ(tictim); #endif - + /* %jp{タイムアウトキューの処理を行う} */ #if _KERNEL_SPT_TOQ _KERNEL_SYS_SIG_TOQ(tictim); -- 2.11.0