/*****************************************************************************/
/* リアルタイム・マルチタスクカーネル 「ai-TRON」*/
/* Copyright (C) 2000-2001 by 今井彰彦 */
/*****************************************************************************/
/* カーネル動作条件設定（スタック以外）*/
/* ユーザープログラム作成には基本的に関係ない */
/* ros.hから読み込まれる */

#ifndef	__CONFIG__
#define __CONFIG__	1

/*****************************************************************************/
/* エラーチェック */

#if 0	/* コマンドラインから-DERRCHK=(?)で指定する */
#define	ERRCHK	1	/* システムコールの引数エラーチェック有効 */
#endif
#ifndef	ERRCHK		/* ERRCHKの指定がない時は1とみなす */
#define	ERRCHK	1
#endif

/*****************************************************************************/
/* デバッグ用 */

#ifdef __H8__
	#define	DEBUG	(-1)	/* 0/-1のみ */
	#define	H8DEBUG	0	/* H8専用デバッグ設定 */
#else
	#if 0	/* コマンドラインから-DDEBUG=(?)で指定する */
	/* 基本的にはX68,DOS/V上でのみ設定可能 */
	/* DOS/Vでは(2)では異常動作するかもしれない（未チェック）*/
	#define	DEBUG	(0)	/* 0=デバッグルーチンなし */
				/* 1=あり:スタックチェックのみあり */
				/* 2=あり:表示もあり */
				/* -1=vext_ros()でスタックダンプのみあり */
				/* kernelでも参照するので注意 */
	#endif
#endif

#ifndef	DEBUG		/* DEBUGの指定がない時は0とみなす */
#define	DEBUG	0
#endif

#if DEBUG >=1 /* 実際には表示しなくても表示要求はあるので */
/* debug()の出力指定子：先頭１文字は<' '(0x20) */
#define	M_CHAR	"\x01[%c]"	/* 次の引数は文字 */
#define	M_DEC	"\x10%d"	/* 次の引数は１０進数 */
#define	M_HEX2	"\x02$%02x"	/* 次の引数は１６進数２桁 */
#define	M_HEX4	"\x04$%04x"	/* 次の引数は１６進数４桁 */
#define	M_HEX8	"\x08$%08lx"	/* 次の引数は１６進数８桁 */
#define	M_ADRS	"\x05%p"	/* 次の引数はアドレス */
#define	CRLF	"\n"		/* 改行文字列：debug()の終端値の１つ */
/* 文字列は直接記述すれば良い */
/* NULL/CRLFが最後を示す */

/* case での選択用 : 上記指定子の１文字目のコード*/
#define	C_CRLF	'\n'	/* 改行で終了 */
#define	C_CHAR	0x01	/* 次の引数は文字 */
#define	C_DEC	0x10	/* 次の引数は１０進数 */
#define	C_HEX2	0x02	/* 次の引数は１６進数２桁 */
#define	C_HEX4	0x04	/* 次の引数は１６進数４桁 */
#define	C_HEX8	0x08	/* 次の引数は１６進数８桁 */
#define	C_ADRS	0x05	/* 次の引数はアドレス */

#endif	/* DEBUG */

/*****************************************************************************/
/* 機能別 */
/* ここでON/OFF出来ないものは必須 */
/* ここでONでも実際に使われない関数はリンクされない */
/* 対応する関数が必ず存在するように設定する */

#define	TIMERS	2	/* システム用に使えるタイマーの数(=1/2) */
			/* タイマーが１つの時は周期起動は使えない */
#if TIMERS < 1
#error "タイマーがありません"
#endif

/* タスク管理・タスク付属同期 */
#define	ROS_TSK_ALL		ROS_ON	/* これは設定によらず組み込まれる（必須）*/
#define ROS_TSK_CRE_TSK		ROS_ON	/* cre_tsk() */
#define ROS_TSK_DEL_TSK		ROS_ON	/* del_tsk() */
#define	ROS_TSK_STA_TSK		ROS_ON	/* sta_tsk() */
#define	ROS_TSK_CHG_PRI		ROS_ON	/* chg_pri() */
#define	ROS_TSK_ROT_RDQ		ROS_ON	/* rot_rdq() */
#define	ROS_TSK_TSK_STS		ROS_ON	/* tsk_sts() */
#define	ROS_TSK_GET_TID		ROS_ON	/* get_tid() */
#define	ROS_TSK_REL_WAI		ROS_ON	/* rel_wai() */
#define	ROS_TSK_GET_PRI		ROS_ON	/* get_pri() */
/**/
#define	ROS_TSK_SUS_TSK		ROS_ON	/* sus_tsk() */
#if ROS_TSK_SUS_TSK == ROS_ON
	#define	ROS_TSK_RSM_TSK		ROS_ON	/* rsm_tsk()/frsm_tsk() */
