Lan9000Hal_Create(&self->Lan9000Hal, pRegAddr);
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtSend = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtx = SysMtx_Create();
+ self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割込み処理登録 */
self->iIntNum = iIntNum;
self->iOpenCount = 0;
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtSend = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtxSend = SysMtx_Create();
- self->hMtxRecv = SysMtx_Create();
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割込み処理登録 */
self->iIntNum = iIntNum;
Ne2000Hal_Create(&self->Ne2000Hal, pRegAddr);
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtSend = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtx = SysMtx_Create();
+ self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割り込み処理登録 */
SysIsr_Create(iIntNum, Ne2000Drv_Isr, (VPARAM)self);
self->iAttr = iAttr; /* 属性 */
/* ミューテックス生成 */
- self->hMtx = SysMtx_Create();
+ self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL);
}
StreamBuf_Create(&self->StmBufRecv, iBufSize, pMem);
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtSend = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtxSend = SysMtx_Create();
- self->hMtxRecv = SysMtx_Create();
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割込み処理登録 */
self->iIntNum = iIntNum;
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv.h
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__mx1uartdrv_h__
+#define __HOS__mx1uartdrv_h__
+
+
+#include "system/sysapi/sysapi.h"
+#include "system/file/chrdrv.h"
+#include "library/container/streambuf/streambuf.h"
+
+
+/* ARM製 Integrator UART用ドライバ制御部 */
+typedef struct c_mx1uartdrv
+{
+ C_CHRDRV ChrDrv; /* キャラクタ型デバイスドライバを継承 */
+
+ void *pRegBase; /* レジスタベースアドレス */
+ unsigned long ulBaseClock; /* ベースクロック */
+ int iIntNum; /* 割込み番号 */
+
+ int iOpenCount; /* オープンカウンタ */
+
+ SYSEVT_HANDLE hEvtSend; /* 送信イベント */
+ SYSEVT_HANDLE hEvtRecv; /* 受信イベント */
+
+ SYSMTX_HANDLE hMtxSend; /* 送信排他制御ミューテックス */
+ SYSMTX_HANDLE hMtxRecv; /* 受信排他制御ミューテックス */
+ C_STREAMBUF StmBufRecv; /* 受信バッファ */
+} C_MX1UARTDRV;
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void Mx1UartDrv_Create(C_MX1UARTDRV *self, void *pRegBase, int iIntNum, unsigned long ulBaseClock, int iBufSize); /**< コンストラクタ */
+void Mx1UartDrv_Delete(C_DRVOBJ *pDrvObj); /**< デストラクタ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__mx1uartdrv_h__ */
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_close.h
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/** クローズ */
+void Mx1UartDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ /* クローズ処理 */
+ if ( --self->iOpenCount == 0 )
+ {
+ SysInt_Disable(self->iIntNum);
+ StreamBuf_Clear(&self->StmBufRecv);
+ }
+
+ /* ディスクリプタ削除 */
+ ChrFile_Delete(pFile);
+ SysMem_Free(pFileObj);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_create.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/* 仮想関数テーブル */
+const T_DRVOBJ_METHODS Mx1UartDrv_Methods =
+ {
+ Mx1UartDrv_Delete,
+ Mx1UartDrv_Open,
+ Mx1UartDrv_Close,
+ Mx1UartDrv_IoControl,
+ Mx1UartDrv_Seek,
+ Mx1UartDrv_Read,
+ Mx1UartDrv_Write,
+ Mx1UartDrv_Flush,
+ };
+
+
+/** コンストラクタ */
+void Mx1UartDrv_Create(C_MX1UARTDRV *self, void *pRegBase, int iIntNum, unsigned long ulBaseClock, int iBufSize)
+{
+ void *pMem;
+
+ /* 親クラスコンストラクタ呼び出し */
+ ChrDrv_Create(&self->ChrDrv, &Mx1UartDrv_Methods);
+
+ /* メンバ変数初期化 */
+ self->pRegBase = pRegBase;
+ self->ulBaseClock = ulBaseClock;
+ self->iIntNum = iIntNum;
+ self->iOpenCount = 0;
+
+ /* バッファ確保 */
+ pMem = SysMem_Alloc(iBufSize);
+ StreamBuf_Create(&self->StmBufRecv, iBufSize, pMem);
+
+ /* イベント生成 */
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+
+ /* ミューテックス生成 */
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+
+ /* 割込み処理登録 */
+ self->iIntNum = iIntNum;
+ SysIsr_Create(iIntNum + 4, Mx1UartDrv_IsrTx, (VPARAM)self);
+ SysIsr_Create(iIntNum + 5, Mx1UartDrv_IsrRx, (VPARAM)self);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_delete.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/** デストラクタ */
+void Mx1UartDrv_Delete(C_DRVOBJ *pDrvObj)
+{
+ C_MX1UARTDRV *self;
+ void *pMem;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+
+ /* 同期オブジェクト削除 */
+ SysEvt_Delete(self->hEvtRecv);
+ SysEvt_Delete(self->hEvtSend);
+ SysMtx_Delete(self->hMtxRecv);
+ SysMtx_Delete(self->hMtxSend);
+
+ /* バッファ削除 */
+ pMem = StreamBuf_RefBufAddr(&self->StmBufRecv);
+ StreamBuf_Delete(&self->StmBuf);
+ SysMem_Free(pMem);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_flush.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+FILE_ERR Mx1UartDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ return FILE_ERR_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_iocontrol.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+FILE_ERR Mx1UartDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ return FILE_ERR_NG;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_isr.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "system/system/system.h"
+#include "mx1uartdrv_local.h"
+
+
+void Mx1UartDrv_IsrTx(VPARAM Param)
+{
+ C_MX1UARTDRV *self;
+ int c;
+
+ self = (C_MX1UARTDRV *)Param;
+}
+
+
+static void Mx1UartDrv_RecvProc(VPARAM Param);
+
+
+/* 受信割り込み */
+void Mx1UartDrv_IsrRx(VPARAM Param)
+{
+ C_MX1UARTDRV *self;
+ int c;
+
+ self = (C_MX1UARTDRV *)Param;
+
+ if ( MX1UART_REG_READ(self, MX1UART_USR2) & 0x0001 )
+ {
+ do
+ {
+ c = MX1UART_REG_READ(self, MX1UART_URXD(0));
+ StreamBuf_SendChar(&self->StmBufRecv, c);
+ } while ( MX1UART_REG_READ(self, MX1UART_USR2) & 0x0001 );
+
+ System_RequestProc(Mx1UartDrv_RecvProc, (VPARAM)self);
+/* SysEvt_Set(self->hEvtRecv);
+ ChrDrv_SetReadSignal(&self->ChrDrv); */
+ }
+}
+
+
+void Mx1UartDrv_RecvProc(VPARAM Param)
+{
+ C_MX1UARTDRV *self;
+
+ self = (C_MX1UARTDRV *)Param;
+
+ SysEvt_Set(self->hEvtRecv);
+ ChrDrv_SetReadSignal(&self->ChrDrv);
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_local.h
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ ローカルヘッダファイル}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#ifndef __HOS__mx1uartdrv_local_h__
+#define __HOS__mx1uartdrv_local_h__
+
+
+#include "mx1uartdrv.h"
+
+
+#define MX1UART_URXD(n) (0x00+4*(n))
+#define MX1UART_UTXD(n) (0x40+4*(n))
+#define MX1UART_UCR1 0x80
+#define MX1UART_UCR2 0x84
+#define MX1UART_UCR3 0x88
+#define MX1UART_UCR4 0x8c
+#define MX1UART_UFCR 0x90
+#define MX1UART_USR1 0x94
+#define MX1UART_USR2 0x98
+#define MX1UART_UESC 0x9c
+#define MX1UART_UTIM 0xa0
+#define MX1UART_UBIR 0xa4
+#define MX1UART_UBMR 0xa8
+#define MX1UART_UBRC 0xac
+#define MX1UART_BIPR1 0xb0
+#define MX1UART_BIPR2 0xb4
+#define MX1UART_BIPR3 0xb8
+#define MX1UART_BIPR4 0xbc
+#define MX1UART_BMPR1 0xc0
+#define MX1UART_BMPR2 0xc4
+#define MX1UART_BMPR3 0xc8
+#define MX1UART_BMPR4 0xcc
+#define MX1UART_UTS 0xd0
+
+
+#define MX1UART_REG_WRITE(self, offset, val) do { *(unsigned long *)((char *)(self)->pRegBase + (offset)) = (val); } while(0)
+#define MX1UART_REG_READ(self, offset) (*((unsigned long *)((char *)(self)->pRegBase + (offset))))
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+HANDLE Mx1UartDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode);
+void Mx1UartDrv_Close(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+FILE_ERR Mx1UartDrv_IoControl(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, int iFunc, void *pInBuf, FILE_SIZE InSize, const void *pOutBuf, FILE_SIZE OutSize);
+FILE_POS Mx1UartDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign);
+FILE_SIZE Mx1UartDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size);
+FILE_SIZE Mx1UartDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size);
+FILE_ERR Mx1UartDrv_Flush(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj);
+
+void Mx1UartDrv_IsrTx(VPARAM Param); /* 割込み処理 */
+void Mx1UartDrv_IsrRx(VPARAM Param); /* 割込み処理 */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __HOS__armuartdrv_h__ */
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_open.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/** オープン */
+HANDLE Mx1UartDrv_Open(C_DRVOBJ *pDrvObj, const char *pszPath, int iMode)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+
+ /* create file descriptor */
+ if ( (pFile = SysMem_Alloc(sizeof(*pFile))) == NULL )
+ {
+ return HANDLE_NULL;
+ }
+ ChrFile_Create(pFile, &self->ChrDrv, NULL);
+
+
+ /* オープン処理 */
+ if ( self->iOpenCount++ == 0 )
+ {
+ MX1UART_REG_WRITE(self, MX1UART_UFCR, 0x00004290);
+
+ MX1UART_REG_WRITE(self, MX1UART_UBIR, 1152-1);
+ MX1UART_REG_WRITE(self, MX1UART_UBMR, 10000-1);
+
+ MX1UART_REG_WRITE(self, MX1UART_UCR1, 0x00000205);
+ MX1UART_REG_WRITE(self, MX1UART_UCR2, 0x00005027);
+ MX1UART_REG_WRITE(self, MX1UART_UCR3, 0x00001800);
+ MX1UART_REG_WRITE(self, MX1UART_UCR4, 0x00004007);
+
+ /* 受信割り込み許可 */
+ SysInt_Enable(self->iIntNum + 5);
+ }
+
+ return (HANDLE)pFile;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_read.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/** %jp{受信} */
+FILE_SIZE Mx1UartDrv_Read(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, void *pBuf, FILE_SIZE Size)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+ unsigned char *pubBuf;
+ FILE_SIZE i;
+ int c;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ pubBuf = (unsigned char *)pBuf;
+
+ /* クリティカルセクションに入る */
+ SysMtx_Lock(self->hMtxRecv);
+
+ for ( i = 0; i < Size; i++ )
+ {
+ while ( (c = StreamBuf_RecvChar(&self->StmBufRecv)) < 0 )
+ {
+ if ( pFile->cReadMode == FILE_RMODE_BLOCKING )
+ {
+ /* ブロッキングなら受信イベントを待つ */
+ SysEvt_Wait(self->hEvtRecv);
+ SysEvt_Clear(self->hEvtRecv);
+ }
+ else
+ {
+ /* ノンブロッキングなら終了 */
+ goto loop_end;
+ }
+ }
+ *pubBuf++ = (unsigned char)c;
+ }
+loop_end:
+
+ /* クリティカルセクションを出る */
+ SysMtx_Unlock(self->hMtxRecv);
+
+ return i;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_seek.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+FILE_POS Mx1UartDrv_Seek(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, FILE_POS Offset, int iOrign)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ return FILE_ERR_NG;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System Application Framework
+ *
+ * @file mx1uartdrv_write.c
+ * @brief %jp{Freescale MX1 UART用デバイスドライバ}
+ *
+ * Copyright (C) 2006-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "mx1uartdrv_local.h"
+
+
+/** %jp{送信} */
+FILE_SIZE Mx1UartDrv_Write(C_DRVOBJ *pDrvObj, C_FILEOBJ *pFileObj, const void *pData, FILE_SIZE Size)
+{
+ C_MX1UARTDRV *self;
+ C_CHRFILE *pFile;
+ const unsigned char *pubBuf;
+ FILE_SIZE i;
+ int c;
+
+ /* upper cast */
+ self = (C_MX1UARTDRV *)pDrvObj;
+ pFile = (C_CHRFILE *)pFileObj;
+
+ pubBuf = (const unsigned char *)pData;
+
+ /* クリティカルセクションに入る */
+ SysMtx_Lock(self->hMtxSend);
+
+ for ( i = 0; i < Size; i++ )
+ {
+ c = *pubBuf++;
+ while ( !(MX1UART_REG_READ(self, MX1UART_USR2) & 0x0008) )
+ {
+ if ( pFile->cWriteMode == FILE_WMODE_BLOCKING )
+ {
+ /* ブロッキングなら送信割り込みを待つ */
+ /* ARMUART_REG_WRITE(self, ARMUART_UARTIMSC, 0x0070); */ /*送信/受信割り込み許可 */
+ /* SysEvt_Wait(self->hEvtSend);
+ SysEvt_Clear(self->hEvtSend); */
+ }
+ else
+ {
+ /* ノンブロッキングなら終了 */
+ goto loop_end;
+ }
+ }
+ MX1UART_REG_WRITE(self, MX1UART_UTXD(0), c);
+ }
+loop_end:
+
+ /* クリティカルセクションを出る */
+ SysMtx_Unlock(self->hMtxSend);
+
+ return i;
+}
+
+
+
+/* end of file */
StreamBuf_Create(&self->StmBufRecv, iBufSize, pMem);
/* ミューテックス生成 */
- self->hMtxSend = SysMtx_Create();
- self->hMtxRecv = SysMtx_Create();
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割込み処理登録 */
self->iIntNum = iIntNum;
StreamBuf_Create(&self->StmBufRecv, iBufSize, pMem);
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtSend = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtSend = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtxSend = SysMtx_Create();
- self->hMtxRecv = SysMtx_Create();
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 割り込み処理登録 */
SysIsr_Create(iIntNum + 0, SciDrv_IsrRecvErr, (VPARAM)self);
memcpy(self->ubGateWayIpAddr, pInf->ubGateWayIpAddr, 4);
/* イベント生成 */
- self->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtArp = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtArp = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* ミューテックス生成 */
- self->hMtxSend = SysMtx_Create();
- self->hMtxRecv = SysMtx_Create();
- self->hMtxArp = SysMtx_Create();
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxRecv = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxArp = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 受信プロセス生成 */
self->hPrcRecv = SysPrc_Create(IpEther_Recv, (VPARAM)self, 1024, 2);
self->iOpenCount = 0;
/* ミューテックス生成 */
- self->hMtxLock = SysMtx_Create();
- self->hMtxSend = SysMtx_Create();
+ self->hMtxLock = SysMtx_Create(SYSMTX_ATTR_NORMAL);
+ self->hMtxSend = SysMtx_Create(SYSMTX_ATTR_NORMAL);
/* 受信プロセス生成 */
self->hPrcRecv = SysPrc_Create(TcpIp_Recv, (VPARAM)self, 1024, 2);
}
ChrFile_Create(&pFile->ChrFile, &self->ChrDrv, NULL);
StreamBuf_Create(&pFile->RecvBuf, TCPIPFILE_RECV_BUFSIZE, pFile->ubRecvBuf);
- pFile->hEvtRecv = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ pFile->hEvtRecv = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
/* デバイスオープン処理 */
if ( self->iOpenCount++ == 0 )
VolumeObj_Create(&self->VolumeObj, &FatVol_VolumeObjMethods);
/* ミューテックス生成 */
- self->hMtx = SysMtx_Create();
+ self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL);
return FATVOL_ERR_OK;
}
}
/* オブジェクト生成 */
- if ( (self->hSysEvt = SysEvt_Create(SYSEVT_MODE_NORMAL)) == SYSEVT_HANDLE_NULL )
+ if ( (self->hSysEvt = SysEvt_Create(SYSEVT_ATTR_NORMAL)) == SYSEVT_HANDLE_NULL )
{
SysMem_Free(self);
}
FILE_ERR ChrDrv_Create(C_CHRDRV *self, const T_DRVOBJ_METHODS *pMethods)
{
- self->hMtx = SysMtx_Create(); /**< 排他制御ミューテックス */
+ self->hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL); /**< 排他制御ミューテックス */
- self->hEvtRead = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
- self->hEvtWrite = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ self->hEvtRead = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
+ self->hEvtWrite = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
self->pFileHead = NULL; /**< 状態監視オブジェクトの連結ポインタ */
#define SYSISR_HANDLE_NULL (0)
typedef void* SYSISR_HANDLE;
-/* システム用イベントモード */
-#define SYSEVT_MODE_NORMAL 0x00
-#define SYSEVT_MODE_AUTOCLEAR 0x01
+/* システム用イベント属性 */
+#define SYSEVT_ATTR_NORMAL 0x00
+#define SYSEVT_ATTR_AUTOCLEAR 0x01
+
+/* システム用ミューテックス属性 */
+#define SYSMTX_ATTR_NORMAL 0x00
+
#ifdef __cplusplus
SYSPRC_HANDLE SysPrc_GetCurrentHandle(void);
/* システム用ミューテックス制御API */
-SYSMTX_HANDLE SysMtx_Create(void); /* システム用ミューテックス生成 */
+SYSMTX_HANDLE SysMtx_Create(int iAttr); /* システム用ミューテックス生成 */
void SysMtx_Delete(SYSMTX_HANDLE hMtx); /* システム用ミューテックス削除 */
void SysMtx_Lock(SYSMTX_HANDLE hMtx); /* システム用ミューテックスロック*/
void SysMtx_Unlock(SYSMTX_HANDLE hMtx); /* システム用ミューテックスロック解除*/
/* システム用イベント制御API */
-SYSEVT_HANDLE SysEvt_Create(int iMode); /* システム用イベント生成 */
+SYSEVT_HANDLE SysEvt_Create(int iAttr); /* システム用イベント生成 */
void SysEvt_Delete(SYSEVT_HANDLE hEvt); /* システム用イベント削除 */
void SysEvt_Wait(SYSEVT_HANDLE hEvt); /* システム用イベント待ち*/
void SysEvt_Set(SYSEVT_HANDLE hEvt); /* システム用イベントセット */
void SysApi_Initialize(void *pMem, MEMSIZE Size)
{
/* メモリ管理の初期化 */
- SysMem_hMtx = SysMtx_Create(); /* メモリ管理用排他制御用ミューテックス生成 */
- MemPol_Create(&SysMem_MemPol, pMem, Size); /* メモリプール生成 */
+ SysMem_hMtx = SysMtx_Create(SYSMTX_ATTR_NORMAL); /* メモリ管理用排他制御用ミューテックス生成 */
+ MemPol_Create(&SysMem_MemPol, pMem, Size); /* メモリプール生成 */
}
/* システム用イベント生成 */
-SYSEVT_HANDLE SysEvt_Create(int iMode)
+SYSEVT_HANDLE SysEvt_Create(int iAttr)
{
T_CFLG cflg;
ER_ID erid;
/* ロック用セマフォ生成 */
- cflg.flgatr = TA_TFIFO | ((iMode & SYSEVT_MODE_AUTOCLEAR) ? TA_CLR : 0);
+ cflg.flgatr = TA_TFIFO | ((iAttr & SYSEVT_ATTR_AUTOCLEAR) ? TA_CLR : 0);
cflg.iflgptn = 0;
erid = acre_flg(&cflg);
if ( erid < 0 )
/* システム用ミューテックス生成 */
-SYSMTX_HANDLE SysMtx_Create(void)
+SYSMTX_HANDLE SysMtx_Create(int iAttr)
{
T_CSEM csem;
ER_ID erid;
SysApi_Initialize(pMem, Size);
/* システムクラスの初期化 */
- g_System.hEvtProc = SysEvt_Create(SYSEVT_MODE_AUTOCLEAR);
+ g_System.hEvtProc = SysEvt_Create(SYSEVT_ATTR_AUTOCLEAR);
g_System.iProcHead = 0;
g_System.iProcTail = 0;
--- /dev/null
+# ----------------------------------------------------------------------------
+# Hyper Operating System V4 Advance
+# makefile for Freescale MX1 family
+#
+# Copyright (C) 1998-2007 by Project HOS
+# http://sourceforge.jp/projects/hos/
+# ----------------------------------------------------------------------------
+
+
+# ターゲット名
+TARGET ?= libhosv4a
+
+
+# ディレクトリ定義
+HOSV4A_DIR = ../../../../..
+KERNEL_DIR = $(HOSV4A_DIR)/kernel
+KERNEL_MAKINC_DIR = $(KERNEL_DIR)/build/common/gmake
+OBJS_DIR = objs_$(TARGET)
+
+
+# %jp{共通定義読込み}
+include $(KERNEL_MAKINC_DIR)/common.inc
+
+
+# %jp{アーキテクチャ定義}
+ARCH_PROC ?= arm/arm_v4t
+ARCH_IRC ?= arm/mx1
+ARCH_CC ?= armcc
+
+# %jp{アーキテクチャパス}
+INC_PROC_DIR = $(KERNEL_DIR)/include/arch/proc/$(ARCH_PROC)
+INC_IRC_DIR = $(KERNEL_DIR)/include/arch/irc/$(ARCH_IRC)
+SRC_PROC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)
+SRC_PROC_CC_DIR = $(KERNEL_DIR)/source/arch/proc/$(ARCH_PROC)/$(ARCH_CC)
+SRC_IRC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)
+SRC_IRC_CC_DIR = $(KERNEL_DIR)/source/arch/irc/$(ARCH_IRC)/$(ARCH_CC)
+
+# %jp{パス設定}
+INC_DIRS += $(INC_PROC_DIR) $(INC_IRC_DIR)
+SRC_DIRS += $(SRC_PROC_DIR) $(SRC_PROC_DIR) $(SRC_PROC_CC_DIR) $(SRC_IRC_DIR) $(SRC_IRC_CC_DIR)
+
+# %jp{オプションフラグ}
+AFLAGS += --cpu=ARM920T --apcs=inter --thumb
+CFLAGS += --cpu=ARM920T --apcs=inter --thumb
+ARFLAGS +=
+
+# %jp{コンフィギュレータ定義}
+CFGRTR_DIR = $(HOSV4A_DIR)/cfgrtr/build/gcc
+CFGRTR = h4acfg-mx1
+
+
+# %jp{コンパイラ依存の設定読込み}
+include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_d.inc
+
+
+
+# C言語ファイルの追加
+CSRCS += $(SRC_PROC_DIR)/val_int.c \
+ $(SRC_IRC_DIR)/kini_irc.c \
+ $(SRC_IRC_DIR)/kexe_irc.c \
+ $(SRC_IRC_DIR)/ena_int.c \
+ $(SRC_IRC_DIR)/dis_int.c \
+ $(SRC_IRC_DIR)/vclr_int.c
+
+
+# アセンブラファイルの追加
+ASRCS += $(SRC_PROC_CC_DIR)/kcre_ctx.s \
+ $(SRC_PROC_CC_DIR)/kdis_int.s \
+ $(SRC_PROC_CC_DIR)/kena_int.s \
+ $(SRC_PROC_CC_DIR)/kirq_hdr.s \
+ $(SRC_PROC_CC_DIR)/kfiq_hdr.s \
+ $(SRC_PROC_CC_DIR)/krst_ctx.s \
+ $(SRC_PROC_CC_DIR)/kswi_ctx.s \
+ $(SRC_PROC_CC_DIR)/kwai_int.s
+
+
+
+# カーネル共通ソースの追加
+include $(KERNEL_MAKINC_DIR)/knlsrc.inc
+
+
+
+# %jp{ALL}
+.PHONY : all
+all: makelib_all
+ make -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC)
+
+# %jp{クリーン}
+.PHONY : clean
+clean: makelib_clean
+ make -C $(CFGRTR_DIR) -f gmake.mak TARGET=$(CFGRTR) ARCH_PROC=$(ARCH_PROC) ARCH_IRC=$(ARCH_IRC) clean
+ $(RM) -f *.lst
+
+
+# %jp{ライブラリ生成用設定読込み}
+include $(KERNEL_MAKINC_DIR)/makelib.inc
+
+# %jp{コンパイラ依存ルール定義読込み}
+include $(KERNEL_MAKINC_DIR)/$(ARCH_CC)_r.inc
+
+# %jp{カーネル依存関係読込み}
+include $(KERNEL_MAKINC_DIR)/knldep.inc
+
+
+# end of file
/* ---------------------------------------------- */
/** %jp{レディーキューのアルゴリズム} */
-#define _KERNEL_CFG_RDQ_ALGORITHM _KERNEL_RDQ_ALG_SINGLE_QUE
+#define _KERNEL_CFG_RDQ_ALGORITHM _KERNEL_RDQ_ALG_ARRAYED_QUE
/* %jp{
_KERNEL_RDQ_ALG_SINGLE_QUE : シングルキュー(省メモリだが、タスク数が増えると遅い)
/* ---------------------------------- */
+/* Mutex-ID */
+/* ---------------------------------- */
+
+/* %jp{サイズに適した型とする} */
+#if (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_B) && _KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_B _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_UB) && !_KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_UB _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_H) && _KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_H _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_UH) && !_KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_UH _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_W) && _KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_W _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_UW) && !_KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_UW _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#elif (_KERNEL_TMAX_MTXID <= _KERNEL_TMAX_D) && _KERNEL_OPT_SIGNED_INT
+typedef _KERNEL_T_FAST_D _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#else
+typedef _KERNEL_T_FAST_UD _KERNEL_T_MTXID; /**< %jp{ミューテックスIDの型}%en{type of Mutex-ID} */
+#endif
+
+
+
+/* ---------------------------------- */
/* Mailbox-ID */
/* ---------------------------------- */
#define __HOS_V4a__knl_rdq_h__
-/* ------------------------------------------ */
-/* constant value definition */
-/* ------------------------------------------ */
-
-#define _KERNEL_RDQ_ALG_SINGLE_QUE 1
-#define _KERNEL_RDQ_ALG_ARRAYED_QUE 2
-#define _KERNEL_RDQ_ALG_BITMAP_ARRAYED_QUE 3
-
-
-
-#if _KERNEL_CFG_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_SINGLE_QUE
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_SINGLE_QUE
/* ------------------------------------------ */
/* single queue */
/** %en{ready-queue control block}%jp{レディーキュー管理ブロック} */
typedef struct _kernel_t_rdqcb
{
- _KERNEL_T_QUE que;
+ _KERNEL_T_QUE que;
} _KERNEL_T_RDQCB;
-#define _KERNEL_CRE_RDQ(rdqcb) _KERNEL_CRE_QUE(&(rdqcb)->que) /**< %en{create ready-queue}%jp{レディーキューの生成} */
-#define _KERNEL_DEL_RDQ(rdqcb) _KERNEL_DEL_QUE(&(rdqcb)->que) /**< %en{delete ready-queue}%jp{レディーキューの削除} */
-
-#define _KERNEL_ADD_RDQ(rdqcb, tskhdl) _KERNEL_ADP_QUE(&(rdqcb)->que, (tskhdl)) /**< %jp{タスクをレディーキューに追加} */
-#define _KERNEL_RMV_RDQ(rdqcb, tskhdl) _KERNEL_RMV_QUE(&(rdqcb)->que, (tskhdl)) /**< %jp{タスクをレディーから取り外し} */
-
-#define _KERNEL_RMH_RDQ(rdqcb) _KERNEL_RMH_QUE(&(rdqcb)->que) /**< %jp{キューの先頭タスクの取り外し} */
-#define _KERNEL_REF_RDQ(rdqcb) _KERNEL_REF_QUE(&(rdqcb)->que) /**< %jp{キューの先頭タスクの参照} */
-
-#define _KERNEL_ROT_RDQ(rdqcb, tskpri) _KERNEL_RTP_QUE(&(rdqcb)->que, (tskpri)) /**< %jp{レディーキューの回転} */
-
-#if 0
-#define _KERNEL_CRE_RDQ() _KERNEL_CRE_QUE(&_KERNEL_SYS_GET_RDQ()->que) /**< %en{create ready-queue}%jp{レディーキューの生成} */
-#define _KERNEL_DEL_RDQ() _KERNEL_DEL_QUE(&_KERNEL_SYS_GET_RDQ()->que) /**< %en{delete ready-queue}%jp{レディーキューの削除} */
+#define _KERNEL_CRE_RDQ(rdqcb) _KERNEL_CRE_QUE(&(rdqcb)->que) /**< %en{create ready-queue}%jp{レディーキューの生成} */
+#define _KERNEL_DEL_RDQ(rdqcb) _KERNEL_DEL_QUE(&(rdqcb)->que) /**< %en{delete ready-queue}%jp{レディーキューの削除} */
-#define _KERNEL_ADD_RDQ(tskhdl) _KERNEL_ADP_QUE(&_KERNEL_SYS_GET_RDQ()->que, (tskhdl)) /**< %jp{タスクをレディーキューに追加} */
-#define _KERNEL_RMV_RDQ(tskhdl) _KERNEL_RMV_QUE(&_KERNEL_SYS_GET_RDQ()->que, (tskhdl)) /**< %jp{タスクをレディーから取り外し} */
+#define _KERNEL_ADD_RDQ(rdqcb, tskhdl) _KERNEL_ADP_QUE(&(rdqcb)->que, (tskhdl)) /**< %jp{タスクをレディーキューに追加} */
+#define _KERNEL_RMV_RDQ(rdqcb, tskhdl) _KERNEL_RMV_QUE(&(rdqcb)->que, (tskhdl)) /**< %jp{タスクをレディーから取り外し} */
-#define _KERNEL_RMH_RDQ() _KERNEL_RMH_QUE(&_KERNEL_SYS_GET_RDQ()->que) /**< %jp{キューの先頭タスクの取り外し} */
-#define _KERNEL_REF_RDQ() _KERNEL_REF_QUE(&_KERNEL_SYS_GET_RDQ()->que) /**< %jp{キューの先頭タスクの参照} */
+#define _KERNEL_RMH_RDQ(rdqcb) _KERNEL_RMH_QUE(&(rdqcb)->que) /**< %jp{キューの先頭タスクの取り外し} */
+#define _KERNEL_REF_RDQ(rdqcb) _KERNEL_REF_QUE(&(rdqcb)->que) /**< %jp{キューの先頭タスクの参照} */
-#define _KERNEL_ROT_RDQ(tskpri) _KERNEL_RTP_QUE(&_KERNEL_SYS_GET_RDQ()->que, (tskpri)) /**< %jp{レディーキューの回転} */
-#endif
+#define _KERNEL_ROT_RDQ(rdqcb, tskpri) _KERNEL_RTP_QUE(&(rdqcb)->que, (tskpri)) /**< %jp{レディーキューの回転} */
-#elif _KERNEL_CFG_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+#elif _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
/* ------------------------------------------ */
/* arrayed que */
/* ------------------------------------------ */
/** %en{ready-queue control block}%jp{レディーキュー管理ブロック} */
-typedef struct _kernel_t_rdq
+typedef struct _kernel_t_rdqcb
{
- T__KERNEL_QUE que[_KERNEL_TMAX_TSKPRI];
-} _KERNEL_T_RDQ;
+ _KERNEL_T_QUE que[_KERNEL_TSK_TMAX_TPRI];
+} _KERNEL_T_RDQCB;
+
+
+#define _KERNEL_CRE_RDQ(rdqcb) _kernel_cre_rdq((rdqcb)) /**< %jp{レディーキューの生成}%en{create ready-queue} */
+#define _KERNEL_DEL_RDQ(rdqcb) _kernel_del_rdq((rdqcb)) /**< %jp{レディーキューの削除}%en{delete ready-queue} */
+#define _KERNEL_ADD_RDQ(rdqcb, tskhdl) _kernel_add_rdq((rdqcb), (tskhdl)) /**< %jp{タスクをレディーキューに追加} */
+#define _KERNEL_RMV_RDQ(rdqcb, tskhdl) _kernel_rmv_rdq((rdqcb), (tskhdl)) /**< %jp{タスクをレディーから取り外し} */
-#define _kernel_cre_rdq() _kernel_cre_que(&_KERNEL_SYS_GET_RDQ()->que) /**< %en{create ready-queue}%jp{レディーキューの生成} */
-#define _kernel_del_rdq() _kernel_del_que(&_KERNEL_SYS_GET_RDQ()->que) /**< %en{delete ready-queue}%jp{レディーキューの削除} */
+#define _KERNEL_RMH_RDQ(rdqcb) _kernel_rmh_rdq((rdqcb)) /**< %jp{キューの先頭タスクの取り外し} */
+#define _KERNEL_REF_RDQ(rdqcb) _kernel_ref_rdq((rdqcb)) /**< %jp{キューの先頭タスクの参照} */
+
+#define _KERNEL_ROT_RDQ(rdqcb, tskpri) _kernel_rot_rdq((rdqcb), (tskpri)) /**< %jp{レディーキューの回転} */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
-#define _kernel_add_rdq(tskhdl) _kernel_adp_que(&_KERNEL_SYS_GET_RDQ()->que[_KERNEL_TSK_GET_TSKPRI(tskhdl) - 1], tskhdl) /**< %jp{タスクをキューに追加} */
-#define _kernel_rmv_rdq(tskhdl) _kernel_rmv_que(&_KERNEL_SYS_GET_RDQ()->que[_KERNEL_TSK_GET_TSKPRI(tskhdl) - 1], tskhdl) /**< */
+void _kernel_cre_rdq(_KERNEL_T_RDQCB *rdqcb); /**< %jp{レディーキューの生成}%en{create ready-queue} */
+void _kernel_del_rdq(_KERNEL_T_RDQCB *rdqcb); /**< %jp{レディーキューの削除}%en{delete ready-queue} */
-#define _kernel_rmh_rdq() _kernel_rmh_que(&_KERNEL_SYS_GET_RDQ()->que)
-#define _kernel_ref_rdq() _kernel_ref_que(&_KERNEL_SYS_GET_RDQ()->que) /**< %jp{キューの先頭タスクの参照(マクロ関数)} */
+void _kernel_add_rdq(_KERNEL_T_RDQCB *rdqcb, _KERNEL_T_TSKHDL tskhdl); /**< %jp{タスクをレディーキューに追加} */
+void _kernel_rmv_rdq(_KERNEL_T_RDQCB *rdqcb, _KERNEL_T_TSKHDL tskhdl); /**< %jp{タスクをレディーキューから取り外し} */
-void _kernel_rot_rdq(PRI tskpri); /**< %jp{レディーキューの回転} */
+_KERNEL_T_TSKHDL _kernel_rmh_rdq(_KERNEL_T_RDQCB *rdqcb); /**< %jp{レディーキューの先頭タスクの取り外し} */
+_KERNEL_T_TSKHDL _kernel_ref_rdq(_KERNEL_T_RDQCB *rdqcb); /**< %jp{レディーキューの先頭タスクの参照} */
+void _kernel_rot_rdq(_KERNEL_T_RDQCB *rdqcb, PRI tskpri); /**< %jp{レディーキューの回転} */
#ifdef __cplusplus
}
#else /* error */
-#error Illegal value : _KERNEL_CFG_QUE_ALGORITHM
+#error Illegal value : _KERNEL_QUE_ALGORITHM
#endif
-
/* ------------------------------------------------------------------ */
/* service call support */
/* ------------------------------------------------------------------ */
/* ------------------------------------------------------------------ */
+/* Ready queue */
+/* ------------------------------------------------------------------ */
+
+#define _KERNEL_RDQ_ALG_SINGLE_QUE 1
+#define _KERNEL_RDQ_ALG_ARRAYED_QUE 2
+#define _KERNEL_RDQ_ALG_BITMAP_ARRAYED_QUE 3
+
+#define _KERNEL_RDQ_ALGORITHM _KERNEL_CFG_RDQ_ALGORITHM
+
+
+/* ------------------------------------------------------------------ */
/* Timeout queue */
/* ------------------------------------------------------------------ */
/* ---------------------------------- */
#define _KERNEL_TSKHDL_ID _KERNEL_CFG_TSKHDL_ID
+#define _KERNEL_MTXHDL_ID _KERNEL_CFG_MTXHDL_ID
#define _KERNEL_ISRHDL_ID _KERNEL_CFG_ISRHDL_ID
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file dis_int.c
+ * @brief %jp{Freescale MX1用}%en{Freescale MX1}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+#include "object/isrobj.h"
+
+
+/* 割り込みの禁止 */
+ER dis_int(INTNO intno)
+{
+ if ( intno < _KERNEL_IRCATR_TMIN_INTNO || intno > _KERNEL_IRCATR_TMAX_INTNO )
+ {
+ return E_PAR;
+ }
+
+ *_KERNEL_IRC_INTDISNUM = intno;
+
+ return E_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file ena_int.c
+ * @brief %jp{Freescale MX1用}%en{Freescale MX1}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+#include "object/isrobj.h"
+
+
+/* 割り込みの許可 */
+ER ena_int(INTNO intno)
+{
+ if ( intno < _KERNEL_IRCATR_TMIN_INTNO || intno > _KERNEL_IRCATR_TMAX_INTNO )
+ {
+ return E_PAR;
+ }
+
+ *_KERNEL_IRC_INTENNUM = intno;
+
+ return E_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file kexe_irc.c
+ * @brief %jp{Freescale MX1用}%en{Freescale MX1}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+#include "object/isrobj.h"
+
+
+/** %jp{割込みコントローラの割込み処理} */
+void _kernel_exe_irc(INHNO inhno)
+{
+ INTNO intno;
+
+ switch ( inhno )
+ {
+ case _KERNEL_ARM_INHNO_IRQ:
+ intno = (*_KERNEL_IRC_NIVECSR >> 16);
+ break;
+
+ case _KERNEL_ARM_INHNO_FIQ:
+ intno = *_KERNEL_IRC_NIVECSR;
+ break;
+
+ default:
+ return;
+ }
+
+ /* %jp{割込みサービスルーチン呼び出し} */
+ if ( intno >= _KERNEL_IRCATR_TMIN_INTNO && intno <= _KERNEL_IRCATR_TMAX_INTNO )
+ {
+ _kernel_exe_isr(intno);
+ }
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file ini_irc.c
+ * @brief %jp{Freescale MX1用}%en{Freescale MX1}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+#include "object/isrobj.h"
+
+
+/** %jp{割込みコントローラの初期化} */
+void _kernel_ini_irc(void)
+{
+ /* 割り込み禁止 */
+ *_KERNEL_IRC_INTENABLEH = 0x00000000;
+ *_KERNEL_IRC_INTENABLEL = 0x00000000;
+
+ *_KERNEL_IRC_NIMASK = 0x00000000;
+ *_KERNEL_IRC_INTCNTL = 0x00180000;
+
+ *_KERNEL_IRC_INTTYPEH = 0x00000000;
+ *_KERNEL_IRC_INTTYPEL = 0x00000000;
+
+ *_KERNEL_IRC_NIPRIORITY7 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY6 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY5 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY4 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY3 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY2 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY1 = 0xffffffff;
+ *_KERNEL_IRC_NIPRIORITY0 = 0xffffffff;
+
+ *_KERNEL_IRC_INTFRCH = 0x00000000;
+ *_KERNEL_IRC_INTFRCL = 0x00000000;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file ena_int.c
+ * @brief %jp{Freescale MX1用}%en{Freescale MX1}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+#include "object/inhobj.h"
+#include "object/isrobj.h"
+
+
+/* %jp{割り込みのクリア} */
+ER vclr_int(INTNO intno)
+{
+ return E_OK;
+}
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file add_rdq.c
+ * @brief %jp{タスクをレディーキューに追加}%en{Add the task to the ready-queue}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{タスクをレディーキューに追加}%en{Add the task to the ready-queue}
+ * @param rdqcb %jp{追加するレディーキュー}%en{pointer of ready-queue}
+ * @param tskhdl %jp{追加するタスクのハンドル}%en{handle of task}
+ * @return void
+ */
+void _kernel_add_rdq(_KERNEL_T_RDQCB *rdqcb, _KERNEL_T_TSKHDL tskhdl)
+{
+ _KERNEL_T_TCB_PTR tcb;
+ PRI tskpri;
+
+ /* %jp{TCB取得} */
+ tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
+
+ /* %jp{タスク優先度を取得} */
+ tskpri = _KERNEL_TSK_GET_TSKPRI(tcb);
+
+ /* %jp{キューに追加} */
+ _KERNEL_ADP_QUE(&rdqcb->que[tskpri-1], tskhdl);
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file cre_rdq.c
+ * @brief %jp{レディーキューの生成}%en{create ready-queue}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{レディーキューの生成}%en{create ready-queue}
+ * @param rdqcb %jp{生成するレディーキュー}%en{pointer of ready-queue}
+ * @return void
+ */
+void _kernel_cre_rdq(_KERNEL_T_RDQCB *rdqcb)
+{
+ PRI tskpri;
+
+ for ( tskpri = 0; tskpri < _KERNEL_TSK_TMAX_TPRI; tskpri++ )
+ {
+ _KERNEL_CRE_QUE(&rdqcb->que[tskpri]);
+ }
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file del_rdq.c
+ * @brief %jp{レディーキューの削除}%en{delete ready-queue}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{レディーキューの削除}%en{delete ready-queue}
+ * @param rdqcb %jp{削除するレディーキュー}%en{pointer of ready-queue}
+ * @return void
+ */
+void _kernel_del_rdq(_KERNEL_T_RDQCB *rdqcb)
+{
+ PRI tskpri;
+
+ for ( tskpri = 0; tskpri < _KERNEL_TSK_TMAX_TPRI; tskpri++ )
+ {
+ _KERNEL_DEL_QUE(&rdqcb->que[tskpri]);
+ }
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file ref_rdq.c
+ * @brief %jp{レディーキューの先頭タスクの参照}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{レディーキューの先頭タスクの参照}
+ * @param rdqcb %jp{取り外すレディーキュー}%en{pointer of ready-queue}
+ * @return void
+ */
+_KERNEL_T_TSKHDL _kernel_ref_rdq(_KERNEL_T_RDQCB *rdqcb)
+{
+ _KERNEL_T_TSKHDL tskhdl;
+ PRI tskpri;
+
+ for ( tskpri = 0; tskpri < _KERNEL_TSK_TMAX_TPRI; tskpri++ )
+ {
+ tskhdl = _KERNEL_REF_QUE(&rdqcb->que[tskpri]);
+ if ( tskhdl != _KERNEL_TSKHDL_NULL )
+ {
+ return tskhdl;
+ }
+ }
+
+ return _KERNEL_TSKHDL_NULL;
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file rmh_rdq.c
+ * @brief %jp{レディーキューの先頭タスクの取り外し}%en{Remove the task to the ready-queue}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{レディーキューの先頭タスクの取り外し}%en{Remove the task to the ready-queue}
+ * @param rdqcb %jp{取り外すレディーキュー}%en{pointer of ready-queue}
+ * @return void
+ */
+_KERNEL_T_TSKHDL _kernel_rmh_rdq(_KERNEL_T_RDQCB *rdqcb)
+{
+ _KERNEL_T_TSKHDL tskhdl;
+ PRI tskpri;
+
+ for ( tskpri = 0; tskpri < _KERNEL_TSK_TMAX_TPRI; tskpri++ )
+ {
+ tskhdl = _KERNEL_RMH_QUE(&rdqcb->que[tskpri]);
+ if ( tskhdl != _KERNEL_TSKHDL_NULL )
+ {
+ return tskhdl;
+ }
+ }
+
+ return _KERNEL_TSKHDL_NULL;
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */
--- /dev/null
+/**
+ * Hyper Operating System V4 Advance
+ *
+ * @file rmv_rdq.c
+ * @brief %jp{タスクをレディーキューから削除}%en{Remove the task to the ready-queue}
+ *
+ * Copyright (C) 1998-2007 by Project HOS
+ * http://sourceforge.jp/projects/hos/
+ */
+
+
+#include "core/core.h"
+
+
+#if _KERNEL_RDQ_ALGORITHM == _KERNEL_RDQ_ALG_ARRAYED_QUE
+
+/** %jp{タスクをレディーキューから削除}%en{Remove the task to the ready-queue}
+ * @param rdqcb %jp{取り外すレディーキュー}%en{pointer of ready-queue}
+ * @param tskhdl %jp{取り外すタスクのハンドル}%en{handle of task}
+ * @return void
+ */
+void _kernel_rmv_rdq(_KERNEL_T_RDQCB *rdqcb, _KERNEL_T_TSKHDL tskhdl)
+{
+ _KERNEL_T_TCB_PTR tcb;
+ PRI tskpri;
+
+ /* %jp{TCB取得} */
+ tcb = _KERNEL_TSK_TSKHDL2TCB(tskhdl);
+
+ /* %jp{タスク優先度を取得} */
+ tskpri = _KERNEL_TSK_GET_TSKPRI(tcb);
+
+ /* %jp{キューに追加} */
+ _KERNEL_RMV_QUE(&rdqcb->que[tskpri-1], tskhdl);
+}
+
+
+#endif /* _KERNEL_RDQ_ALGORITHM */
+
+
+
+/* end of file */