/*****************************************************************************
file name : kernel_cfg.h
  システム構築用定義

  Copyright(C) 2002 佐々木芳

Windowsのシミュレーション環境上で動作するアプリケーションプログラムのコンパイル時には以下のマクロ定義が必要
	_CMTOY
	_APP_EXPORT
*****************************************************************************/
/*
 *  TOPPERS/JSP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Just Standard Profile Kernel
 * 
 *  Copyright (C) 2000,2001 by Embedded and Real-Time Systems Laboratory
 *                              Toyohashi Univ. of Technology, JAPAN
 * 
 *  上記著作権者は，Free Software Foundation によって公表されている 
 *  GNU General Public License の Version 2 に記述されている条件か，以
 *  下の(1)〜(4)の条件を満たす場合に限り，本ソフトウェア（本ソフトウェ
 *  アを改変したものを含む．以下同じ）を使用・複製・改変・再配布（以下，
 *  利用と呼ぶ）することを無償で許諾する．
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
 *      権表示，この利用条件および下記の無保証規定が，そのままの形でソー
 *      スコード中に含まれていること．
 *  (2) 本ソフトウェアを再利用可能なバイナリコード（リロケータブルオブ
 *      ジェクトファイルやライブラリなど）の形で利用する場合には，利用
 *      に伴うドキュメント（利用者マニュアルなど）に，上記の著作権表示，
 *      この利用条件および下記の無保証規定を掲載すること．
 *  (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
 *      み込んだ形で利用する場合には，次のいずれかの条件を満たすこと．
 *    (a) 利用に伴うドキュメント（利用者マニュアルなど）に，上記の著作
 *        権表示，この利用条件および下記の無保証規定を掲載すること．
 *    (b) 利用の形態を，別に定める方法によって，上記著作権者に報告する
 *        こと．
 *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも，上記著作権者を免責すること．
 * 
 *  本ソフトウェアは，無保証で提供されているものである．上記著作権者は，
 *  本ソフトウェアに関して，その適用可能性も含めて，いかなる保証も行わ
 *  ない．また，本ソフトウェアの利用により直接的または間接的に生じたい
 *  かなる損害に関しても，その責任を負わない．
 * 
 */
#ifndef __KERNEL_CFG_H__
#define __KERNEL_CFG_H__



/*****************************************************************************/
/*静的生成オブジェクト定義*/
//使用できる属性
//・タスク属性			(TA_HLNG | TA_ACT)
//・セマフォ属性		TA_TFIFO
//・イベントフラグ属性	(TA_TFIFO | TA_WMUL [| TA_CLR])
//・メイルボックス属性	(TA_TFIFO | TA_MFIFO)
//・割込みハンドラ		TA_NULL
/*****************************************************************************/
#define ID_NULL			(ID)(-1)		//静的定義終了を示すID
#define INTNO_NULL		(INTNO)(-1)		//静的定義終了を示すINTNO

/*静的タスク生成定義*/
typedef struct tagTaskDefinition
{
	ID		tskid;
	T_CTSK	ctsk;
}TASK_DEF;

/*静的セマフォ生成定義*/
typedef struct tagSemaphoreDefinition
{
	ID		semid;
	T_CSEM	csem;
}SEMAPHORE_DEF;

/*静的イベントフラグ生成定義*/
typedef struct tagEventflagDefinition
{
	ID		flgid;
	T_CFLG	cflg;
}EVENTFLAG_DEF;

/*静的データキュー生成定義*/
typedef struct tagDataQueueDefinition
{
	ID		dtqid;
	T_CDTQ	cdtq;
}DATAQUEUE_DEF;

/*静的メイルボックス生成定義*/
typedef struct tagMailboxDefinition
{
	ID		mbxid;
	T_CMBX	cmbx;
}MAILBOX_DEF;

/*静的固定長メモリプール生成定義*/
typedef struct tagFixedMemoryPoolDefinition
{
	ID		mpfid;
	T_CMPF	cmpf;
}MPF_DEF;

/*静的周期ハンドラ生成定義*/
typedef struct tagCyclicHandlerDefinition
{
	ID		cycid;
	T_CCYC	ccyc;
}CYCHDR_DEF;

/*静的アラームハンドラ生成定義*/
typedef struct tagAlarmHandlerDefinition
{
	ID		almid;
	T_CALM	calm;
}ALMHDR_DEF;

/*静的割り込みハンドラ定義*/
typedef struct tagInterruptHandlerDefinition
{
	INHNO	inhno;
	T_DINH	dinh;
}INTHDR_DEF;

/*初期化ルーチン生成定義*/
typedef struct tagInitialRoutineDefinition
{
	ATR		iniatr;
	VP_INT	exinf;
	FP		inirtn;
}INIRTN_DEF;




