$(OBJS_DIR)/filecopy_main.$(EXT_OBJ): $(FILECOPY_DIR)/filecopy_main.c $(COMMON_HEADERS)
$(OBJS_DIR)/filedump_main.$(EXT_OBJ): $(FILEDUMP_DIR)/filedump_main.c $(COMMON_HEADERS)
$(OBJS_DIR)/ethersnoop_main.$(EXT_OBJ): $(ETHERSNOOP_DIR)/ethersnoop_main.c $(COMMON_HEADERS)
-$(OBJS_DIR)/hello.$(EXT_OBJ): $(HELLO_DIR)/hello.c $(COMMON_HEADERS)
+$(OBJS_DIR)/hello_main.$(EXT_OBJ): $(HELLO_DIR)/hello_main.c $(COMMON_HEADERS)
# end of file
ifeq ($(LINK_HELLO),Yes)
HELLO_DIR = $(HOSAPLFW_DIR)/application/example/hello
SRC_DIRS += $(HELLO_DIR)
-CSRCS += $(HELLO_DIR)/hello.c
+CSRCS += $(HELLO_DIR)/hello_main.c
endif
$(OBJS_DIR)\ethersnoop_main.$(EXT_OBJ): $(OBJS_DIR)\ethersnoop_main.c $(COMMON_HEADERS)
-$(OBJS_DIR)\hello.$(EXT_OBJ): $(OBJS_DIR)\hello.c $(COMMON_HEADERS)
+$(OBJS_DIR)\hello_main.$(EXT_OBJ): $(OBJS_DIR)\hello_main.c $(COMMON_HEADERS)
# Hello World
HELLO_DIR = $(HOSAPLFW_DIR)\application\example\hello
-CSRCS = $(CSRCS) $(HELLO_DIR)\hello.c
-OBJS = $(OBJS) $(OBJS_DIR)\hello.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(HELLO_DIR)\hello_main.c
+OBJS = $(OBJS) $(OBJS_DIR)\hello_main.$(EXT_OBJ)
# end of file
"\$(HOSAPLFW_DIR)/application/example/hello",
"HELLO",
"Yes",
- "hello.c",
+ "hello_main.c",
],
],
);
# PROP Default_Filter ""\r
# Begin Source File\r
\r
-SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.c\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.h\r
# End Source File\r
# Begin Source File\r
\r
-SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv.h\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_close.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_constructor.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_create.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_delete.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_destructor.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_flush.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_iocontrol.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_isr.c\r
# End Source File\r
# Begin Source File\r
\r
SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_local.h\r
# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_open.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_read.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_recv.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_seek.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_send.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\driver\serial\winsock\winsockdrv_write.c\r
+# End Source File\r
# End Group\r
# Begin Group "pc16550"\r
\r
SOURCE=..\..\..\..\system\system\system_requestproc.c\r
# End Source File\r
# End Group\r
+# Begin Group "event"\r
+\r
+# PROP Default_Filter ""\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_create.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_delete.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_local.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_set.c\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=..\..\..\..\system\event\event_wait.c\r
+# End Source File\r
+# End Group\r
# End Group\r
# Begin Group "application"\r
\r
self = (C_VT100DRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = FileObj_Create(&self->DrvObj)) == HANDLE_NULL )
+ if ( (hFile = FileObj_Create(&self->DrvObj, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
self = (C_LAN9000DRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
#define __HOS__streampipe_h__
-#include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
-#include "library/container/streambuf/streambuf.h"
-
-
-/* ストリームパイプクラス */
-typedef struct c_streampipe
-{
- C_SYNCDRV SyncDrv; /**< 同期機能付きデバイスドライバを継承 */
-
- int iOpenCount; /**< オープンカウンタ */
-
- C_STREAMBUF StreamBuf; /**< バッファ */
-} C_STREAMPIPE;
+#include "hosaplfw.h"
#ifdef __cplusplus
#include "streampipe.h"
#include "system/file/syncdrv_local.h"
+#include "library/container/streambuf/streambuf.h"
#include "system/sysapi/sysapi.h"
+/* ストリームパイプクラス */
+typedef struct c_streampipe
+{
+ C_SYNCDRV SyncDrv; /**< 同期機能付きデバイスドライバを継承 */
+
+ int iOpenCount; /**< オープンカウンタ */
+
+ C_STREAMBUF StreamBuf; /**< バッファ */
+} C_STREAMPIPE;
+
+
#ifdef __cplusplus
extern "C" {
#endif
self = (C_STREAMPIPE *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
self = (C_AT91USARTDRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
self = (C_MX1UARTDRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL)
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL)
{
return HANDLE_NULL;
}
self = (C_PC16550DRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
self = (C_SCIDRV *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
+++ /dev/null
-
-
-
-#include "winsockdrv_local.h"
-
-
-const T_DRVOBJ_METHODS WinSockDrv_Methods =
- {
- { WinSockDrv_Delete },
- WinSockDrv_Open,
- WinSockDrv_Close,
- WinSockDrv_IoControl,
- WinSockDrv_Seek,
- WinSockDrv_Read,
- WinSockDrv_Write,
- WinSockDrv_Flush,
- };
-
-
-/** コンストラクタ */
-HANDLE WinSockDrv_Create(int iPortNum, int iIntNum, int iBufSize)
-{
- C_WINSOCKDRV *self;
-
- /* メモリ確保 */
- if ( (self = (C_WINSOCKDRV *)SysMem_Alloc(sizeof(C_WINSOCKDRV))) == NULL )
- {
- return HANDLE_NULL;
- }
-
- /* コンストラクタ呼び出し */
- if ( WinSockDrv_Constructor(self, NULL, iPortNum, iIntNum, iBufSize) != FILE_ERR_OK )
- {
- SysMem_Free(self);
- return HANDLE_NULL;
- }
-
- return (HANDLE)self;
-}
-
-
-/** コンストラクタ */
-FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize)
-{
- WSADATA wsaData;
- struct sockaddr_in addr;
-
- if ( pMethods == NULL )
- {
- pMethods = &WinSockDrv_Methods;
- }
-
- /* 親クラスコンストラクタ呼び出し */
- DrvObj_Constructor(&self->DrvObj, pMethods);
-
- WSAStartup(MAKEWORD(2,0), &wsaData);
-
- self->sock0 = socket(AF_INET, SOCK_STREAM, 0);
-
- addr.sin_family = AF_INET;
- addr.sin_port = htons((u_short)iPortNum);
- addr.sin_addr.S_un.S_addr = INADDR_ANY;
-
- bind(self->sock0, (struct sockaddr *)&addr, sizeof(addr));
-
- listen(self->sock0, 5);
-
- return FILE_ERR_OK;
-}
-
-
-/** 削除 */
-void WinSockDrv_Delete(HANDLE hDriver)
-{
- C_WINSOCKDRV *self;
-
- /* upper cast */
- self = (C_WINSOCKDRV *)hDriver;
-
- /* デストラクタ呼び出し */
- WinSockDrv_Destructor(self);
-
- /* メモリ削除 */
- SysMem_Free(self);
-}
-
-
-/** デストラクタ */
-void WinSockDrv_Destructor(C_WINSOCKDRV *self)
-{
- WSACleanup();
-
- /* 親クラスデストラクタ */
- DrvObj_Destructor(&self->DrvObj);
-}
-
-
-/** オープン */
-HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
-{
- C_WINSOCKDRV *self;
- HANDLE hFile;
- struct sockaddr_in client;
- int len;
-
- /* upper cast */
- self = (C_WINSOCKDRV *)pDrvObj;
-
- /* create file descriptor */
- if ( (hFile = FileObj_Create(pDrvObj)) == HANDLE_NULL )
- {
- return HANDLE_NULL;
- }
-
- /* オープン処理 */
- if ( self->iOpenCount++ == 0 )
- {
- len = sizeof(client);
- self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
- }
-
- return hFile;
-}
-
-
-/** クローズ */
-FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
-{
- C_WINSOCKDRV *self;
-
- /* upper cast */
- self = (C_WINSOCKDRV *)pDrvObj;
-
- if ( --self->iOpenCount == 0 )
- {
- closesocket(self->sock);
- }
-
- return FILE_ERR_OK;
-}
-
-
-FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
-{
- return FILE_ERR_NG;
-}
-
-
-FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
-{
- return FILE_ERR_NG;
-}
-
-
-/** 読み出し */
-FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
-{
- C_WINSOCKDRV *self;
-
- /* upper cast */
- self = (C_WINSOCKDRV *)pDrvObj;
-
- return recv(self->sock, pBuf, Size, 0);
-}
-
-
-/** 書き込み */
-FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
-{
- C_WINSOCKDRV *self;
-
- /* upper cast */
- self = (C_WINSOCKDRV *)pDrvObj;
-
- return send(self->sock, pData, Size, 0);
-}
-
-
-FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
-{
- return FILE_ERR_OK;
-}
-
* @file winsockdrv.h
* @brief %jp{WinSockでシリアルを擬似するドライバ}
*
- * Copyright (C) 2006 by Project HOS
+ * Copyright (C) 2006-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
#define __HOS__winsockdrv_h__
-#define SIZE WINSIZE
-#include <winsock2.h>
-#include "system/file/drvobj.h"
-#include "system/sysapi/sysapi.h"
-#include "library/container/streambuf/streambuf.h"
-
-
-/* WinSock用ドライバ制御部 */
-typedef struct c_winsockdrv
-{
- C_DRVOBJ DrvObj; /* デバイスドライバクラスを継承 */
-
- int iOpenCount;
- SYSEVT_HANDLE hEvtSend;
- SYSEVT_HANDLE hEvtRecv;
- SYSMTX_HANDLE hMtxSend;
- SYSMTX_HANDLE hMtxRecv;
-
- SOCKET sock0;
- SOCKET sock;
-
- C_STREAMBUF StmBuf;
-} C_WINSOCKDRV;
-
-
-
#ifdef __cplusplus
extern "C" {
#endif
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** クローズ */
+FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ C_WINSOCKDRV *self;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ if ( --self->iOpenCount == 0 )
+ {
+ closesocket(self->sock);
+ }
+
+ return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 仮想関数テーブル */
+const T_DRVOBJ_METHODS WinSockDrv_Methods =
+ {
+ { WinSockDrv_Delete },
+ WinSockDrv_Open,
+ WinSockDrv_Close,
+ WinSockDrv_IoControl,
+ WinSockDrv_Seek,
+ WinSockDrv_Read,
+ WinSockDrv_Write,
+ WinSockDrv_Flush,
+ };
+
+
+/** コンストラクタ */
+FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize)
+{
+ DWORD dwThreadId;
+ FILE_ERR ErrCode;
+ void *pRecvMem;
+ void *pSendMem;
+
+ /* 仮想関数テーブル */
+ if ( pMethods == NULL )
+ {
+ pMethods = &WinSockDrv_Methods;
+ }
+
+ /* バッファ用メモリ確保 */
+ if ( (pRecvMem = SysMem_Alloc(iBufSize)) == NULL )
+ {
+ return FILE_ERR_NG;
+ }
+ if ( (pSendMem = SysMem_Alloc(iBufSize)) == NULL )
+ {
+ SysMem_Free(pRecvMem);
+ return FILE_ERR_NG;
+ }
+
+
+ /* 親クラスコンストラクタ呼び出し */
+ if ( (ErrCode = SyncDrv_Constructor(&self->SyncDrv, pMethods, SYNCDRV_FACTOR_NUM)) != FILE_ERR_OK )
+ {
+ SysMem_Free(pRecvMem);
+ SysMem_Free(pSendMem);
+ return ErrCode;
+ }
+
+ /* メンバ変数初期化 */
+ self->iOpenCount = 0;
+ self->iPortNum = iPortNum;
+ self->iIntNum = iIntNum;
+ self->iConnection = FALSE;
+
+ /* バッファ生成 */
+ StreamBuf_Create(&self->StmBufRecv, iBufSize, pRecvMem);
+ StreamBuf_Create(&self->StmBufSend, iBufSize, pSendMem);
+
+ /* 割込み処理登録 */
+ self->hIsr = SysIsr_Create(self->iIntNum, WinSockDrv_Isr, (VPARAM)self);
+
+ /* イベント生成 */
+ self->hConnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ self->hDisconnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+ self->hSendEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
+
+ /* %jp{スレッド生成} */
+ self->hRecvThread = CreateThread(NULL, 0, WinSockDrv_Recv, (LPVOID)self, 0, &dwThreadId);
+ self->hSendThread = CreateThread(NULL, 0, WinSockDrv_Send, (LPVOID)self, 0, &dwThreadId);
+
+ return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** 生成 */
+HANDLE WinSockDrv_Create(int iPortNum, int iIntNum, int iBufSize)
+{
+ C_WINSOCKDRV *self;
+
+ /* メモリ確保 */
+ if ( (self = (C_WINSOCKDRV *)SysMem_Alloc(sizeof(C_WINSOCKDRV))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+
+ /* コンストラクタ呼び出し */
+ if ( WinSockDrv_Constructor(self, NULL, iPortNum, iIntNum, iBufSize) != FILE_ERR_OK )
+ {
+ SysMem_Free(self);
+ return HANDLE_NULL;
+ }
+
+ return (HANDLE)self;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 削除 */
+void WinSockDrv_Delete(HANDLE hDriver)
+{
+ C_WINSOCKDRV *self;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)hDriver;
+
+ /* デストラクタ呼び出し */
+ WinSockDrv_Destructor(self);
+
+ /* メモリ削除 */
+ SysMem_Free(self);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** デストラクタ */
+void WinSockDrv_Destructor(C_WINSOCKDRV *self)
+{
+
+
+ /* 親クラスデストラクタ */
+ SyncDrv_Destructor(&self->SyncDrv);
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ return FILE_ERR_OK;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+ return SyncDrv_IoControl(pDrvObj, pFileObj, iFunc, pInBuf, InSize, pOutBuf, OutSize);
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 割込みサービスルーチン */
+void WinSockDrv_Isr(VPARAM Param)
+{
+ C_WINSOCKDRV *self;
+
+ self = (C_WINSOCKDRV *)Param;
+
+ SyncDrv_SendSignal(&self->SyncDrv, SYNCDRV_FACTOR_WRITE);
+ SyncDrv_SendSignal(&self->SyncDrv, SYNCDRV_FACTOR_READ);
+}
+
+
+/* end of file */
#ifndef __HOS__winsockdrv_local_h__
#define __HOS__winsockdrv_local_h__
+#define SIZE WINSIZE
+#include <winsock2.h>
+#undef SIZE
#include "winsockdrv.h"
-#include "system/file/drvobj_local.h"
+#include "system/file/syncdrv_local.h"
+#include "library/container/streambuf/streambuf.h"
+#include "system/sysapi/sysapi.h"
+
+
+/* WinSock用ドライバ制御部 */
+typedef struct c_winsockdrv
+{
+ C_SYNCDRV SyncDrv; /* デバイスドライバクラスを継承 */
+
+ int iOpenCount;
+
+ int iIntNum;
+ int iPortNum;
+ SYSISR_HANDLE hIsr;
+
+ C_STREAMBUF StmBufSend;
+ C_STREAMBUF StmBufRecv;
+
+ volatile int iConnection;
+ HANDLE hConnectEvent;
+ HANDLE hDisconnectEvent;
+ HANDLE hSendEvent;
+ HANDLE hRecvThread;
+ HANDLE hSendThread;
+
+ SOCKET sock0;
+ SOCKET sock;
+} C_WINSOCKDRV;
+
#ifdef __cplusplus
extern "C" {
#endif
-FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize); /** コンストラクタ */
-void WinSockDrv_Destructor(C_WINSOCKDRV *self); /** デストラクタ */
+FILE_ERR WinSockDrv_Constructor(C_WINSOCKDRV *self, const T_DRVOBJ_METHODS *pMethods, int iPortNum, int iIntNum, int iBufSize); /** コンストラクタ */
+void WinSockDrv_Destructor(C_WINSOCKDRV *self); /** デストラクタ */
+
+HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+DWORD WINAPI WinSockDrv_Recv(LPVOID Param);
+DWORD WINAPI WinSockDrv_Send(LPVOID Param);
+void WinSockDrv_Isr(VPARAM Param);
-HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
-FILE_ERR WinSockDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
-FILE_ERR WinSockDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
-FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
-FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
-FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
-FILE_ERR WinSockDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
#ifdef __cplusplus
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** オープン */
+HANDLE WinSockDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+ C_WINSOCKDRV *self;
+ HANDLE hFile;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+
+ /* create file descriptor */
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
+ {
+ return HANDLE_NULL;
+ }
+
+ /* オープン処理 */
+ if ( self->iOpenCount++ == 0 )
+ {
+ }
+
+ return hFile;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+/** 読み出し */
+FILE_SIZE WinSockDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+ C_WINSOCKDRV *self;
+ C_SYNCFILE *pFile;
+ unsigned char *pubBuf;
+ FILE_ERR ErrCode;
+ FILE_SIZE i;
+ int c;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+ pFile = (C_SYNCFILE *)pFileObj;
+
+
+ pubBuf = (unsigned char *)pBuf;
+
+ /* 読込み処理開始 */
+ if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_READ)) != FILE_ERR_OK )
+ {
+ return (FILE_SIZE)ErrCode;
+ }
+
+ /* 読込みシグナルを一旦クリア */
+ SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
+
+ for ( i = 0; i < Size; i++ )
+ {
+ /* 読み出し */
+ while ( (c = StreamBuf_RecvChar(&self->StmBufRecv)) < 0 )
+ {
+ /* ブロッキングモードでなければ抜ける */
+ if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_READ) != FILE_SYNCMODE_BLOCKING )
+ {
+ SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, i);
+ return i;
+ }
+
+ /* 受信を待つ */
+ SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_READ);
+
+ /* 読込みシグナルをクリアしてリトライ */
+ SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_READ);
+ }
+
+ /* 読み出せた文字を格納 */
+ *pubBuf++ = (unsigned char)c;
+ }
+
+ /* 読み出し処理完了 */
+ SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_READ, (VPARAM)i);
+
+ return i;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+DWORD WINAPI WinSockDrv_Recv(LPVOID Param)
+{
+ C_WINSOCKDRV *self;
+ WSADATA wsaData;
+ struct sockaddr_in addr;
+ struct sockaddr_in client;
+ int len;
+ unsigned char ubBuf[128];
+ int iSize;
+
+ self = (C_WINSOCKDRV *)Param;
+
+ /* socket 準備 */
+ WSAStartup(MAKEWORD(2,0), &wsaData);
+ self->sock0 = socket(AF_INET, SOCK_STREAM, 0);
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons((u_short)self->iPortNum);
+ addr.sin_addr.S_un.S_addr = INADDR_ANY;
+ bind(self->sock0, (struct sockaddr *)&addr, sizeof(addr));
+ listen(self->sock0, 5);
+
+ for ( ; ; )
+ {
+ /* 接続待ち */
+ len = sizeof(client);
+ self->sock = accept(self->sock0, (struct sockaddr *)&client, &len);
+ if (self->sock == INVALID_SOCKET )
+ {
+ break;
+ }
+
+ /* 送信スレッド開始指示 */
+ self->iConnection = TRUE;
+ SetEvent(self->hConnectEvent);
+
+ for ( ; ; )
+ {
+ /* 受信 */
+ if ( (iSize = recv(self->sock, ubBuf, sizeof(ubBuf), 0)) == SOCKET_ERROR )
+ {
+ break;
+ }
+
+ /* 受信バッファに格納 */
+ StreamBuf_SendData(&self->StmBufRecv, ubBuf, iSize);
+
+ /* 擬似割込み生成 */
+ vsig_int(self->iIntNum);
+ }
+
+ /* 送信スレッド停止指示 */
+ self->iConnection = FALSE;
+ SetEvent(self->hSendEvent);
+
+ /* 送信スレッド停止待ち */
+ WaitForSingleObject(self->hDisconnectEvent, INFINITE);
+
+ /* 切断 */
+ closesocket(self->sock);
+ }
+
+ WSACleanup();
+
+ return 0;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+
+
+FILE_POS WinSockDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+ return FILE_ERR_NG;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/* 送信スレッド */
+DWORD WINAPI WinSockDrv_Send(LPVOID Param)
+{
+ C_WINSOCKDRV *self;
+ unsigned char ubBuf[128];
+ int iSize;
+
+ self = (C_WINSOCKDRV *)Param;
+
+ for ( ; ; )
+ {
+ /* 接続待ち */
+ WaitForSingleObject(self->hConnectEvent, INFINITE);
+
+ for ( ; ; )
+ {
+ /* 送信イベント待ち */
+ WaitForSingleObject(self->hSendEvent, INFINITE);
+ if ( self->iConnection != TRUE )
+ {
+ break;
+ }
+
+ /* 送信バッファから取り出し */
+ while ( (iSize = StreamBuf_RecvData(&self->StmBufSend, ubBuf, sizeof(ubBuf))) > 0 )
+ {
+ /* 送信 */
+ send(self->sock, ubBuf, iSize, 0);
+
+ /* 擬似割込み生成 */
+ vsig_int(self->iIntNum);
+ }
+ }
+
+ /* 停止通知 */
+ SetEvent(self->hDisconnectEvent);
+ }
+
+ return 0;
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file winsockdrv.h
+ * @brief %jp{WinSockでシリアルを擬似するドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "winsockdrv_local.h"
+
+
+/** 書き込み */
+FILE_SIZE WinSockDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+ C_WINSOCKDRV *self;
+ C_SYNCFILE *pFile;
+ const unsigned char *pubData;
+ FILE_ERR ErrCode;
+ FILE_SIZE SendSize = 0;
+ int iLen;
+
+ /* upper cast */
+ self = (C_WINSOCKDRV *)pDrvObj;
+ pFile = (C_SYNCFILE *)pFileObj;
+
+ pubData = (const unsigned char *)pData;
+
+ /* 書込み処理開始 */
+ if ( (ErrCode = SyncDrv_StartProcess(&self->SyncDrv, pFile, SYNCDRV_FACTOR_WRITE)) != FILE_ERR_OK )
+ {
+ return (FILE_SIZE)ErrCode;
+ }
+
+ /* 書込みシグナルを一旦クリア */
+ SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+
+ while ( Size > 0 )
+ {
+ /* 送信可能かチェック */
+ while ( (iLen = StreamBuf_SendData(&self->StmBufSend, pubData, Size)) <= 0 )
+ {
+ /* ブロッキングモードでなければ抜ける */
+ if ( SyncFile_GetSyncMode(pFile, SYNCDRV_FACTOR_WRITE) != FILE_SYNCMODE_BLOCKING )
+ {
+ SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, SendSize);
+ return SendSize;
+ }
+
+ /* 書込みシグナルを待つ */
+ SyncFile_WaitSignal(pFile, SYNCDRV_FACTOR_WRITE);
+
+ /* 書込みシグナルをクリアしてリトライ */
+ SyncFile_ClearSignal(pFile, SYNCDRV_FACTOR_WRITE);
+ }
+
+ /* 送信文字取り出し */
+ pubData += iLen;
+ Size -= iLen;
+ SendSize += iLen;
+
+ /* 送信 */
+ SetEvent(self->hSendEvent);
+ }
+
+ /* 書込み処理完了 */
+ SyncDrv_EndProcess(&self->SyncDrv, SYNCDRV_FACTOR_WRITE, (VPARAM)SendSize);
+
+ return SendSize;
+}
+
+
+/* end of file */
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file scifile.c
- * @brief %jp{SCI用デバイスドライバ用ファイルI/Fクラス}
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-#include <stdio.h>
-#include "winsockfile.h"
-
-
-static void WinSockFile_Delete(HANDLE hFile); /**< デストラクタ */
-static FILE_ERR WinSockFile_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize);
-static FILE_POS WinSockFile_Seek(HANDLE hFile, FILE_POS Offset, int iOrign);
-static FILE_SIZE WinSockFile_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size);
-static FILE_SIZE WinSockFile_Write(HANDLE hFile, const void *pData, FILE_SIZE Size);
-
-
-const T_HANDLEOBJ_METHODS WinSockFile_HandleObjMethods =
-{
- WinSockFile_Delete, /* デストラクタ */
-};
-
-const T_FILEOBJ_METHODS WinSockFile_FileObjMethods =
-{
- { WinSockFile_Delete }, /* デストラクタ */
- WinSockFile_IoControl, /* IoControl */
- NULL, /* Seek */
- WinSockFile_Read, /* Read */
- WinSockFile_Write, /* Write */
-};
-
-
-/** コンストラクタ */
-FILE_ERR WinSockFile_Create(HANDLE hFile, void *pParam, int iMode)
-{
- C_WINSOCKFILE *self;
-
- self = (C_WINSOCKFILE *)hFile;
-
- /* 親クラスコンストラクタ呼び出し */
- FileObj_Create(&self->FileObj, &WinSockFile_FileObjMethods);
-
- /* デバイスドライバ本体と関連付け */
- self->pWinSockDrv = (C_WINSOCKDRV *)pParam;
-
- /* デバイスを開く */
- WinSockDrv_Open(self->pWinSockDrv);
-
- return FILE_ERR_OK;
-}
-
-
-/** デストラクタ */
-void WinSockFile_Delete(HANDLE hFile)
-{
- C_WINSOCKFILE *self;
-
- self = (C_WINSOCKFILE *)hFile;
-
- /* デバイスを閉じる */
- WinSockDrv_Close(self->pWinSockDrv);
-
- /* 親クラスデストラクタ呼び出し */
- FileObj_Delete(&self->FileObj);
-}
-
-
-FILE_ERR WinSockFile_IoControl(HANDLE hFile, int iFunc, const void *pInBuf, FILE_SIZE InSize, void *pOutBuf, FILE_SIZE OutSize)
-{
- return FILE_ERR_NG;
-}
-
-
-FILE_SIZE WinSockFile_Read(HANDLE hFile, void *pBuf, FILE_SIZE Size)
-{
- C_WINSOCKFILE *self;
-
- self = (C_WINSOCKFILE *)hFile;
-
- return WinSockDrv_Read(self->pWinSockDrv, pBuf, Size);
-}
-
-FILE_SIZE WinSockFile_Write(HANDLE hFile, const void *pData, FILE_SIZE Size)
-{
- C_WINSOCKFILE *self;
-
- self = (C_WINSOCKFILE *)hFile;
-
- return WinSockDrv_Write(self->pWinSockDrv, pData, Size);
-}
-
-
-/* end of file */
+++ /dev/null
-/**
- * Hyper Operating System Application Framework
- *
- * @file winsockfile.h
- * @brief
- *
- * Copyright (C) 2006 by Project HOS
- * http://sourceforge.jp/projects/hos/
- */
-
-
-#ifndef __HOS__winsockfile_h__
-#define __HOS__winsockfile_h__
-
-
-#include "winsockdrv.h"
-#include "system/file/fileobj.h"
-
-
-/* SCI用ドライバ制御部 */
-typedef struct c_winsockfile
-{
- C_FILEOBJ FileObj; /* ファイルオブジェクトを継承 */
-
- C_WINSOCKDRV *pWinSockDrv; /* SciDrvクラスの参照 */
-} C_WINSOCKFILE;
-
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* SCI用デバイスドライバ */
-FILE_ERR WinSockFile_Create(HANDLE hFile, void *pParam, int iMode); /**< コンストラクタ */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __HOS__winsockfile_h__ */
-
-
-/* end of file */
#include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
+#include "system/file/syncdrv_local.h"
#define IPETHER_ARPTBL_SIZE 4
self->hMtxArp = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 受信プロセス生成 */
- self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, 1024, 2, SYSPRC_ATTR_NORMAL);
+ self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL);
return FILE_ERR_OK;
}
self = (C_IPETHER *)pDrvObj;
/* create file descriptor */
- if ( (hFile = SyncFile_Create(&self->SyncDrv)) == HANDLE_NULL )
+ if ( (hFile = SyncFile_Create(&self->SyncDrv, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
#include "system/sysapi/sysapi.h"
-#include "system/file/syncdrv.h"
+#include "system/file/syncdrv_local.h"
self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 受信プロセス生成 */
- self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, 1024, 2, SYSPRC_ATTR_NORMAL);
+ self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, NULL, 1024, 2, SYSPRC_ATTR_NORMAL);
return FILE_ERR_OK;
}
self = (C_TCPIP *)pDrvObj;
/* create file descriptor */
- if ( (hFile = TcpIpFile_Create(self)) == HANDLE_NULL )
+ if ( (hFile = TcpIpFile_Create(self, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
extern "C" {
#endif
-HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp);
+HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp, int iMode);
void TcpIpFile_Delete(HANDLE hFile);
#include "tcpipfile_local.h"
-void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp)
+void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp, int iMode)
{
/* 親クラスコンストラクタ */
- SyncFile_Constructor(&self->SyncFile, pMethods, &pTcpIp->SyncDrv);
+ SyncFile_Constructor(&self->SyncFile, pMethods, &pTcpIp->SyncDrv, iMode);
/* メンバ変数初期化 */
/* 初期化 */
};
-HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp)
+HANDLE TcpIpFile_Create(C_TCPIP *pTcpIp, int iMode)
{
C_TCPIPFILE *self;
}
/* コンストラクタ呼び出し */
- FatFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp);
+ FatFile_Constructor(self, &TcpIpFile_FileObjMethods, pTcpIp, iMode);
return (HANDLE)self;
}
extern "C" {
#endif
-void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp);
+void TcpIpFile_Constructor(C_TCPIPFILE *self, const T_FILEOBJ_METHODS *pMethods, C_TCPIP *pTcpIp, int iMode);
void TcpIpFile_Destructor(C_TCPIPFILE *self);
#ifdef __cplusplus
{
C_FILEOBJ FileObj; /* ボリュームオブジェクトを継承 */
- int iMode; /* ファイルのモード */
FATVOL_UINT uiStartCluster; /* ファイルの先頭クラスタ */
FATVOL_UINT uiDirCluster; /* 所属するディレクトリのクラスタ位置 */
void FatFile_Constructor(C_FATFILE *self, const T_FILEOBJ_METHODS *pMethods, C_FATVOL *pFatVol, FATVOL_UINT uiStartCluster, FATVOL_UINT uiDirCluster, FATVOL_UINT uiDirEntryPos, FILE_POS FileSize, int iMode)
{
/* 親クラスコンストラクタ */
- FileObj_Constructor(&self->FileObj, pMethods, &pFatVol->VolumeObj.DrvObj);
+ FileObj_Constructor(&self->FileObj, pMethods, &pFatVol->VolumeObj.DrvObj, iMode);
/* メンバ変数初期化 */
- self->iMode = iMode;
self->uiStartCluster = uiStartCluster;
self->uiDirCluster = uiDirCluster;
self->uiDirEntryPos = uiDirEntryPos;
FILE_ERR FatVol_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
{
C_FATVOL *self;
- C_FATFILE *pFile;
/* upper cast */
self = (C_FATVOL *)pDrvObj;
- pFile = (C_FATFILE *)pFileObj;
/* クリティカルセクションに入る */
SysMtx_Lock(self->hMtx);
SysMtx_Lock(self->hMtx);
/* サイズチェック */
- if ( !(pFile->iMode & FILE_OPEN_DIR) )
+ if ( !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
{
if ( Size > pFile->FileSize - pFile->FilePos )
{
}
/* 読み出し */
- while ( Size > 0 && (pFile->FilePos < pFile->FileSize || (pFile->iMode & FILE_OPEN_DIR)) )
+ while ( Size > 0 && (pFile->FilePos < pFile->FileSize || (FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR)) )
{
FILE_POS ReadStart;
FILE_SIZE ReadSize;
}
/* サイズクリップ */
- if ( pFile->FilePos > pFile->FileSize && !(pFile->iMode & FILE_OPEN_DIR) )
+ if ( pFile->FilePos > pFile->FileSize && !(pFile->FileObj.iMode & FILE_OPEN_DIR) )
{
pFile->FilePos = pFile->FileSize;
}
SysMtx_Lock(self->hMtx);
/* モードチェック */
- if ( !(pFile->iMode & FILE_OPEN_WRITE) || (pFile->iMode & FILE_OPEN_DIR) )
+ if ( !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_WRITE) || (FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
{
SysMtx_Unlock(self->hMtx);
return 0;
}
/* ディレクトリテーブルのサイズ更新 */
- if ( iResizeFlag && !(pFile->iMode & FILE_OPEN_DIR) )
+ if ( iResizeFlag && !(FileObj_GetMode(&pFile->FileObj) & FILE_OPEN_DIR) )
{
FatVol_SyncFileSize(self, pFile);
}
/* シェル起動 */
/*************************/
- Command_Execute("hsh", NULL);
+ Command_Execute("hsh -i", NULL);
return 0;
}
#include "application/utility/memwrite/memwrite.h"
#include "application/utility/memtest/memtest.h"
#include "application/utility/keytest/keytest.h"
+#include "boot.h"
#include "regs_sh7144.h"
int Boot_Process(VPARAM Param);
/* シェル起動 */
/*************************/
- Command_Execute("hsh", NULL);
+ Command_Execute("hsh -i", NULL);
return 0;
}
# %jp{C言語ファイルの追加}
CSRCS += ../kernel_cfg.c \
../main.c \
- ../boot_task.c \
+ ../boot.c \
../ostimer.c
# %jp{ライブラリの追加}
CSRCS += ./dbsct.c \
../kernel_cfg.c \
../main.c \
- ../boot_task.c \
+ ../boot.c \
../ostimer.c
ATT_INI({TA_HLNG, 0, OsTimer_Initialize});
/* %jp{サンプル}%en{Sample program} */
-INCLUDE("\"boot_task.h\"");
+INCLUDE("\"boot.h\"");
CRE_TSK(TSKID_BOOT, {TA_HLNG | TA_ACT, 0, Boot_Task, 2, 1024, NULL});
/* シェル起動 */
/*************************/
- Command_Execute("hsh", NULL);
+ Command_Execute("hsh -i", NULL);
return 0;
}
# %jp{C言語ファイルの追加}
CSRCS = $(CSRCS) ..\kernel_cfg.c
CSRCS = $(CSRCS) ..\main.c
-CSRCS = $(CSRCS) ..\sample.c
+CSRCS = $(CSRCS) ..\boot.c
CSRCS = $(CSRCS) ..\ostimer.c
CSRCS = $(CSRCS) ..\wintimer.c
{
/* %jp{タイマイベントを待つ} */
WaitForSingleObject(hEventTimer, INFINITE);
-
+
/* %jp{割り込みシグナルを入れる} */
vsig_int(inhno);
}
/* 仮想関数テーブル */
-const static T_HANDLEOBJ_METHODS Event_Methods =
+static const T_HANDLEOBJ_METHODS Event_Methods =
{
Event_Delete
};
#include "event.h"
-#include "system/handle/handleobj.h"
+#include "system/handle/handleobj_local.h"
#include "system/sysapi/sysapi.h"
int File_GetChar(HANDLE hFile)
{
- char c;
- if ( File_Read(hFile, &c, 1) != 1 )
- {
- return FILE_EOF;
- }
+ C_FILEOBJ *pFileObj;
+ char c;
+
+ pFileObj = (C_FILEOBJ *)hFile;
+
+ do
+ {
+ if ( File_Read(hFile, &c, 1) != 1 )
+ {
+ return FILE_EOF;
+ }
+ } while ( c == '\r' && (FileObj_GetMode(pFileObj) & FILE_OPEN_TEXT) );
+
+
return c;
}
int File_GetString(HANDLE hFile, char *pszString, int iSize)
{
- int i;
- int c;
-
+ int i;
+ int c;
+
for ( i = 0; i < iSize - 1; i++ )
{
c = File_GetChar(hFile);
+
if ( c == FILE_EOF )
{
if ( i == 0 )
if ( c == '\n' )
{
+ i++;
break;
}
}
pszString[i] = '\0';
-
+
return i;
}
typedef struct c_fileobj
{
C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
+
+ int iMode; /* オープン時のモード */
struct c_drvobj *pDrvObj; /* ドライバへの参照 */
} C_FILEOBJ;
extern "C" {
#endif
-HANDLE FileObj_Create(struct c_drvobj *pDrvObj);
+HANDLE FileObj_Create(struct c_drvobj *pDrvObj, int iMode);
void FileObj_Delete(HANDLE Handle);
+#define FileObj_GetMode(self) ((self)->iMode)
+
#ifdef __cplusplus
}
#endif
/* コンストラクタ */
-void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, C_DRVOBJ *pDrvObj)
+void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, C_DRVOBJ *pDrvObj, int iMode)
{
/* 親クラスコンストラクタ呼び出し */
HandleObj_Constructor(&self->HandleObj, &pMethods->HandlObjMethods);
/* メンバ変数初期化 */
self->pDrvObj = pDrvObj;
+ self->iMode = iMode;
}
#include "fileobj_local.h"
-#include "system/sysapi/sysapi.h"
+
static const T_FILEOBJ_METHODS FileObj_FileObjMethods =
};
-HANDLE FileObj_Create(struct c_drvobj *pDrvObj)
+HANDLE FileObj_Create(struct c_drvobj *pDrvObj, int iMode)
{
C_FILEOBJ *self;
}
/* コンストラクタ呼び出し */
- FileObj_Constructor(self, &FileObj_FileObjMethods, pDrvObj);
+ FileObj_Constructor(self, &FileObj_FileObjMethods, pDrvObj, iMode);
return (HANDLE)self;
}
* http://sourceforge.jp/projects/hos/
*/
-#include "fileobj.h"
+#include "fileobj_local.h"
void FileObj_Delete(HANDLE hFile)
self = (C_FILEOBJ *)hFile;
- HandleObj_Delete(&self->HandleObj);
+ FileObj_Destructor(self);
+
+ SysMem_Free(self);
}
#include "fileobj.h"
#include "system/handle/handleobj_local.h"
+#include "system/sysapi/sysapi.h"
#ifdef __cplusplus
extern "C" {
#endif
-void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, struct c_drvobj *pDrvObj); /**< コンストラクタ */
-void FileObj_Destructor(C_FILEOBJ *self); /**< デストラクタ */
+void FileObj_Constructor(C_FILEOBJ *self, const T_FILEOBJ_METHODS *pMethods, struct c_drvobj *pDrvObj, int iMode); /**< コンストラクタ */
+void FileObj_Destructor(C_FILEOBJ *self); /**< デストラクタ */
#ifdef __cplusplus
}
#define __HOS__syncdrv_h__
-#include "system/sysapi/sysapi.h"
-#include "system/file/syncfile.h"
-#include "system/file/drvobj.h"
-
-
-/* デバイスドライバオブジェクト基本クラス(抽象クラス) */
-typedef struct c_syncdrv
-{
- C_DRVOBJ DrvObj; /**< DrvObjクラスを継承 */
-
- C_SYNCFILE *pFileHead; /**< ファイルオブジェクトの連結ポインタ */
-
- SYSEVT_HANDLE hMtx; /**< 排他制御ミューテックス */
-
- int iSyncFactorNum; /**< 同期要因の数 */
- C_SYNCFILE **ppBusyFile; /**< 処理中ファイルオブジェクト */
-} C_SYNCDRV;
-
-
-
#ifdef __cplusplus
extern "C" {
#endif
#define __HOS__syncdrv_local_h__
-#include "system/file/syncdrv.h"
+#include "syncdrv.h"
#include "system/file/drvobj_local.h"
+#include "system/sysapi/sysapi.h"
+
/* 処理要因定義 */
#define SYNCDRV_FACTOR_NUM 3
+struct c_syncfile;
+
+/* デバイスドライバオブジェクト基本クラス(抽象クラス) */
+typedef struct c_syncdrv
+{
+ C_DRVOBJ DrvObj; /**< DrvObjクラスを継承 */
+
+ struct c_syncfile *pFileHead; /**< ファイルオブジェクトの連結ポインタ */
+
+ SYSEVT_HANDLE hMtx; /**< 排他制御ミューテックス */
+
+ int iSyncFactorNum; /**< 同期要因の数 */
+ struct c_syncfile **ppBusyFile; /**< 処理中ファイルオブジェクト */
+} C_SYNCDRV;
+
+
+#include "system/file/syncfile_local.h"
#ifdef __cplusplus
#define SyncDrv_GetSyncFactorNum(self) ((self)->iSyncFactorNum) /**< 同期要因数取得 */
-FILE_ERR SyncDrv_StartProcess(C_SYNCDRV *self, C_SYNCFILE *pSyncFile, int iFactor); /**< 処理の開始 */
+FILE_ERR SyncDrv_StartProcess(C_SYNCDRV *self, struct c_syncfile *pSyncFile, int iFactor); /**< 処理の開始 */
void SyncDrv_EndProcess(C_SYNCDRV *self, int iFactor, VPARAM ErrCode); /**< 処理の完了 */
void SyncDrv_SendSignal(C_SYNCDRV *self, int iFactor); /**< シグナルの送信 */
#define __HOS__syncfile_h__
-#include "system/sysapi/sysapi.h"
-#include "system/handle/handleobj.h"
-#include "system/file/fileobj.h"
+#include "hosaplfw.h"
struct c_syncdrv;
-/* 同期オブジェクト */
-typedef struct t_syncfile_syncobj
-{
- int Mode; /**< 同期モード */
- VPARAM ErrCode; /**< エラーコード */
- SYSEVT_HANDLE hEvt; /**< 同期イベント */
- T_FILE_SYNCINF Inf; /**< 同期情報 */
-} T_SYNCFILE_SYNCOBJ;
-
-
-/* ファイルブジェクト基本クラス定義 */
-typedef struct c_syncfile
-{
- C_FILEOBJ FileObj; /**< ファイルオブジェクトを継承 */
-
- struct c_syncfile *pNext; /**< イベント監視リスト連結用 */
- struct c_syncfile *pPrev; /**< イベント監視リスト連結用 */
-
- T_SYNCFILE_SYNCOBJ *pSyncObj; /**< 同期オブジェクト */
-} C_SYNCFILE;
-
#ifdef __cplusplus
extern "C" {
#endif
-HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv);
+HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv, int iMode);
void SyncFile_Delete(HANDLE hFile);
-void SyncFile_SetSignal(C_SYNCFILE *self, int iFactor); /**< シグナルのセット */
-#define SyncFile_ClearSignal(self, iFactor) do { SysEvt_Clear((self)->pSyncObj[iFactor].hEvt); } while(0) /**< シグナルのクリア */
-#define SyncFile_WaitSignal(self, iFactor) do { SysEvt_Wait((self)->pSyncObj[iFactor].hEvt); } while(0) /**< シグナルを待つ */
-#define SyncFile_RefSignal(self, iFactor) (SysEvt_RefStatus((self)->pSyncObj[iFactor].hEvt)) /**< シグナルの状態参照 */
-
-#define SyncFile_SetSyncMode(self, iFactor, x) do { ((self)->pSyncObj[iFactor].Mode) = (x); } while(0) /**< 同期モード設定 */
-#define SyncFile_GetSyncMode(self, iFactor) ((self)->pSyncObj[iFactor].Mode) /**< 同期モード取得 */
-
-#define SyncFile_SetSyncInf(self, iFactor, x) do { ((self)->pSyncObj[iFactor].Inf) = (x); } while(0) /**< 同期情報設定 */
-#define SyncFile_GetSyncInf(self, iFactor) ((self)->pSyncObj[iFactor].Inf) /**< 同期情報取得 */
-
-#define SyncFile_SetErrCode(self, iFactor, x) do { ((self)->pSyncObj[iFactor].ErrCode) = (x); } while(0) /**< エラーコード設定 */
-#define SyncFile_GetErrCode(self, iFactor) ((self)->pSyncObj[iFactor].ErrCode) /**< エラーコード取得 */
-
-
#ifdef __cplusplus
}
#endif
#include "syncfile_local.h"
-FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv)
+FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv, int iMode)
{
int iFactorNum;
int i;
}
/* 親クラスコンストラクタ呼び出し */
- FileObj_Constructor(&self->FileObj, pMethods, &pSyncDrv->DrvObj);
+ FileObj_Constructor(&self->FileObj, pMethods, &pSyncDrv->DrvObj, iMode);
/* メンバ初期化 */
for ( i = 0; i < iFactorNum; i++ )
};
-HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv)
+HANDLE SyncFile_Create(struct c_syncdrv *pSyncDrv, int iMode)
{
C_SYNCFILE *self;
}
/* コンストラクタ呼び出し */
- if ( SyncFile_Constructor(self, &SyncFile_FileObjMethods, pSyncDrv) != FILE_ERR_OK )
+ if ( SyncFile_Constructor(self, &SyncFile_FileObjMethods, pSyncDrv, iMode) != FILE_ERR_OK )
{
SysMem_Free(self);
return HANDLE_NULL;
#include "syncfile.h"
#include "system/file/fileobj_local.h"
-#include "syncdrv_local.h"
+#include "system/file/syncdrv_local.h"
+#include "system/sysapi/sysapi.h"
+
+
+/* 同期オブジェクト */
+typedef struct t_syncfile_syncobj
+{
+ int Mode; /**< 同期モード */
+ VPARAM ErrCode; /**< エラーコード */
+ SYSEVT_HANDLE hEvt; /**< 同期イベント */
+ T_FILE_SYNCINF Inf; /**< 同期情報 */
+} T_SYNCFILE_SYNCOBJ;
+
+
+/* ファイルブジェクト基本クラス定義 */
+typedef struct c_syncfile
+{
+ C_FILEOBJ FileObj; /**< ファイルオブジェクトを継承 */
+
+ struct c_syncfile *pNext; /**< イベント監視リスト連結用 */
+ struct c_syncfile *pPrev; /**< イベント監視リスト連結用 */
+
+ T_SYNCFILE_SYNCOBJ *pSyncObj; /**< 同期オブジェクト */
+} C_SYNCFILE;
+
#ifdef __cplusplus
extern "C" {
#endif
-FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv);
+FILE_ERR SyncFile_Constructor(C_SYNCFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_syncdrv *pSyncDrv, int iMode);
void SyncFile_Destructor(C_SYNCFILE *self);
+void SyncFile_SetSignal(C_SYNCFILE *self, int iFactor); /**< シグナルのセット */
+#define SyncFile_ClearSignal(self, iFactor) do { SysEvt_Clear((self)->pSyncObj[iFactor].hEvt); } while(0) /**< シグナルのクリア */
+#define SyncFile_WaitSignal(self, iFactor) do { SysEvt_Wait((self)->pSyncObj[iFactor].hEvt); } while(0) /**< シグナルを待つ */
+#define SyncFile_RefSignal(self, iFactor) (SysEvt_RefStatus((self)->pSyncObj[iFactor].hEvt)) /**< シグナルの状態参照 */
+
+#define SyncFile_SetSyncMode(self, iFactor, x) do { ((self)->pSyncObj[iFactor].Mode) = (x); } while(0) /**< 同期モード設定 */
+#define SyncFile_GetSyncMode(self, iFactor) ((self)->pSyncObj[iFactor].Mode) /**< 同期モード取得 */
+
+#define SyncFile_SetSyncInf(self, iFactor, x) do { ((self)->pSyncObj[iFactor].Inf) = (x); } while(0) /**< 同期情報設定 */
+#define SyncFile_GetSyncInf(self, iFactor) ((self)->pSyncObj[iFactor].Inf) /**< 同期情報取得 */
+
+#define SyncFile_SetErrCode(self, iFactor, x) do { ((self)->pSyncObj[iFactor].ErrCode) = (x); } while(0) /**< エラーコード設定 */
+#define SyncFile_GetErrCode(self, iFactor) ((self)->pSyncObj[iFactor].ErrCode) /**< エラーコード取得 */
+
#ifdef __cplusplus
}
#endif
}
/* ディスクリプタ生成 */
- if ( (hDir = SysVolFile_Create(self)) == HANDLE_NULL )
+ if ( (hDir = SysVolFile_Create(self, iMode)) == HANDLE_NULL )
{
return HANDLE_NULL;
}
extern "C" {
#endif
-HANDLE SysVolFile_Create(struct c_sysvol *pSysVol);
+HANDLE SysVolFile_Create(struct c_sysvol *pSysVol, int iMode);
void SysVolFile_Delete(HANDLE hFile);
#ifdef __cplusplus
/* コンストラクタ */
-void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol)
+void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol, int iMode)
{
/* 親クラスコンストラクタ呼び出し */
- FileObj_Constructor(&self->FileObj, pMethods, &pSysVol->VolumeObj.DrvObj);
+ FileObj_Constructor(&self->FileObj, pMethods, &pSysVol->VolumeObj.DrvObj, iMode);
/* メンバ変数初期化 */
self->iReadPtr = 0;
};
-HANDLE SysVolFile_Create(struct c_sysvol *pSysVol)
+HANDLE SysVolFile_Create(struct c_sysvol *pSysVol, int iMode)
{
C_SYSVOLFILE *self;
}
/* コンストラクタ呼び出し */
- SysVolFile_Constructor(self, &SysVolFile_FileObjMethods, pSysVol);
+ SysVolFile_Constructor(self, &SysVolFile_FileObjMethods, pSysVol, iMode);
return (HANDLE)self;
}
extern "C" {
#endif
-void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol);
+void SysVolFile_Constructor(C_SYSVOLFILE *self, const T_FILEOBJ_METHODS *pMethods, struct c_sysvol *pSysVol, int iMode);
void SysVolFile_Destructor(C_SYSVOLFILE *self);
#ifdef __cplusplus
}
SysEvt_Clear(self->hEvt);
+ /* スタック用メモリ確保 */
+ if ( (self->pStack = SysMem_Alloc(self->StackSize)) == NULL )
+ {
+ return PROCESS_ERR_NG;
+ }
+
/* プロセス生成 */
- self->hPrc = SysPrc_Create(Process_Entry, (VPARAM)self, self->StackSize, self->Priority, SYSPRC_ATTR_NORMAL);
+ self->hPrc = SysPrc_Create(Process_Entry, (VPARAM)self, self->pStack, self->StackSize, self->Priority, SYSPRC_ATTR_NORMAL);
if ( self->hPrc == SYSPRC_HANDLE_NULL )
{
SysEvt_Delete(self->hEvt);
+ SysMem_Free(self->pStack);
return PROCESS_ERR_NG;
}
/* 待ち合わせ用イベント生成 */
SysEvt_Delete(self->hEvt);
+ /* スタック用メモリ開放 */
+ SysMem_Free(self->pStack);
+
/* 親クラスデストラクタ呼び出し */
HandleObj_Destructor(&self->HandleObj);
}
SYSEVT_HANDLE hEvt; /**< 待ち合わせ用イベント */
int iExitCode; /**< 終了コード */
HANDLE *pHandleList; /**< 所有するハンドルのリスト(終了時に開放) */
-
+ void *pStack; /**< スタック領域のメモリ */
+
int (*pfncEntry)(VPARAM Param); /**< 起動アドレス */
VPARAM Param; /**< ユーザーパラメータ */
MEMSIZE StackSize; /**< スタックサイズ */
} C_SHELL;
-void Shell_Create(C_SHELL *self);
-void Shell_Delete(C_SHELL *self);
-int Shell_Execute(C_SHELL *self, int argc, char *argv[]);
-int Shell_InputLine(C_SHELL *self, char *pszBuf, int iBufSize);
-void Shell_PutChar(C_SHELL *self, int c);
-void Shell_CurRight(C_SHELL *self);
-void Shell_CurLeft(C_SHELL *self);
-void Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand);
-void Shell_ReplaceLine(C_SHELL *self, const char *pszNewLine); /* ラインを置き換える */
+C_SHELL *Shell_Create(void);
+void Shell_Delete(C_SHELL *self);
+int Shell_Interactive(C_SHELL *self);
+int Shell_ExecuteScript(C_SHELL *self, const char *pszFileName);
+int Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand);
+int Shell_InputLine(C_SHELL *self, char *pszBuf, int iBufSize);
+void Shell_PutChar(C_SHELL *self, int c);
+void Shell_CurRight(C_SHELL *self);
+void Shell_CurLeft(C_SHELL *self);
+void Shell_ReplaceLine(C_SHELL *self, const char *pszNewLine); /* ラインを置き換える */
int Shell_Main(int argc, char *argv[])
{
- C_SHELL *pShell;
+ C_SHELL *self;
int iExitCode;
-
+ int i;
+
/* オブジェクト生成 */
- if ( (pShell = Memory_Alloc(sizeof(C_SHELL))) == NULL )
+ if ( (self = Shell_Create()) == NULL )
{
- StdIo_PutString("Memory error\n");
- return 1;
+ return 0;
}
- Shell_Create(pShell);
- /* 実行 */
- iExitCode = Shell_Execute(pShell, argc, argv);
-
- /* オブジェクト開放 */
- Shell_Delete(pShell);
- Memory_Free(pShell);
+ /* オプションを解析して実行 */
+ for ( i = 1; i < argc; i++ )
+ {
+ if ( argv[i][0] == '-' )
+ {
+ if ( argv[i][1] == 'i' ) /* インタラクティブモード */
+ {
+ iExitCode = Shell_Interactive(self);
+ }
+ else if ( argv[i][1] == 's' ) /* 文字列実行 */
+ {
+ /* 後続を結合 */
+ self->szCommanBuf[0] = '\0';
+ for ( i++; i < argc; i++ )
+ {
+ strcat(self->szCommanBuf, argv[i]);
+ if ( i + 1 < argc )
+ {
+ strcat(self->szCommanBuf, " ");
+ }
+ }
+
+ /* 実行 */
+ iExitCode = Shell_ExecuteCommand(self, self->szCommanBuf);
+ }
+ }
+ else /* スクリプト実行 */
+ {
+ return Shell_ExecuteScript(self, argv[i]);
+ }
+ }
+
+ /* オブジェクト削除 */
+ Shell_Delete(self);
return iExitCode;
}
/* コンストラクタ */
-void Shell_Create(C_SHELL *self)
+C_SHELL *Shell_Create(void)
{
+ C_SHELL *self;
+
+ /* オブジェクト生成 */
+ if ( (self = Memory_Alloc(sizeof(C_SHELL))) == NULL )
+ {
+ StdIo_PutString("Memory error\n");
+ return NULL;
+ }
+
+ /* メンバ初期化 */
self->iScreenWidth = 80;
self->iHistoryNum = 0;
+
+ return self;
}
/* デストラクタ */
void Shell_Delete(C_SHELL *self)
{
+ Memory_Free(self);
}
-int Shell_Execute(C_SHELL *self, int argc, char *argv[])
+/* スクリプト実行 */
+int Shell_ExecuteScript(C_SHELL *self, const char *pszFileName)
+{
+ HANDLE hFile;
+ int iLen;
+
+ /* ファイルオープン */
+ if ( (hFile = File_Open(pszFileName, FILE_OPEN_READ | FILE_OPEN_TEXT)) == HANDLE_NULL )
+ {
+ StdIo_PrintFormat("open error : %s\n", pszFileName);
+ return 1;
+ }
+
+ /* ファイルを実行 */
+ while ( (iLen = File_GetString(hFile, self->szCommanBuf, sizeof(self->szCommanBuf))) > 0 )
+ {
+ /* 末尾の改行削除 */
+ if ( self->szCommanBuf[iLen-1] == '\n' )
+ {
+ self->szCommanBuf[iLen-1] = '\0';
+ }
+
+ /* 実行 */
+ if ( self->szCommanBuf[0] != '\0' && self->szCommanBuf[0] != '#' )
+ {
+ Shell_ExecuteCommand(self, self->szCommanBuf);
+ }
+ }
+
+ /* ファイルクローズ */
+ File_Close(hFile);
+
+ return 0;
+}
+
+
+
+/* インタラクティブモード */
+int Shell_Interactive(C_SHELL *self)
{
int i;
}
-void Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand)
+int Shell_ExecuteCommand(C_SHELL *self, const char *pszCommand)
{
T_PROCESS_CREATE_INF Inf;
-
+ int iExitCode;
int iLen;
iLen = strlen(pszCommand);
}
else
{
- if ( Command_Execute(pszCommand, NULL) != COMMAND_ERR_OK )
+ if ( Command_Execute(pszCommand, &iExitCode) != COMMAND_ERR_OK )
{
StdIo_PutString("command is not found.\r\n");
}
}
+
+ return iExitCode;
}
void SysIsr_Delete(SYSISR_HANDLE hIsr);
/* システム用プロセス制御API */
-SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, MEMSIZE StackSize, int Priority, int iAttr);
+SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, void *pStack, MEMSIZE StackSize, int Priority, int iAttr);
/**< プロセス生成(システム用) */
void SysPrc_Delete(SYSPRC_HANDLE hPrc); /**< プロセス削除(システム用) */
VPARAM SysPrc_GetParam(SYSPRC_HANDLE hPrc); /**< プロセスのパラメータ取得(システム用) */
/* プロセス生成 */
-SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, MEMSIZE StackSize, int Priority, int iAttr)
+SYSPRC_HANDLE SysPrc_Create(void (*pfncEntry)(VPARAM Param), VPARAM Param, void *pStack, MEMSIZE StackSize, int Priority, int iAttr)
{
T_CTSK ctsk;
ER_ID erid;
ctsk.task = (FP)pfncEntry;
ctsk.itskpri = (PRI)Priority;
ctsk.stksz = (SIZE)StackSize;
- ctsk.stk = NULL;
+ ctsk.stk = pStack;
erid = acre_tsk(&ctsk);
if ( erid < 0 )
{
depend: makelib_depend
-
# %jp{gcc用の設定読込み}
include $(KERNEL_MAKINC_DIR)/gcc_d.inc
/** %jp{コンテキスト情報保存ブロック} */
typedef struct _kernel_t_ctxcb
{
- HANDLE hEvent; /**< %jp{ã\82¹ã\83¬ã\83\83ã\83\89ハンドル} */
+ HANDLE hEvent; /**< %jp{ã\82¤ã\83\99ã\83³ã\83\88ハンドル} */
HANDLE hThread; /**< %jp{スレッドハンドル} */
DWORD dwThreadId; /**< %jp{スレッドID} */
BOOL blIntSuspend; /**< %jp{割り込みディスパッチされた} */
* @file ctxctlc
* @brief %jp{コンテキスト制御}%en{context control}
*
- * Copyright (C) 1998-2006 by Project HOS
+ * Copyright (C) 1998-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
*/
-static DWORD WINAPI _kernel_ctx_ent(LPVOID param); /* %jp{スレッドの開始関数} */
-static void _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /* %jp{スレッドの実行開始} */
-static void _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /* %jp{スレッドの停止待ち} */
+static DWORD WINAPI _kernel_ctx_ent(LPVOID param); /* %jp{スレッドの開始関数} */
+static void _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /* %jp{スレッドの実行開始} */
+static void _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb); /* %jp{スレッドの停止待ち} */
-static _KERNEL_T_CTXCB *_kernel_win32_runctxcb = NULL; /**< %jp{実行中のコンテキスト} */
-static _KERNEL_T_CTXCB *_kernel_win32_oldctxcb = NULL; /**< %jp{直前の実行コンテキスト} */
-static HANDLE _kernel_win32_hSemIntCtx = NULL; /**< %jp{割り込みの排他制御セマフォ} */
-static HANDLE _kernel_win32_hSemDisInt = NULL; /**< %jp{システムの排他制御用セマフォ} */
-static volatile BOOL _kernel_win32_blIntCtx = FALSE; /**< %jp{割り込み処理中フラグ} */
-static volatile BOOL _kernel_win32_blDisInt = TRUE; /**< %jp{割り込み禁止フラグ} */
-static volatile BOOL _kernel_win32_blDlyDsp = FALSE; /**< %jp{遅延ディスパッチフラグ} */
-static DWORD _kernel_win32_hPrimaryThreadId = 0; /**< %jp{プライマリスレッドID} */
+static CRITICAL_SECTION _kernel_win32_CriticalSection;
+static _KERNEL_T_CTXCB *_kernel_win32_runctxcb = NULL; /**< %jp{実行中のコンテキスト} */
+static _KERNEL_T_CTXCB *_kernel_win32_intctxcb = NULL; /**< %jp{割込みからスイッチされたコンテキスト} */
+static HANDLE _kernel_win32_hSemDisInt = NULL; /**< %jp{システムの排他制御用セマフォ} */
+static volatile BOOL _kernel_win32_blIntCtx = FALSE; /**< %jp{割込み処理中フラグ} */
+static volatile BOOL _kernel_win32_blDisInt = TRUE; /**< %jp{割込み禁止フラグ} */
+static volatile BOOL _kernel_win32_blIntDsp = FALSE; /**< %jp{割込み時ディスパッチフラグ} */
+static DWORD _kernel_win32_hPrimaryThreadId = 0; /**< %jp{プライマリスレッドID} */
/** %jp{システムの初期化} */
void _kernel_ini_prc(void)
{
+ InitializeCriticalSection(&_kernel_win32_CriticalSection);
+
/* %jp{プライマリスレッドIDの保存} */
_kernel_win32_hPrimaryThreadId = GetCurrentThreadId();
/* %jp{割り込み禁止に見立てるセマフォの作成} */
_kernel_win32_hSemDisInt = CreateSemaphore(NULL, 0, 1, NULL);
-
- /* %jp{割り込みの排他制御セマフォの生成} */
- _kernel_win32_hSemIntCtx = CreateSemaphore(NULL, 1, 1, NULL);
}
-/** %jp{割り込み許可} */
-void _kernel_ena_int(void)
+/** %jp{割り込み禁止} */
+void _kernel_dis_int(void)
{
+ /* 割込みコンテキストから呼ばれたなら何もしない */
if ( _kernel_win32_blIntCtx )
{
return;
}
- if ( _kernel_win32_blDisInt )
+ /* 既に割込み禁止で無ければセマフォを取る */
+ if ( !_kernel_win32_blDisInt )
{
- _kernel_win32_blDisInt = FALSE;
- ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
+ WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
+ _kernel_win32_blDisInt = TRUE;
}
}
-/** %jp{割り込み禁止} */
-void _kernel_dis_int(void)
+/** %jp{割り込み許可} */
+void _kernel_ena_int(void)
{
+ /* 割込みコンテキストから呼ばれたなら何もしない */
if ( _kernel_win32_blIntCtx )
{
return;
}
-
- if ( !_kernel_win32_blDisInt )
+
+ /* 既に割込み禁止ならセマフォを返す */
+ if ( _kernel_win32_blDisInt )
{
- WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
- _kernel_win32_blDisInt = TRUE;
+ _kernel_win32_blDisInt = FALSE;
+ ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
}
}
+
/** %jp{実行コンテキストの作成} */
void _kernel_cre_ctx(
_KERNEL_T_CTXCB *pk_ctxcb, /* コンテキストを作成するアドレス */
/* %jp{コンテキストスレッド生成} */
pk_ctxcb->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
-#if 1
pk_ctxcb->hThread = CreateThread(NULL, 0, _kernel_ctx_ent, (LPVOID)pk_ctxcb,
0, &pk_ctxcb->dwThreadId);
-#else
- pk_ctxcb->hThread = _beginthread(_kernel_ctx_ent, 0, (void *)pk_ctxcb);
-#endif
-
- /* %jp{pk_ctxcb->hThreadの格納完了後に開始} */
- SetEvent(pk_ctxcb->hEvent);
-
- _kernel_wai_ctx(pk_ctxcb);
}
/* %jp{リスタート用setjmp} */
setjmp(pk_ctxcb->jmpenv);
- /* %jp{自分自身をサスペンドさせる} */
- SuspendThread(pk_ctxcb->hThread);
-
- /* %jp{直前のコンテキストスレッドが確実にサスペンドするのを待つ} */
- _kernel_wai_ctx(_kernel_win32_oldctxcb);
- _kernel_win32_oldctxcb = NULL;
-
+ /* 開始 */
pk_ctxcb->entry(pk_ctxcb->exinf1, pk_ctxcb->exinf2);
return 0;
void _kernel_del_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
{
/* スレッド削除 */
- CloseHandle(pk_ctxcb->hEvent);
TerminateThread(pk_ctxcb->hThread, 0);
+ CloseHandle(pk_ctxcb->hThread);
+ CloseHandle(pk_ctxcb->hEvent);
}
return;
}
- /* %jp{割り込みの終わりで発生した場合} */
+ /* 割込み処理から呼ばれたら */
if ( _kernel_win32_blIntCtx )
{
- /* %jp{割り込み状態を解除} */
- _kernel_win32_blIntCtx = FALSE;
-
- /* 切り替え先のスレッドを起こす */
- _kernel_run_ctx(ctxcb_nxt);
-
- /* 遅延ディスパッチあり */
- _kernel_win32_blDlyDsp = TRUE;
-
- return;
+ /* 切り替えを予約 */
+ _kernel_win32_blIntDsp = TRUE;
+ _kernel_win32_intctxcb = ctxcb_nxt;
}
else
{
- /* %jp{切り替え先のスレッドを起こす} */
+ /* 切り替え先スレッドの動作開始 */
_kernel_run_ctx(ctxcb_nxt);
- /* %jp{自分自身をサスペンドさせる} */
- SuspendThread(ctxcb_now->hThread);
-
- /* %jp{直前のタスクが確実にサスペンドするのを待つ} */
- _kernel_wai_ctx(_kernel_win32_oldctxcb);
- _kernel_win32_oldctxcb = NULL;
- }
-}
-
-
-/** %jp{スレッドの停止待ち} */
-void _kernel_wai_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
-{
- if ( pk_ctxcb == NULL )
- {
- return;
- }
-
- while ( SuspendThread(pk_ctxcb->hThread) != 1 )
- {
- ResumeThread(pk_ctxcb->hThread);
- Sleep(1);
+ /* %jp{再開待ち} */
+ WaitForSingleObject(ctxcb_now->hEvent, INFINITE);
}
- ResumeThread(pk_ctxcb->hThread);
-}
-
+}
/** %jp{アイドル時の処理} */
void _kernel_run_ctx(_KERNEL_T_CTXCB *pk_ctxcb)
{
/* %jp{実行中コンテキストの登録} */
- _kernel_win32_oldctxcb = _kernel_win32_runctxcb;
_kernel_win32_runctxcb = pk_ctxcb;
/* %jp{割り込みから中断されていた場合} */
if ( pk_ctxcb->blIntSuspend )
{
- pk_ctxcb->blIntSuspend = FALSE;
-
+ /* %jp{割り込み用セマフォを返す} */
_kernel_win32_blDisInt = FALSE;
ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
+
+ /* スレッド動作再開 */
+ pk_ctxcb->blIntSuspend = FALSE;
+ ResumeThread(pk_ctxcb->hThread);
+ }
+ else
+ {
+ /* %jp{スレッドを起こす} */
+ SetEvent(pk_ctxcb->hEvent);
}
-
- /* %jp{スレッドを起こす} */
- ResumeThread(pk_ctxcb->hThread);
}
/* %jp{割り込み用処理} */
void vsig_int(int inhno)
{
- WaitForSingleObject(_kernel_win32_hSemIntCtx, INFINITE);
+ EnterCriticalSection(&_kernel_win32_CriticalSection);
/* %jp{割り込み用セマフォを取る} */
WaitForSingleObject(_kernel_win32_hSemDisInt, INFINITE);
/* %jp{現在実行中のスレッドを止める} */
SuspendThread(_kernel_win32_runctxcb->hThread);
- _kernel_win32_runctxcb->blIntSuspend = TRUE;
/* %jp{割り込み状態に設定} */
_kernel_win32_blIntCtx = TRUE;
- _kernel_win32_blDlyDsp = FALSE;
+ _kernel_win32_blIntDsp = FALSE;
/* %jp{割り込み処理} */
_kernel_sta_inh();
_kernel_exe_inh(inhno);
_kernel_end_inh();
+
+ /* %jp{割り込み状態を解除} */
+ _kernel_win32_blIntCtx = FALSE;
- /* %jp{遅延ディスパッチが発生しなければ復帰処理} */
- if ( !_kernel_win32_blDlyDsp )
+
+ /* %jp{遅延ディスパッチ発生なら} */
+ if ( _kernel_win32_blIntDsp )
{
- /* %jp{割り込み状態を解除} */
- _kernel_win32_blIntCtx = FALSE;
+ /* 元のスレッドをサスペンドのままマーク */
+ _kernel_win32_runctxcb->blIntSuspend = TRUE;
+ /* 切り替え先スレッドの動作開始 */
+ _kernel_run_ctx(_kernel_win32_intctxcb);
+ }
+ else
+ {
/* %jp{割り込み用セマフォを返す} */
_kernel_win32_blDisInt = FALSE;
ReleaseSemaphore(_kernel_win32_hSemDisInt, 1, NULL);
/* %jp{現在実行中のスレッドを再開} */
- _kernel_win32_runctxcb->blIntSuspend = FALSE;
- ResumeThread(_kernel_win32_runctxcb->hThread);
+ ResumeThread(_kernel_win32_runctxcb->hThread);
}
- ReleaseSemaphore(_kernel_win32_hSemIntCtx, 1, NULL);
+ LeaveCriticalSection(&_kernel_win32_CriticalSection);
}
}
#endif
+ /* %jp{パラメータのチェック} */
+#ifdef _KERNEL_SPT_TWAI_FLG_E_PAR
+ if ( waiptn == 0 )
+ {
+ return E_PAR; /* %jp{パラメータ不正} */
+ }
+#endif
+
+
_KERNEL_ENTER_SVC(); /* %jp{サービスコール開始} */
/* %jp{オブジェクト存在チェック} */
/* %jp{条件を満たして解除されたのなら} */
if ( ercd == E_OK )
{
- *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */
+ if ( p_flgptn != NULL )
+ {
+ *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */
+ }
}
}
else
return E_ID; /* %jp{ID不正} */
}
#endif
+
+ /* %jp{パラメータのチェック} */
+#ifdef _KERNEL_SPT_WAI_FLG_E_PAR
+ if ( waiptn == 0 )
+ {
+ return E_PAR; /* %jp{パラメータ不正} */
+ }
+#endif
_KERNEL_ENTER_SVC(); /* %jp{サービスコール開始} */
if ( _kernel_chk_flg(flgcb, &flginf) )
{
/* %jp{既に条件を満たしているなら} */
- *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb); /* %jp{解除時のフラグパターンを格納} */
-
+ if ( p_flgptn != NULL )
+ {
+ *p_flgptn = _KERNEL_FLG_GET_FLGPTN(flgcb); /* %jp{解除時のフラグパターンを格納} */
+ }
+
#if _KERNEL_SPT_FLG_TA_CLR
if ( _KERNEL_FLG_GET_FLGATR(_KERNEL_FLG_GET_FLGCB_RO(flgid, flgcb)) & TA_CLR )
{
/* %jp{条件を満たして解除されたのなら} */
if ( ercd == E_OK )
{
- *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */
+ if ( p_flgptn != NULL )
+ {
+ *p_flgptn = flginf.waiptn; /* %jp{解除時のフラグパターンを格納} */
+ }
}
}
_KERNEL_T_ISRCB_PTR isrcb;
_KERNEL_T_ISRHDL isrhdl;
- isrhdl = _KERNEL_INT_GET_HEAD(intno);
- isrcb = _KERNEL_ISR_ISRHDL2ISRCB(isrhdl);
- isrcb_ro = _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl);
+ isrhdl = _KERNEL_INT_GET_HEAD(intno);
while ( isrhdl != _KERNEL_ISRHDL_NULL )
{
+ isrcb = _KERNEL_ISR_ISRHDL2ISRCB(isrhdl);
+ isrcb_ro = _KERNEL_ISR_ISRHDL2ISRCBRO(isrhdl);
+
_KERNEL_ENA_INT(); /* %jp{多重割込み許可} */
_KERNEL_ISR_GET_ISR(isrcb_ro)(_KERNEL_ISR_GET_EXINF(isrcb_ro));
_KERNEL_DIS_INT(); /* %jp{割込み禁止} */