/*****************************************************************************/
/* リアルタイム・マルチタスクカーネル 「ai-TRON」*/
/* Copyright (C) 2000-2001 by 今井彰彦 */
/*****************************************************************************/
/* システム定数 */
/* ユーザー参照有り */

#ifndef	__ROSTYPE__
#define __ROSTYPE__	1

/*****************************************************************************/
/* データタイプ */
/*****************************************************************************/
/* 汎用 */

typedef	signed char	B;	/* 符号付き 8ビット整数 */
/* signedがないと、コンパイルオプションでchar=unsigned char指定がある時にバグる */
typedef	signed short	H;	/* 符号付き 16ビット整数 */
typedef	signed int	W;	/* 符号付き 32ビット整数 */
typedef	unsigned char	UB;	/* 符号無し 8ビット整数 */
typedef	unsigned short  UH;	/* 符号無し 16ビット整数 */
typedef	unsigned int	UW;	/* 符号無し 32ビット整数 */
typedef signed int	_INT;	/* 符号付き整数（ビット数はＣＰＵに依って変化）*/
typedef unsigned int	_UINT;	/* 符号無し整数（ビット数はＣＰＵに依って変化）*/
				/* INT/UINTはそのCPUのＣのclass.hで定義されていることが多いので
				   前に_を付けた(2000/07/31) */
typedef	void (*FP)(void);	/* プログラムスタートアドレス一般 */
typedef	void * VP;		/* 不定型のアドレス一般 */

/* 以下このai-TRONの特有 */
typedef	UB	TID;		/* タスクのID番号;ただしbit7=1は特殊識別用 */
typedef	B	PRI;		/* タスク優先度(>=0;<0は特殊値) */
typedef	UH	TMO;		/* タイムアウト時間指定 */
				/* ただし、0xf???は特殊用で下位ビットTIDが入る */
				/* 従って、TIBよりビット数が多い設定でないと駄目 */
				/* 時間タイミングはSYSTIMEの単位毎だが、
				　ウエイト時間そのものはそこまで取らせない */
typedef	UB	WUPCNT;		/* wupcnt : 変更したらrosconf.hでのチェックも見直すこと */
typedef	UB	SUSCNT;		/* suscnt : 変更したらrosconf.hでのチェックも見直すこと */
typedef	UB	STAT;		/* status */
typedef	UB	FID;		/* フラグID */
typedef	B	SID;		/* セマフォID(>=0;<0は特殊値) : 変更したらrosconf.hでのチェックも見直すこと */
typedef UB	ATR;		/* 動作モード設定（システムコール用）*/

typedef UH	FN;		/* 機能番号（システムコール用）*/
typedef UB	MODE;		/* 動作モード設定（内部用）*/
typedef long	SYSTIME;	/* システムクロック;wai_tsk()最小タイミング */

typedef	UB	DSPCNT;		/* ivreq_dsp()〜vchk_dsp() : 変更したらrosconf.hでのチェックも見直すこと */

typedef	UB	STACK;		/* スタック本体の型＝スタックの確保単位 */
				/* 7900:スタックはデータバンク０固定なので本来は１６ビットで良い */
#define	STACKSZ	(sizeof(STACK))	/* スタック１要素のサイズ */

/*****************************************************************************/
/* 共通定数 */
/*****************************************************************************/

typedef enum {
	 ROS_FALSE		/* 偽:0 */
	,ROS_TRUE		/* 真:1 */
} ROS_BOOL;
#define	ROS_FPAUSE	(ROS_TRUE+1)	/* _fdispatch用一時偽->FLASE */
#define	ROS_TPAUSE	(ROS_FPAUSE+1)	/* _fdispatch用一時偽->TRUE  */
/* ROS_?PAUSEをROS_BOOLの中で定義しないのは、ROS_BOOLがこの２値であることを前提として
   引数の型に使っているからである。
*/
#define	TO_PAUSE	(ROS_TPAUSE-ROS_TRUE)	/* =2 */
			/* FALSE/TRUEからFPAUSE/TPAUSEに移行するためのオフセット */
/* 以上はkernelでも参照するので注意 */

/* ビット定数 */
#define BIT0		0x0001
#define BIT1		0x0002
#define BIT2		0x0004
#define BIT3		0x0008
#define BIT4		0x0010
#define BIT5		0x0020
#define BIT6		0x0040
#define BIT7		0x0080
#define BIT8		0x0100
#define BIT9		0x0200
#define BIT10		0x0400
#define BIT11		0x0800
#define BIT12		0x1000
#define BIT13		0x2000
#define BIT14		0x4000
#define BIT15		0x8000
/* MN101のように#define定義の内容にまで警告を出すＣのための定義 */
/* UB範囲のBIT定数定義 */
#define BIT0b		0x01
#define BIT1b		0x02
#define BIT2b		0x04
#define BIT3b		0x08
#define BIT4b		0x10
#define BIT5b		0x20
#define BIT6b		0x40
#define BIT7b		0x80

#ifndef	NULL
#define NULL 		((void *) 0)
/*#define	NULL		0*/
#endif

#ifndef EOS
#define	EOS		'\0'	/* End Of String */
#endif