#else	/* こちらは固定；変更不可 */
	#define	ROS_TSK_RSM_TSK		ROS_OFF	/* rsm_tsk()/frsm_tsk() */
#endif
/**/
#define	ROS_TSK_WUP_TSK		ROS_ON	/* wup_tsk() */
#if ROS_TSK_WUP_TSK == ROS_ON
	#define	ROS_TSK_WAI_TSK		ROS_ON	/* wai_tsk()/slp_tsk() */
	#define	ROS_TSK_CAN_WUP		ROS_ON	/* can_wup() */
#else	/* こちらは固定；変更不可 */
	#define	ROS_TSK_WAI_TSK		ROS_OFF	/* wai_tsk()/slp_tsk() */
	#define	ROS_TSK_CAN_WUP		ROS_OFF	/* can_wup() */
#endif
#define	ROS_TSK_VWAI_TSK	ROS_ON	/* vwai_tsk()/ivwai_tsk() */

/* イベントフラグ */
#define	ROS_FLG_ALL		ROS_ON	/* wai_flg()/set_flg() */
#if ROS_FLG_ALL	== ROS_ON
	#define	ROS_FLG_CLR_FLG		ROS_ON	/* clr_flg() */
	#define	ROS_FLG_POL_FLG		ROS_ON	/* pol_flg() */
	#define	ROS_FLG_CPOL_FLG	ROS_ON	/* cpol_flg() */
	#define	ROS_FLG_FLG_STS		ROS_ON	/* flg_sts() */
#else	/* こちらは固定；変更不可 */
	#define	ROS_FLG_CLR_FLG		ROS_OFF	/* clr_flg() */
	#define	ROS_FLG_POL_FLG		ROS_OFF	/* pol_flg() */
	#define	ROS_FLG_CPOL_FLG	ROS_OFF	/* cpol_flg() */
	#define	ROS_FLG_FLG_STS		ROS_OFF	/* flg_sts() */
#endif

/* タスク付属メイル */
#define	ROS_TMB_ALL		ROS_ON	/* snd_tmb()/rcv_tmb() */
#if ROS_TMB_ALL	== ROS_ON
	#define	ROS_TMB_PRCV_TMB	ROS_ON	/* precv_tmb() */
	#define	ROS_TMB_TMB_STS		ROS_ON	/* tmb_sts() */
	#define	ROS_TMB_POL_TMB_RCV	ROS_ON	/* vpol_tmb_rcv() */
#else	/* こちらは固定；変更不可 */
	#define	ROS_TMB_PRCV_TMB	ROS_OFF	/* precv_tmb() */
	#define	ROS_TMB_TMB_STS		ROS_OFF	/* tmb_sts() */
	#define	ROS_TMB_POL_TMB_RCV	ROS_OFF	/* vpol_tmb_rcv() */
#endif

/* セマフォ */
#define	ROS_SEM_ALL		ROS_ON	/* wai_sem()/sig_sem() */
#if ROS_SEM_ALL	== ROS_ON
	#define	ROS_SEM_PREQ_SEM	ROS_ON	/* preq_sem() */
	#define	ROS_SEM_SEM_STS		ROS_ON	/* sem_sts() */
	#define	ROS_SEM_SEM_STS		ROS_ON	/* sem_sts() */
	#define	ROS_SEM_DEF_SEM		ROS_ON	/* ROSDefaultSemaphore() : V1.1 */
#else	/* こちらは固定；変更不可 */
	#define	ROS_SEM_PREQ_SEM	ROS_OFF	/* preq_sem() */
	#define	ROS_SEM_SEM_STS		ROS_OFF	/* sem_sts() */
	#define	ROS_SEM_DEF_SEM		ROS_OFF	/* ROSDefaultSemaphore() : V1.1 */
#endif

