#include "system/handle/handle.h"
#include "system/memory/memory.h"
+#include "system/event/event.h"
+#include "system/mutex/mutex.h"
#include "system/time/time.h"
#include "system/process/process.h"
#include "system/command/command.h"
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__event_h__
+#define __HOS__event_h__
+
+
+#include "system/handle/handle.h"
+
+
+/* エラーコード定義 */
+#define EVENT_ERR_OK 0
+#define EVENT_ERR_NG (-1)
+
+/* エラー型 */
+typedef int EVENT_ERR;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE Event_Create(void);
+void Event_Delete(HANDLE hEvent);
+EVENT_ERR Event_Set(HANDLE hEvent);
+EVENT_ERR Event_Wait(HANDLE hEvent);
+int Event_Ref(HANDLE hEvent);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__event_h__ */
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "event_local.h"
+
+
+/* 仮想関数テーブル */
+const static T_HANDLEOBJ_METHODS Event_Methods =
+ {
+ Event_Delete
+ };
+
+
+HANDLE Event_Create(void)
+{
+ C_EVENT *self;
+
+ /* メモリ確保 */
+ if ( (self = SysMem_Alloc(sizeof(*self))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+
+ /* オブジェクト生成 */
+ if ( (self->hSysEvt = SysEvt_Create()) == SYSEVT_HANDLE_NULL )
+ {
+ SysMem_Free(self);
+ }
+
+ /* 親クラスコンストラクタ呼び出し */
+ HandleObj_Create(&self->HandleObj, &Event_Methods);
+}
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "event_local.h"
+
+
+/* デストラクタ */
+void Event_Delete(HANDLE hEvent)
+{
+ C_EVENT *self;
+
+ /* キャスト */
+ self = (C_EVENT *)hEvent;
+
+ /* イベント削除 */
+ SysEvt_Delete(self->hSysEvt);
+
+ /* 親クラスデストラクタ呼び出し */
+ HandleObj_Delete(&self->HandleObj);
+
+ /* メモリ削除 */
+ SysMem_Free(self);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#ifndef __HOS__event_local_h__
+#define __HOS__event_local_h__
+
+
+#include "event.h"
+#include "system/handle/handleobj.h"
+#include "system/sysapi/sysapi.h"
+
+
+/* イベントオブジェクトクラス定義 */
+typedef struct c_event
+{
+ C_HANDLEOBJ HandleObj; /* ハンドルオブジェクトを継承 */
+
+ SYSEVT_HANDLE hSysEvt; /* イベント */
+} C_EVENT;
+
+
+#endif /* __HOS__event_local_h__ */
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "event_local.h"
+
+
+/* イベントセット */
+EVENT_ERR Event_Set(HANDLE hEvent)
+{
+ C_EVENT *self;
+
+ /* キャスト */
+ self = (C_EVENT *)hEvent;
+
+ /* イベントセット */
+ SysEvt_Set(self->hSysEvt);
+
+ return EVENT_ERR_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file event.h
+ * @brief %jp{イベントオブジェクト}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "event_local.h"
+
+
+/* イベント待ち */
+EVENT_ERR Event_Wait(HANDLE hEvent)
+{
+ C_EVENT *self;
+
+ /* キャスト */
+ self = (C_EVENT *)hEvent;
+
+ /* イベント待ち */
+ SysEvt_Wait(self->hSysEvt);
+
+ return EVENT_ERR_OK;
+}
+
+
+/* end of file */
#define __HOS__chrdrv_h__
+#include "system/sysapi/sysapi.h"
#include "system/file/chrfile.h"
#include "system/file/drvobj.h"
/* デバイスドライバオブジェクト基本クラス */
typedef struct c_chrdrv
{
- C_DRVOBJ DrvObj; /* DrvObjクラスを継承 */
+ C_DRVOBJ DrvObj; /**< DrvObjクラスを継承 */
- char iWriteSignal; /* 書込み状態 */
- char iReadSignal; /* 読出し状態 */
- C_CHRFILE *pMonHead; /* 状態監視オブジェクトの連結ポインタ */
+ SYSEVT_HANDLE hMtx; /* 排他制御ミューテックス */
+ SYSEVT_HANDLE hEvtWrite; /* 書込みイベント */
+ SYSEVT_HANDLE hEvtRead; /* 読込みイベント */
+
+ C_CHRFILE *pFileHead; /**< 状態監視オブジェクトの連結ポインタ */
} C_CHRDRV;
extern "C" {
#endif
-void ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */
-void ChrDrv_Delete(C_CHRDRV *self); /**< デストラクタ */
+FILE_ERR ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods); /**< コンストラクタ */
+void ChrDrv_Delete(C_CHRDRV *self); /**< デストラクタ */
+
+#define ChrDrv_Lock(self) SysMtx_Lock((self)->hMtx) /**< 書込み可能になった可能性があることを通知 */
+#define ChrDrv_Unlock(self) SysMtx_Unlock((self)->hMtx) /**< 書込み可能になった可能性があるまで待つ */
+
+void ChrDrv_SetWriteSignal(C_CHRDRV *self); /**< 書込み可能になった可能性があることを通知 */
+#define ChrDrv_WaitWriteSignal(self) SysEvt_Wait((self)->hEvtWrite) /**< 書込み可能になった可能性があるまで待つ */
+#define ChrDrv_RefWriteSignal(self) SysEvt_Ref((self)->hEvtWrite) /**< 書込み可能状況参照 */
-void ChrDrv_WriteSignal(C_CHRDRV *self); /**< 書込み可能になったことを通知 */
-void ChrDrv_ReadSignal(C_CHRDRV *self); /**< 読込み可能になったことを通知 */
+void ChrDrv_SetReadSignal(C_CHRDRV *self); /**< 読込み可能になったことを通知 */
+#define ChrDrv_WaitReadSignal(self) SysEvt_Wait((self)->hEvtRead) /**< 読込み可能になった可能性があるまで待つ */
+#define ChrDrv_RefReadSignal(self) SysEvt_Ref((self)->hEvtRead) /**< 読込み可能状況参照 */
#ifdef __cplusplus
}
/**
* Hyper Operating System Application Framework
*
- * @file chrfile.h
- * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
- *
- * %jp{ファイルディスクリプタとして機能するクラス}
+ * @file chrdrv.h
+ * @brief %jp{キャラクタ型デバイスドライバ用基本クラス}
*
* Copyright (C) 2006-2007 by Project HOS
* http://sourceforge.jp/projects/hos/
#include "chrdrv.h"
-void ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods)
+FILE_ERR ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods)
{
+ self->hMtx = SysMtx_Create(); /* 排他制御ミューテックス */
+ self->hEvtWrite = SysEvt_Create(); /* 書込みイベント */
+ self->hEvtRead = SysEvt_Create(); /* 読込みイベント */
+
+ self->pFileHead = NULL; /**< 状態監視オブジェクトの連結ポインタ */
+
/* 親クラスコンストラクタ呼び出し */
DrvObj_Create(&self->DrvObj, pMethods);
+
+ return FILE_ERR_OK;
}
void ChrDrv_Delete(C_CHRDRV *self)
{
+ SysMtx_Delete(self->hMtx); /* 排他制御ミューテックス */
+ SysEvt_Delete(self->hEvtWrite); /* 書込みイベント */
+ SysEvt_Delete(self->hEvtRead); /* 読込みイベント */
+
/* 親クラスデストラクタ呼び出し */
DrvObj_Delete(&self->DrvObj);
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file chrfile.h
+ * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
+ *
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "chrdrv.h"
+
+
+/* I/O制御 */
+FILE_ERR ChrDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+ C_CHRDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_CHRDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ switch ( iFunc )
+ {
+ case FILE_IOCTL_SETWRITEMODE: /* 書込みモードを設定 */
+ pFile->cWriteMode = (char)(*(int *)pOutBuf);
+ return FILE_ERR_OK;
+
+ case FILE_IOCTL_SETREADEMODE: /* 読込みモードを設定 */
+ pFile->cReadMode = (char)(*(int *)pOutBuf);
+ return FILE_ERR_OK;
+
+ case FILE_IOCTL_SETWRITEVENT: /* 書込みイベントを設定 */
+ pFile->hEventWrite = (*(HANDLE *)pOutBuf);
+ return FILE_ERR_OK;
+
+ case FILE_IOCTL_SETREADEVENT: /* 読込みイベントを設定 */
+ pFile->hEventRead = (*(HANDLE *)pOutBuf);
+ return FILE_ERR_OK;
+
+ }
+
+ return FILE_ERR_NG;
+}
+
+
+/* end of file */
#ifndef __HOS__chrdrv_local_h__
-#define __HOS__drvobj_local_h__
+#define __HOS__chrdrv_local_h__
#include "system/file/chrdrv.h"
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file chrfile.h
+ * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
+ *
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "chrdrv.h"
+
+
+/** 読込み可能になったことを通知 */
+void ChrDrv_SetReadSignal(C_CHRDRV *self)
+{
+ C_CHRFILE *pFile;
+
+ SysEvt_Set(self->hEvtRead);
+
+ pFile = self->pFileHead;
+ if ( pFile != NULL )
+ {
+ do
+ {
+ /* イベントハンドルが登録されていたらセット */
+ if ( pFile->hEventRead != HANDLE_NULL )
+ {
+ Event_Set(pFile->hEventRead);
+ }
+
+ /* 次に進む */
+ pFile = pFile->pNext;
+ } while ( pFile != self->pFileHead);
+ }
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file chrfile.h
+ * @brief %jp{キャラクタ型デバイスドライバ用ファイルディスクリプタ}
+ *
+ * %jp{ファイルディスクリプタとして機能するクラス}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#include "chrdrv.h"
+
+
+/** 読込み可能になったことを通知 */
+void ChrDrv_SetWriteSignal(C_CHRDRV *self)
+{
+ C_CHRFILE *pFile;
+
+ SysEvt_Set(self->hEvtWrite);
+
+ pFile = self->pFileHead;
+ if ( pFile != NULL )
+ {
+ do
+ {
+ /* イベントハンドルが登録されていたらセット */
+ if ( pFile->hEventWrite != HANDLE_NULL )
+ {
+ Event_Set(pFile->hEventWrite);
+ }
+
+ /* 次に進む */
+ pFile = pFile->pNext;
+ } while ( pFile != self->pFileHead);
+ }
+}
+
+
+/* end of file */
{
C_FILEOBJ FileObj; /* ファイルオブジェクトを継承 */
- struct c_chrfile *pMonNext; /* イベント監視リスト連結用 */
- struct c_chrfile *pMonPrev; /* イベント監視リスト連結用 */
+ struct c_chrfile *pNext; /* イベント監視リスト連結用 */
+ struct c_chrfile *pPrev; /* イベント監視リスト連結用 */
- HANDLE hEvntWrite; /* 書込みイベント */
- HANDLE hEvntRead; /* 読込みイベント */
+ HANDLE hEventWrite; /* 書込みイベント */
+ HANDLE hEventRead; /* 読込みイベント */
char cWriteMode; /* 書込みモード */
char cReadMode; /* 読込みモード */
} C_CHRFILE;
FileObj_Create(&self->FileObj, pDrvObj, pMethods);
/* メンバ初期化 */
- self->pMonNext = NULL;
- self->pMonPrev = NULL;
- self->hEvntWrite = HANDLE_NULL;
- self->hEvntRead = HANDLE_NULL;
- self->cWriteMode = FILE_WMODE_BLOCKING;
- self->cReadMode = FILE_RMODE_BLOCKING;
+ self->pNext = NULL;
+ self->pPrev = NULL;
+ self->hEventWrite = HANDLE_NULL;
+ self->hEventRead = HANDLE_NULL;
+ self->cWriteMode = FILE_WMODE_BLOCKING;
+ self->cReadMode = FILE_RMODE_BLOCKING;
}
#define FILE_IOCTL_CANWRITEBUF 0x0032 /* ライトバッファ破棄(省コピー版Write) */
+/* IoControl機能コード(キャラクタ系デバイスドライバ共通) */
+#define FILE_IOCTL_SETWRITEMODE 0x0081 /* 書込みモードを設定 */
+#define FILE_IOCTL_SETREADEMODE 0x0082 /* 読込みモードを設定 */
+#define FILE_IOCTL_SETWRITEVENT 0x0084 /* 書込みイベントを設定 */
+#define FILE_IOCTL_SETREADEVENT 0x0085 /* 読込みイベントを設定 */
+
+
/* IoControl機能コード(ディレクトリ) */
#define FILE_IOCTL_DIR_READ 0x0101 /* デバイス情報を得る */
/**
* Hyper Operating System Application Framework
*
- * @file handle.h
+ * @file handleobj.h
* @brief %jp{ハンドルオブジェクト}
*
* Copyright (C) 2006 by Project HOS
*/
-#ifndef __HOS__hdlobj_h__
-#define __HOS__hdlobj_h__
+#ifndef __HOS__handleobj_h__
+#define __HOS__handleobj_h__
#include "system/handle/handle.h"
#endif
-#endif /* __HOS__hdlobj_h__ */
+#endif /* __HOS__handleobj_h__ */
/* end of file */
#define MUTEX_ERR_NG (-1)
/* エラー型 */
-typedef int MUTEXERR;
+typedef int MUTEX_ERR;
#ifdef __cplusplus
extern "C" {
#endif
-HANDLE Mutex_Create(void);
-MUTEXERR Mutex_Delete(HANDLE hMutex);
-MUTEXERR Mutex_Lock(HANDLE hMutex);
-MUTEXERR Mutex_Unlock(HANDLE hMutex);
+HANDLE Mutex_Create(void);
+MUTEX_ERR Mutex_Delete(HANDLE hMutex);
+MUTEX_ERR Mutex_Lock(HANDLE hMutex);
+MUTEX_ERR Mutex_Unlock(HANDLE hMutex);
#ifdef __cplusplus
void System_Initialize(void *pMem, MEMSIZE Size);
void System_Boot(HANDLE hTerminal, HANDLE hConsole, const char *pszCommand, int iStackSize);
+int System_RequestProc(void (*pfncProc)(VPARAM Param), VPARAM Param);
#ifdef __cplusplus
}
#include "hosaplfw.h"
-#include "system/system/system.h"
#include "system/sysapi/sysapi.h"
+#include "system/system/system_local.h"
#include "system/process/process.h"
#include "system/file/stdfile.h"
{
T_PROCESS_INF ProcInf;
+ /* システムプロセスのブート */
ProcInf.hTerminal = hTerminal;
ProcInf.hConsole = hConsole;
ProcInf.hStdIn = hConsole;
*/
-#include "system/system/system.h"
#include "system/sysapi/sysapi.h"
+#include "system/system/system_local.h"
#include "system/file/file.h"
#include "system/command/command.h"
+/* システムクラス */
+C_SYSTEM g_System;
+
+
/* システムの初期化 */
void System_Initialize(void *pMem, MEMSIZE Size)
{
+ C_SYSTEM *self;
+
+ self = &g_System;
+
/* システムAPIの初期化 */
SysApi_Initialize(pMem, Size);
+ /* システムクラスの初期化 */
+ g_System.hEvtProc = SysEvt_Create();
+ g_System.iProcHead = 0;
+ g_System.iProcTail = 0;
+
+ /* システムプロセスの開始 */
+ self->hPrcProc = SysPrc_Create(System_Process, (VPARAM)self, 1024, 1);
+ SysPrc_Start(self->hPrcProc);
+
+
/* ファイルシステム初期化 */
File_Initialize();
/* コマンドシステム初期化 */
- Command_Initialize();
+ Command_Initialize();
}
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file system.h
+ * @brief %jp{システム用API定義}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+
+#ifndef __HOS__system_local_h__
+#define __HOS__system_local_h__
+
+
+#include "system.h"
+#include "system/sysapi/sysapi.h"
+
+
+
+#define SYSTEM_PROCQUE_SIZE 64 /* システムプロシージャ要求キューイング数 */
+
+
+/* システムプロシージャ情報 */
+typedef struct t_system_procinf
+{
+ void (*pfncProc)(VPARAM Param);
+ VPARAM Param;
+} T_SYSTEM_PROCINF;
+
+
+/* システムクラス */
+typedef struct c_system
+{
+ SYSPRC_HANDLE hPrcProc;
+ SYSEVT_HANDLE hEvtProc;
+ volatile int iProcHead;
+ volatile int iProcTail;
+ T_SYSTEM_PROCINF ProcQue[SYSTEM_PROCQUE_SIZE];
+} C_SYSTEM;
+
+
+extern C_SYSTEM g_System;
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void System_Process(VPARAM Param); /* システムプロセス */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__system_h__ */
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file system.h
+ * @brief %jp{システム用API定義}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "hosaplfw.h"
+#include "system/system/system_local.h"
+
+
+/* システムプロセス */
+void System_Process(VPARAM Param)
+{
+ C_SYSTEM *self;
+
+ self = &g_System;
+
+ for ( ; ; )
+ {
+ int iHead;
+
+ /* イベント待ち */
+ SysEvt_Wait(self->hEvtProc);
+ SysEvt_Clear(self->hEvtProc);
+
+ /* プロシージャ実行 */
+ for ( ; ; )
+ {
+ iHead = self->iProcHead;
+
+ if ( iHead == self->iProcTail )
+ {
+ break;
+ }
+
+ self->ProcQue[iHead].pfncProc(self->ProcQue[iHead].Param);
+
+ iHead++;
+ if ( iHead >= SYSTEM_PROCQUE_SIZE )
+ {
+ iHead = 0;
+ }
+ self->iProcHead = iHead;
+ }
+ }
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file system.h
+ * @brief %jp{システム用API定義}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "hosaplfw.h"
+#include "system/system/system_local.h"
+
+
+/* システムプロセス */
+int System_RequestProc(void (*pfncProc)(VPARAM Param), VPARAM Param)
+{
+ C_SYSTEM *self;
+ int iTail;
+ int iNextTail;
+
+ self = &g_System;
+
+ iTail = self->iProcTail;
+ iNextTail = iTail + 1;
+ if ( iNextTail >= SYSTEM_PROCQUE_SIZE )
+ {
+ iNextTail = 0;
+ }
+
+ /* バッファフルチェック */
+ if ( iNextTail == self->iProcHead )
+ {
+ return 1;
+ }
+
+ /* キューに格納 */
+ self->ProcQue[iTail].pfncProc = pfncProc;
+ self->ProcQue[iTail].Param = Param;
+
+ self->iProcTail= iNextTail;
+
+ /* イベント設定 */
+ SysEvt_Set(self->hEvtProc);
+
+ return 0;
+}
+
+
+
+/* end of file */