#define NADR		NULL	/* アドレスやポインタ値が無効/終端値 */
				/* この設定はμITRON4に準拠 */

/*****************************************************************************/
/* タスク状態 */
/*****************************************************************************/

/* STAT型で受けるので、それにあった定義すること */
#define	TTS_DMT		0x10			/* 休止状態 */
#define	TTS_SUS		0x08			/* 強制待ち状態 */
#define	TTS_WAI		0x04			/* 待ち状態 */
#define	TTS_RDY		0x02			/* 実行待ち状態 */
#define	TTS_RUN		0x01			/* 実行中状態 */
#define	TTS_WAS		(TTS_SUS|TTS_WAI)	/* 二重待ち状態 */

/* タスク状態の定義（ITRON標準の定義が解り辛いので再定義）*/
#define	ROS_READY		TTS_RDY		/* 実行待ち */
#define	ROS_RUN			TTS_RUN		/* 実行中 : kernelでも参照する */
#define	ROS_WAIT		TTS_WAI		/* 待ち状態 */
#define	ROS_SUSPEND		TTS_SUS		/* 強制待ち状態 */
#define	ROS_WAIT_SUSPEND	TTS_WAS		/* 二重待ち状態 */
#define	ROS_DORMANT		TTS_DMT		/* 休止状態 */
#define	ROS_NO_EXISTENT		0x00		/* ROM上にだけ存在する状態 */

/*****************************************************************************/
/* メイル構造体 */
/*****************************************************************************/
/* 後方リンクのみの線形リストである */
/* リングバッファーでなくこの方法で実装するのは、メイル個数に制約がないのと、
　 メイル送付側にそのワークの生成を行わせることでどんな形のメイルでも
　 （間接的に）送付可能だからである。
*/

typedef struct	_t_msg_ {
	struct	_t_msg_	*next;	/* 次のメッセージへのポインタ */
				/* .nextの方が先にあるのは、リンクを参照する時に
				　　offset0の方が省メモリになるからである。
				　 本体よりリンクの方が参照回数が圧倒的に多い */
	VP	mail;		/* メイル本体のアドレス（内容はタスクに依る）*/
	TID	tid;		/* 送信元タスクID */
} T_MSG;

/*****************************************************************************/
/* ＯＳバージョン構造体 */
/*****************************************************************************/

typedef struct {
	UH	maker;		/* メーカー */
	UH	id;		/* 形式番号 */
	UH	spver;		/* 仕様書バージョン */
	UH	prver;		/* 製品バージョン */
	UH	prno[4];	/* 製品管理情報 */
	UH	cpu;		/* ＣＰＵ情報 */
	UH	var;		/* バリエーション記述子 */
} T_VER;

/*****************************************************************************/
/* システム定数 */
/*****************************************************************************/
/* カーネル */

/* タスク関係定義 */
#define	TSK_SELF	(_MyID)		/* 自己タスク */
					/* 使えないタスクもある */
					/* kernelでも参照しているので注意 */
#define	TSK_RUN		(_MyID)		/* TPRI_RUNと合わせるため */
#define	NO_TSK		(0xff)		/* タスクがない/タスクが不定（割り込み内）*/
					/* 必ず_MaxTaskになるようにすること */
					/* kernelでも参照する */

/* 優先順位の定義：TPRI型の範囲にすること */
#define	TPRI_RUN	(-1)		/* 実行中タスクの優先順位 */
#define	TPRI_SELF	TPRI_RUN	/* ＝自タスクの優先順位:μITRON4 */
#define	TPRI_INI	(-2)		/* cre_tsk()時の優先順位（初期優先順位）*/
#define	TPRI_NONE	(-3)		/* タスク切り替えのみを起こさせる（存在しない優先順位）*/

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

/* 待ち時間の特殊値 */
#define	TMO_NOWAIT	0		/* 待ち無しの印 */
#define	TMO_MAX		0xefff		/* これ以上は時間指定エラー */
#define	TMO_FEVR	0xffff		/* 永久待ち=slp_tsk()用 */

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

typedef	UH	EVENTFLG;

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

typedef	UB	SEMA;	/* 変更したらrosconf.hでのサイズ計算も見直すこと */

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

typedef	UB		HNO;	/* ハンドラ番号 : 変更したらrosconf.hでのチェックも見直すこと */
typedef	void	(*CFP)(HNO);	/* 周期起動プログラムスタートアドレス一般 */

typedef SYSTIME		RELTIM;	/* 周期起動ハンドラ起動周期 */

#define	TCY_OFF		0	/* 周期起動ハンドラは起動されない */
#ifdef __MN101__	/* MN101のCは#define定義の数値にまで警告を出すのでそれを回避するため */
#define	TCY_ON		BIT0b	/* 周期起動ハンドラは起動される */
#define	TCY_INI		BIT7b	/* 周期カウントを初期化する;ON/OFFと同時指定可能 */
#else
#define	TCY_ON		BIT0	/* 周期起動ハンドラは起動される */
#define	TCY_INI		BIT7	/* 周期カウントを初期化する;ON/OFFと同時指定可能 */
#endif

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

#endif	/* __ROSTYPE__ */

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