/* 周期起動 */
#if TIMERS >= 2
	#define	ROS_CYC_ALL		ROS_ON	/* def_cyc */
					/* ros86.macでも参照するので注意 */
	#if ROS_CYC_ALL	== ROS_ON
		#define	ROS_CYC_ACT_CYC		ROS_ON	/* act_cyc() */
		#define	ROS_CYC_CYH_STS		ROS_ON	/* cyh_sts() */
	#else	/* こちらは固定；変更不可 */
		#define	ROS_CYC_ACT_CYC		ROS_OFF	/* act_cyc() */
		#define	ROS_CYC_CYH_STS		ROS_OFF	/* cyh_sts() */
	#endif
#else	/* タイマーが１本の時は周期起動は使えない */
	/* こちらは書き替え不可 */
	#define	ROS_CYC_ALL		ROS_OFF	/* def_cyc() */
	#define	ROS_CYC_ACT_CYC		ROS_OFF	/* act_cyc() */
	#define	ROS_CYC_CYH_STS		ROS_OFF	/* cyh_sts() */
#endif

/* システム状態管理 */
#define	ROS_SYS_GET_VER		ROS_ON	/* get_ver() */
#define	ROS_SYS_DSP		ROS_ON	/* dis_dsp()/ena_dsp() */
#define	ROS_SYS_CHK_DSP		ROS_ON	/* vchk_dsp()/vreq_dsp() */
#define	ROS_SYS_EXT_ROS		ROS_ON	/* vext_ros() */

/* 割り込み処理 */
#define	ROS_INT_ALL		ROS_ON	/* これは設定によらず組み込まれる（必須）*/

/*****************************************************************************/
/* 性能別
・以下の各定数の理論上の最大値は、その変数の型による。
　ただし、実装時にそれ以下の範囲内で設定する。
・一般的に、数値を大きくするとＲＡＭ上のワークエリアが増え、ＯＳの速度も低下する。
・現在、各種番号は０〜にしている。これは実装の効率の良さに依るが、
　 μITRONでは１〜の方が一般的らしい
*/
/*---------------------------------------------------------------------------*/
/* カーネル */

#define	TSK_MAX		16		/* 登録可能最大タスク数(TID;但しNO_TSK未満で収まる範囲) */
					/* 減らすと構造体の数が減る */
#if TSK_MAX < 1
#error	"タスクが登録出来ません"
#endif
#if TSK_MAX >= 250			/* TID=UB範囲であるが、250以上は特殊値とするため */
#error	"タスクが多すぎます"
#endif

#define	TMIN_TID	0		/* タスク番号の最小値:μITRON4 */
#define	TMAX_TID	(TSK_MAX-1)	/* タスク番号の最大値:μITRON4 */

/*--------------------------------------*/

#define	PRI_MAX		8		/* 優先順位種類数 */
					/* 減らしても余り意味はない */
#if PRI_MAX < 1
#error	"優先順位がありません"
#endif
#if PRI_MAX >= 100			/* PRI=B範囲であるが、100以上は特殊値とするため */
#error	"優先順位が多すぎます"
#endif
#define	TMIN_TPRI	0		/* 優先順位の最小値:μITRON4 */
#define	TMAX_TPRI	(PRI_MAX-1)	/* 優先順位の最大値:μITRON4 */
					/* μITRON3では1〜8,μITRON4は最低1〜16らしい */
					/* 小さいほど優先順位高 */
					/* 通常、TMAX_TPRIから使う（低い方から）*/

/*--------------------------------------*/

/* SYSTIME単位を秒単位に直すための除数 */
/* 割り込みのタイミングを100μsecにすると
　SYS_CLK=(1000*1000*10)=10000000となり、TMOはTMO_MAX<UHの最大値であるため、
  SYS_CLK値を直接指定することは出来なくなる。
*/
/* ↓↓↓↓↓↓↓↓↓↓↓↓↓ここから機種別↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
#ifdef __DOSV__
#define	SYS_CLK		(18L)
#else
#define	SYS_CLK		(100L)
#endif
/* ↑↑↑↑↑↑↑↑↑↑↑↑↑ここまで機種別↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */

/*---------------------------------------------------------------------------*/
/* タスク管理・タスク付属同期 */

#define	WUP_MAX		16		/* wupcntの最大キューイング数 */
					/* 減らしても余り意味はない */
#if WUP_MAX < 1
#error	"WUP_MAXがキューイングできません"	/* 使わない時も0にはしない */
#endif
#if WUP_MAX >= 200			/* WUPCNTの型の範囲にすること */
#error	"WUP_MAXが多すぎます"
#endif