#ifdef _CMTOY
/*Windowsシミュレーション環境*/
/*****************************************************************************
アプリケーションプログラムの情報をμITRONカーネルに公開する機能を定義
	関数名：AttachItronApplication

*****************************************************************************/
#define KERNEL_CFG_VER		(0x0104)	/*以下のITRON_CONFIG_TABLE構造体の識別に使う*/
#define FN_ATTACH_APPLICATION			AttachItronApplication				//関数名
#define NAME_FN_ATTACH_APPLICATION		"AttachItronApplication"	
/*コンフィグレーションテーブル情報*/
typedef struct tagKernelConfig
{
	int			MySize;
	int			KernelCfgVer;
	int			EntriesOfTaskDefinitionTable;
	TASK_DEF	*pTaskDefinitionTable;
	int			EntriesOfSemaphoreDefinitionTable;
	SEMAPHORE_DEF *pSemaphoreDefinitionTable;
	int			EntriesOfEventflagDefinitionTable;
	EVENTFLAG_DEF *pEventflagDefinitionTable;
	int			EntriesOfDataQueueDefinitionTable;
	DATAQUEUE_DEF *pDataQueueDefinitionTable;
	int			EntriesOfMailboxDefinitionTable;
	MAILBOX_DEF *pMailboxDefinitionTable;
	int			EntriesOfFixedMemoryPoolDefinitionTable;
	MPF_DEF		*pFixedMemoryPoolDefinitionTable;
	int			EntriesOfCyclicHnadlerDefinitionTable;
	CYCHDR_DEF	*pCyclicHnadlerDefinitionTable;
	int			EntriesOfAlarmHnadlerDefinitionTable;
	ALMHDR_DEF	*pAlarmHnadlerDefinitionTable;
	int			EntriesOfInterruptHandlerDefinitionTable;
	INTHDR_DEF	*pInterruptHandlerDefinitionTable;
	int			EntriesOfInitialRoutineDefinitionTable;
	INIRTN_DEF	*pInitialRoutineDefinitionTable;
	
}ITRON_CONFIG_TABLE;


/*****************************************************************************
コンフィグレーションテーブルを公開する関数定義
*****************************************************************************/
#define IMPLEMENT_ATTACH_APPLICATION			\
UINT FN_ATTACH_APPLICATION(ITRON_CONFIG_TABLE *pConfig)													\
{																										\
	if(pConfig->MySize < sizeof(ITRON_CONFIG_TABLE)) return -1;											\
	pConfig->KernelCfgVer								= KERNEL_CFG_VER;								\
	pConfig->EntriesOfTaskDefinitionTable				= NUM_OF_DEFINED_TASKS;							\
	pConfig->pTaskDefinitionTable						= TaskDefinitionTable;							\
	pConfig->EntriesOfSemaphoreDefinitionTable			= NUM_OF_DEFINED_SEMAPHORES;					\
	pConfig->pSemaphoreDefinitionTable					= SemaphoreDefinitionTable;						\
	pConfig->EntriesOfEventflagDefinitionTable			= NUM_OF_DEFINED_EVENTFLAGS;					\
	pConfig->pEventflagDefinitionTable					= EventflagDefinitionTable;						\
	pConfig->EntriesOfDataQueueDefinitionTable			= NUM_OF_DEFINED_DATAQUEUES;					\
	pConfig->pDataQueueDefinitionTable					= DataQueueDefinitionTable;						\
	pConfig->EntriesOfMailboxDefinitionTable			= NUM_OF_DEFINED_MAILBOXES;						\
	pConfig->pMailboxDefinitionTable					= MailboxDefinitionTable;						\
	pConfig->EntriesOfFixedMemoryPoolDefinitionTable	= NUM_OF_DEFINED_MPFS;							\
	pConfig->pFixedMemoryPoolDefinitionTable			= FixedMemoryPoolDefinitionTable;				\
	pConfig->EntriesOfCyclicHnadlerDefinitionTable		= 0;	/*NUM_OF_DEFINED_CYCHDRS;*/				\
	pConfig->pCyclicHnadlerDefinitionTable				= NULL;	/*CyclicHnadlerDefinitionTable;*/		\
	pConfig->EntriesOfAlarmHnadlerDefinitionTable		= 0;	/*NUM_OF_DEFINED_ALMHDRS;*/				\
	pConfig->pAlarmHnadlerDefinitionTable				= NULL;	/*AlarmHnadlerDefinitionTable;*/		\
	pConfig->EntriesOfInterruptHandlerDefinitionTable	= NUM_OF_DEFINED_INTHDRS;						\
	pConfig->pInterruptHandlerDefinitionTable			= InterruptHandlerDefinitionTable;				\
	pConfig->EntriesOfInitialRoutineDefinitionTable		= NUM_OF_DEFINED_INIRTNS;						\
	pConfig->pInitialRoutineDefinitionTable				= InitialRoutineDefinitionTable;				\
	return 0;																							\
}



#ifdef _APP_EXPORT
//DLL作成時に使用する定義
#define APP_EXTERN __declspec(dllexport)
#else
//DLLを呼び出す側で使用する定義
#define APP_EXTERN __declspec( dllimport ) 
#endif/*_KP_EXPORT*/

APP_EXTERN UINT FN_ATTACH_APPLICATION(ITRON_CONFIG_TABLE *pConfig);
typedef UINT ( *PFN_ATTACH_APPLICATION )	( ITRON_CONFIG_TABLE *pConfig );	/* */

#endif	/*_CMTOY*/


#endif /*__KERNEL_CFG_H__*/