#define	TMIN_WUP	0		/* wupcntの最小値:μITRON4 */
#define	TMAX_WUP	(WUP_MAX-1)	/* wupcntの最大値:μITRON4 */

/*--------------------------------------*/

#define	SUS_MAX		16		/* suscntの最大キューイング数 */
					/* 減らしても余り意味はない */
#if SUS_MAX < 1
#error	"SUS_MAXがキューイングできません"	/* 使わない時も0にはしない */
#endif
#if SUS_MAX >= 200			/* SUSCNTの型の範囲にすること */
#error	"SUS_MAXが多すぎます"
#endif

#define	TMIN_SUS	0		/* suscntの最小値:μITRON4 */
#define	TMAX_SUS	(SUS_MAX-1)	/* suscntの最大値:μITRON4 */

/*--------------------------------------*/

/* cre_tsk()でStackDan=0の時のデフォルト設定値（バイト）*/
/* これ以下には設定出来なくする */
/* CPU毎に異なる;cpu.txt参照 */
#ifdef	__HUMAN68K__	/* (680x0/ColdFire両方) */
#define	STSIZE0	(36+sizeof(UB*))	/* sizeof(UB*)はリターンアドレス保存のためとする */
#endif
#ifdef	__H8__		/* H8 */
#define	STSIZE0	(20+sizeof(UB*))
#endif
#ifdef	__DOSV__	/* 80286 */
#define	STSIZE0	(10+sizeof(UB*))
#endif
#ifdef	__MN101__	/* MN101C00 */
#define	STSIZE0	(4+sizeof(UB*))
#endif
#ifdef	__7900__	/* 7900 */
#define	STSIZE0	(4+sizeof(UB*))
#endif
#ifdef	__Z80__		/* Z80 */
#define	STSIZE0	(4+sizeof(UB*))
#endif

/*---------------------------------------------------------------------------*/
/* １ビットイベントフラグ */

#define	FLG_MAX		(sizeof(EVENTFLG)*8)	/* フラグの数 */
					/* １変数のビットなので、その型に依る */
#define	TBIT_FLGPTN	FLG_MAX		/* フラグの数:μITRON4 */

/*---------------------------------------------------------------------------*/
/* セマフォ */

#define	SEM_MAX		8		/* セマフォの数<=SIDの範囲 */
					/* 減らすとワークが減る */
#if SEM_MAX < 1
#error	"セマフォが使えません"		/* 使わない時も0にはしない */
#endif
#if SEM_MAX >= 128			/* SIDの型の範囲にすること */
#error	"セマフォカウントが多すぎます"
#endif

#define	SEM_CNT_MAX	(256*sizeof(SEMA)-1)	/* １セマの最大カウント数 */
					/* SEMAがunsignedだからこれで良いが、signedではだめ */

#define	TMAX_MAXSEM	SEM_MAX		/* セマフォの数:μITRON4 */
#define	TMIN_SEM	0		/* セマフォ番号の最小値:μITRON4 */
#define	TMAX_SEM	(SEM_MAX-1)	/* セマフォ番号の最大値:μITRON4 */

#define	ISEMCNT		0		/* 初期カウント値 */

/*---------------------------------------------------------------------------*/
/* 周期起動 */

#define	CYC_MAX		4		/* 周期起動タスクの最大登録数 */
					/* 減らすと構造体の数が減る */
#if CYC_MAX < 1
#error	"周期起動が使えません"		/* 使わない時も0にはしない */
#endif
#if CYC_MAX >= 128			/* HNOの型の範囲にすること */
#error	"周期起動が多すぎます"
#endif

/*---------------------------------------------------------------------------*/
/* システム状態管理 */

#define	REQ_DSP_MAX	64		/* ivreq_dsp()の最大キューイング数 */
					/* 変数の型に依って最大値が決まる */
#if REQ_DSP_MAX < 1
#error	"ivreq_dspが使えません"		/* 使わない時も0にはしない */
#endif
#if REQ_DSP_MAX >= 256			/* DSPCNTの型の範囲にすること */
#error	"ivreq_dspのキューイングが多すぎます"
#endif

#define	TMIN_REQ_DSP	0		/* ivreq_dsp()の最小値 */
#define	TMAX_REQ_DSP	(REQ_DSP_MAX-1)	/* ivreq_dsp()の最大値 */

/*****************************************************************************/

#endif	/* __CONFIG__ */

/*****************************************************************************/
