/*****************************************************************************
file name : itron.h
  μITRON仕様共通定義で規定されるデータ型、定数、マクロ等の定義
  「μITRON4.0仕様 Ver.4.01.00 （社）トロン協会 ITRON部会」を参照

  Copyright(C) 2002 佐々木芳

Windowsのシミュレーション環境上で動作するアプリケーションプログラムのコンパイル時には以下のマクロ定義が必要
	_CMTOY
*****************************************************************************/
/*
 *  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 __ITRON_H__
#define __ITRON_H__

#ifdef _CMTOY
/*Windowsシミュレーション環境*/
#ifdef _KP_EXPORT
//kpdll.dll作成時に使用する定義
#define KP_EXTERN __declspec(dllexport)
#else
/*kpdll.dllを呼び出す側で使用する定義*/
#define KP_EXTERN __declspec( dllimport ) 
#endif/*_KP_EXPORT*/
#endif/*_CMTOY*/

/*****************************************************************************
	μITRON 基本データ型の定義
*****************************************************************************/

typedef signed char		B;		/* 符号付き8ビット整数 */
typedef signed short	H;		/* 符号付き16ビット整数 */
typedef signed long		W;		/* 符号付き32ビット整数 */
/*typedef signed longlong	D;		/* 符号付き64ビット整数 */
typedef unsigned char	UB;		/* 符号無し8ビット整数 */
typedef unsigned short	UH;		/* 符号無し16ビット整数 */
typedef unsigned long	UW;		/* 符号無し32ビット整数 */
/*typedef unsigned longlong	UD;	/* 符号無し64ビット整数 */
typedef char			VB;		/* データタイプが定まらない8ビットの値 */
typedef short			VH;		/* データタイプが定まらない16ビットの値 */
typedef long			VW;		/* データタイプが定まらない32ビットの値 */
/*typedef longlong		VD;		/* データタイプが定まらない64ビットの値 */
typedef void			*VP;	/* データタイプが定まらないものへのポインタ */
typedef void			*FP;	/* プログラムの起動番地 */
#ifdef _CMTOY
typedef UW				CMSIZE;	/* メモリ領域のサイズ（符号無し整数）*/
#else
typedef UW				SIZE;	/* メモリ領域のサイズ（符号無し整数）*/
#endif


/******************************************************************************
 * μITRON 派生データ構造の定義
 *****************************************************************************/

typedef signed int		INT;	/* プロセッサに自然なサイズの符号付き整数 */
typedef unsigned int	UINT;	/* プロセッサに自然なサイズの符号無し整数 */
#ifdef _CMTOY
typedef int				BOOL;	/* 真偽値（TRUEまたはFALSE）*/
#else
typedef W				BOOL;	/* 真偽値（TRUEまたはFALSE）*/
#endif
typedef H				FN;		/* 機能コード（符号付き整数）*/
typedef W				ER;		/* エラーコード（符号付き整数）*/
typedef W				ID;		/* オブジェクトのID番号（符号付き整数）*/
typedef UW				ATR;	/* オブジェクト属性（符号無し整数）*/
typedef UW				STAT;	/* オブジェクトの状態（符号無し整数）*/
typedef UW				MODE;	/* サービスコールの動作モード（符号無し整数）*/
typedef H				PRI;	/* 優先度（符号付き整数）*/
typedef W				TMO;	/* タイムアウト指定（符号付き整数，時間単位はmsec）*/
typedef UW				RELTIM;	/* 相対時間（符号無し整数，時間単位はmsec）*/
typedef UW				SYSTIM;	/* システム時刻（符号無し整数，時間単位はmsec）*/
typedef VP				VP_INT;	/* データタイプが定まらないものへのポインタまたはプロセッサに自然なサイズの符号付き整数 */
typedef W				ER_BOOL;/* エラーコードまたは真偽値 */
typedef UW				ER_ID;	/* エラーコードまたはID番号（負のID番号は表現できない）*/
typedef UINT			ER_UINT;/* エラーコードまたは符号無し整数（符号無し整数の有効ビット数はUINTより1ビット短い）*/
typedef UW				TEXPTN;	/* タスク例外要因のビットパターン（符号無し整数）*/
typedef UW				FLGPTN;	/* イベントフラグのビットパターン（符号無し整数）*/
typedef UW				RDVPTN;	/* ランデブ条件のビットパターン（符号無し整数）*/
typedef UH				RDVNO;	/* ランデブ番号 */
typedef UW				OVRTIM;	/* プロセッサ時間（符号無し整数，時間単位はmsec）*/
typedef UH				INHNO;	/* 割込みハンドラ番号 */
typedef UH				INTNO;	/* 割込み番号 */
typedef BOOL			IFL;	/* 割込みフラグ */
typedef UH				EXCNO;	/* CPU例外ハンドラ番号 */

/*双方向リンクヘッダ*/
typedef struct tagLinkHeader{
	VP		pNext;			/*前方リンクポインタ*/
	VP		pPrev;			/*後方リンクポインタ*/
	IFCMTOY(VP pQH;)		
}LINK;

/*キューヘッダ*/
typedef struct tagQueueHeader{
	VP		pNext;			/*前方リンクポインタ*/
	VP		pPrev;			/*後方リンクポインタ*/
	IFCMTOY(int nItem;)		
}QUEUEHEADER;

typedef struct tagMessageHeader{
	LINK		link;
}T_MSG;

typedef struct tagMessageBlockPriority{
	T_MSG	msgque;
	PRI		msgpri;
}T_MSG_PRI;

/*****************************************************************************
    μITRONで使用する関数タイプ
*****************************************************************************/
typedef void ( *TASKP )( VP_INT );				/* タスク */
typedef void ( *INTHDR )( void );				/* 割り込みハンドラ */
typedef void ( *CYCHDR )( VP_INT );				/* 周期ハンドラ */
typedef void ( *CPUEXC )( VP_INT );				/* CPU例外ハンドラ */
typedef void ( *INIRTN )( VP_INT );				/* 初期化ルーチン */
typedef void ( *TEXHDR )( TEXPTN, VP_INT );		/* タスク例外ハンドラ*/


/*****************************************************************************
    μITRON パケット形式
*****************************************************************************/

/* (1) タスク管理機能 */

/* タスク生成情報のパケット形式 */

	typedef struct t_ctsk {
		ATR		tskatr ;	/* タスク属性 */
		VP_INT	exinf ;		/* タスクの拡張情報 */
		FP		task ;		/* タスクの起動番地 */
		PRI		itskpri ;	/* タスクの起動時優先度 */
#ifdef _CMTOY
		CMSIZE	stksz ;		/* タスクのスタックサイズ（バイト数） */
#else
		SIZE	stksz ;		/* タスクのスタックサイズ（バイト数） */
#endif
		VP	stk ;			/* タスクのスタック領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* タスク名*/
	} T_CTSK ;

/* タスク状態のパケット形式*/

	typedef struct t_rtsk {
		STAT	tskstat ;	/* タスク状態 */
		PRI		tskpri ;	/* タスクの現在優先度 */
		PRI		tskbpri ;	/* タスクのベース優先度 */
		STAT	tskwait ;	/* 待ち要因 */
		ID		wobjid ;	/* 待ち対象のオブジェクトのID番号 */
		TMO		lefttmo ;	/* タイムアウトするまでの時間 */
		UINT	actcnt ;	/* 起動要求キューイング数 */
		UINT	wupcnt ;	/* 起床要求キューイング数 */
		UINT	suscnt ;	/* 強制待ち要求ネスト数 */
		/* 以下実装独自の追加 */
		const char	*name;		/* タスク名*/
	} T_RTSK ;

/* タスク状態（簡易版）のパケット形式 */

	typedef struct t_rtst {
		STAT	tskstat ;	/* タスク状態 */
		STAT	tskwait ;	/* 待ち要因 */
		/* 以下実装独自の追加 */
	} T_RTST ;

/* (3) タスク例外処理機能 */
/* タスク例外処理ルーチン定義情報のパケット形式 */

	typedef struct t_dtex {
		ATR		texatr ;	/* タスク例外処理ルーチン属性 */
		FP		texrtn ;	/* タスク例外処理ルーチンの起動番地 */
		/* 以下実装独自の追加 */
	} T_DTEX ;

/* タスク例外処理状態のパケット形式 */

	typedef struct t_rtex {
		STAT	texstat ;	/* タスク例外処理の状態 */
		TEXPTN	pndptn ;	/* 保留例外要因 */
		/* 以下実装独自の追加 */
	} T_RTEX ;

/* (4) 同期・通信機能 */
/* セマフォ生成情報のパケット形式 */

	typedef struct t_csem {
		ATR		sematr ;	/* セマフォ属性 */
		UINT	isemcnt ;	/* セマフォの資源数の初期値 */
		UINT	maxsem ;	/* セマフォの最大資源数 */
		/* 以下実装独自の追加 */
		const char*	name;		/* セマフォ名*/
	} T_CSEM ;

/* セマフォ状態のパケット形式 */

	typedef struct t_rsem {
		ID		wtskid ;	/* セマフォの待ち行列の先頭のタスクのID番号 */
		UINT	semcnt ;	/* セマフォの現在の資源数 */
		/* 以下実装独自の追加 */
		const char*	name;		/* セマフォ名*/
	} T_RSEM ;

/* イベントフラグ生成情報のパケット形式 */

	typedef struct t_cflg {
		ATR		flgatr ;	/* イベントフラグ属性 */
		FLGPTN	iflgptn ;	/* イベントフラグのビットパターンの初期値 */
		/* 以下実装独自の追加 */
		const char*	name;		/* イベントフラグ名*/
	} T_CFLG ;

/* イベントフラグ状態のパケット形式 */

	typedef struct t_rflg {
		ID		wtskid ;	/* イベントフラグの待ち行列の先頭のタスクのID番号 */
		FLGPTN	flgptn ;	/* イベントフラグの現在のビットパターン */
		/* 以下実装独自の追加 */
		const char*	name;		/* イベントフラグ名*/
	} T_RFLG ;

/* データキュー生成情報のパケット形式 */

	typedef struct t_cdtq {
		ATR		dtqatr ;	/* データキュー属性 */
		UINT	dtqcnt ;	/* データキュー領域の容量（データの個数） */
		VP		dtq ;		/* データキュー領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* データキュー名*/
	} T_CDTQ ;

/* データキュー状態のパケット形式 */

	typedef struct t_rdtq {
		ID		stskid ;	/* データキューの送信待ち行列の先頭のタスクのID番号 */
		ID		rtskid ;	/* データキューの受信待ち行列の先頭のタスクのID番号 */
		UINT	sdtqcnt ;	/* データキューに入っているデータの数 */
		/* 以下実装独自の追加 */
		const char*	name;		/* データキュー名*/
	} T_RDTQ ;

/* メールボックス生成情報のパケット形式 */

	typedef struct t_cmbx {
		ATR		mbxatr ;	/* メールボックス属性 */
		PRI		maxmpri ;	/* メッセージ優先度の最大値 */
		VP		mprihd ;	/* 優先度別のメッセージキューヘッダ領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;	/* メイルボックス名*/
	} T_CMBX ;

/* メールボックス状態のパケット形式 */
	typedef struct t_rmbx {
		ID		wtskid ;	/* メールボックスの待ち行列の先頭のタスクのID番号 */
		T_MSG *	pk_msg ;	/* メッセージキューの先頭のメッセージパケットの先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;	/* メイルボックス名*/
		int		msgcnt;		/* メッセージ数*/
	} T_RMBX ;

/* (5) 拡張同期・通信機能 */
/* ミューテックス生成情報のパケット形式 */

	typedef struct t_cmtx {
		ATR		mtxatr ;	/* ミューテックス属性 */
		PRI		ceilpri ;	/* ミューテックスの上限優先度 */
		/* 以下実装独自の追加 */
		const char*	name;		/* ミューテックス名*/
	} T_CMTX ;

/* ミューテックス状態のパケット形式 */

	typedef struct t_rmtx {
		ID		htskid ;	/* ミューテックスをロックしているタスクのID番号 */
		ID		wtskid ;	/* ミューテックスの待ち行列の先頭のタスクのID番号 */
		/* 以下実装独自の追加 */
		const char*	name;		/* ミューテックス名*/
	} T_RMTX ;

/* メッセージバッファ生成情報のパケット形式 */

	typedef struct t_cmbf {
		ATR		mbfatr ;	/* メッセージバッファ属性 */
		UINT	maxmsz ;	/* メッセージの最大サイズ（バイト数） */
#ifdef _CMTOY
		CMSIZE	mbfsz ;		/* メッセージバッファ領域のサイズ（バイト数） */
#else
		SIZE	mbfsz ;		/* メッセージバッファ領域のサイズ（バイト数） */
#endif
		VP		mbf ;		/* メッセージバッファ領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* メッセージバッファ名*/
	} T_CMBF ;


/* メッセージバッファ状態のパケット形式 */
	typedef struct t_rmbf {
		ID		stskid ;	/* メッセージバッファの送信待ち行列の先頭のタスクのID番号 */
		ID		rtskid ;	/* メッセージバッファの受信待ち行列の先頭のタスクのID番号 */
		UINT	smsgcnt ;	/* メッセージバッファに入っているデータの数 */
#ifdef _CMTOY
		CMSIZE	fmbfsz ;	/* メッセージバッファ領域の空き領域のサイズ（バイト数，最低限の管理領域を除く） */
#else
		SIZE	fmbfsz ;	/* メッセージバッファ領域の空き領域のサイズ（バイト数，最低限の管理領域を除く） */
#endif
		/* 以下実装独自の追加 */
		const char*	name;		/* メッセージバッファ名*/
	} T_RMBF ;

/* ランデブポート生成情報のパケット形式 */
	typedef struct t_cpor {
		ATR		poratr ;	/* ランデブポート属性 */
		UINT	maxcmsz ;	/* 呼出しメッセージの最大サイズ（バイト数） */
		UINT	maxrmsz ;	/* 返答メッセージの最大サイズ（バイト数） */
		/* 以下実装独自の追加 */
		const char*	name;		/* ランデブポート名*/
	} T_CPOR ;

/* ランデブポート状態のパケット形式 */

	typedef struct t_rpor {
		ID		ctskid ;	/* ランデブポートの呼出し待ち行列の先頭のタスクのID番号 */
		ID		atskid ;	/* ランデブポートの受付待ち行列の先頭のタスクのID番号 */
		/* 以下実装独自の追加 */
		const char*	name;		/* ランデブポート名*/
	} T_RPOR ;

/* ランデブ状態のパケット形式 */

	typedef struct t_rrdv {
		ID		wtskid ;	/* ランデブ終了待ち状態のタスクのID番号 */
		/* 以下実装独自の追加 */
	} T_RRDV ;

/* (6) メモリプール管理機能 */

/* 固定長メモリプール生成情報のパケット形式 */

	typedef struct t_cmpf {
		ATR		mpfatr ;	/* 固定長メモリプール属性 */
		UINT	blkcnt ;	/* 獲得できるメモリブロック数（個数） */
		UINT	blksz ;		/* メモリブロックのサイズ（バイト数） */
		VP		mpf ;		/* 固定長メモリプール領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* メモリプール名*/
	} T_CMPF ;

/* 固定長メモリプール状態のパケット形式 */

	typedef struct t_rmpf {
		ID		wtskid ;	/* 固定長メモリプールの待ち行列の先頭のタスクのID番号 */
		UINT	fblkcnt ;	/* 固定長メモリプールの空きメモリブロック数（個数） */
		/* 以下実装独自の追加 */
		const char*	name;		/* メモリプール名*/
		UINT	blkcnt ;	/* 獲得できるメモリブロック数（個数） */
		UINT	blksz ;		/* メモリブロックのサイズ（バイト数） */
		VP		mpf ;		/* 固定長メモリプール領域の先頭番地 */
		UINT	mpfsz ;		/* 固定長メモリプール領域のサイズ */
	} T_RMPF ;


/* 可変長メモリプール生成情報のパケット形式 */

	typedef struct t_cmpl {
		ATR		mplatr ;	/* 可変長メモリプール属性 */
#ifdef _CMTOY
		CMSIZE	mplsz ;		/* 可変長メモリプール領域のサイズ（バイト数） */
#else
		SIZE	mplsz ;		/* 可変長メモリプール領域のサイズ（バイト数） */
#endif
		VP		mpl ;		/* 可変長メモリプール領域の先頭番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* メモリプール名*/
	} T_CMPL ;

/* 可変長メモリプール状態のパケット形式 */
	typedef struct t_rmpl {
		ID		wtskid ;	/* 可変長メモリプールの待ち行列の先頭のタスクのID番号 */
#ifdef _CMTOY
		CMSIZE	fmplsz ;	/* 可変長メモリープルの空き領域の合計サイズ（バイト数） */
#else
		SIZE	fmplsz ;	/* 可変長メモリープルの空き領域の合計サイズ（バイト数） */
#endif
		UINT	fblksz ;	/* すぐに獲得可能な最大メモリブロックサイズ（バイト数） */
		/* 実装独自に他のフィールドを追加してもよい */
		const char*	name;		/* メモリプール名*/
	} T_RMPL ;

/* (7) 時間管理機能 */

/* 周期ハンドラ生成情報のパケット形式 */

	typedef struct t_ccyc {
		ATR		cycatr ;	/* 周期ハンドラ属性 */
		VP_INT	exinf ;		/* 周期ハンドラの拡張情報 */
		FP		cychdr ;	/* 周期ハンドラの起動番地 */
		RELTIM	cyctim ;	/* 周期ハンドラの起動周期 */
		RELTIM	cycphs ;	/* 周期ハンドラの起動位相 */
		/* 以下実装独自の追加 */
		const char*	name;		/* 周期ハンドラ名*/
	} T_CCYC ;

/* 周期ハンドラ状態のパケット形式 */

	typedef struct t_rcyc {
		STAT	cycstat ;	/* 周期ハンドラの動作状態 */
		RELTIM	lefttim ;	/* 周期ハンドラを次に起動すべき時刻までの時間 */
		/* 以下実装独自の追加 */
		const char*	name;		/* 周期ハンドラ名*/
	} T_RCYC ;

/* アラームハンドラ生成情報のパケット形式 */

	typedef struct t_calm {
		ATR		almatr ;	/* アラームハンドラ属性 */
		VP_INT	exinf ;		/* アラームハンドラの拡張情報 */
		FP		almhdr ;	/* アラームハンドラの起動番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* アラームハンドラ名*/
	} T_CALM ;

/* アラームハンドラ状態のパケット形式 */

	typedef struct t_ralm {
		STAT	almstat ;	/* アラームハンドラの動作状態 */
		RELTIM	lefttim ;	/* アラームハンドラの起動時刻までの時間 */
		/* 以下実装独自の追加 */
		const char*	name;		/* アラームハンドラ名*/
	} T_RALM ;

/* オーバーランハンドラ定義情報のパケット形式 */

	typedef struct t_dovr {
		ATR		ovratr ;	/* オーバーランハンドラ属性 */
		FP		ovrhdr ;	/* オーバーランハンドラの起動番地 */
		/* 以下実装独自の追加 */
	} T_DOVR ;

/* オーバーランハンドラ状態のパケット形式 */

	typedef struct t_rovr {
		STAT	ovrstat ;	/* オーバーランハンドラの動作状態 */
		OVRTIM	leftotm ;	/* 残りのプロセッサ時間 */
		/* 以下実装独自の追加 */
	} T_ROVR ;

/* (8) システム状態管理機能 */

/* システム状態のパケット形式 */

	typedef struct t_rsys {
		/* 以下実装独自の追加 */
		W		sysstat;	/*システムの状態 */
	} T_RSYS ;


/* (9) 割込み管理機能 */

/* 割込みハンドラ定義情報のパケット形式*/

	typedef struct t_dinh {
		ATR		inhatr ;	/* 割込みハンドラ属性 */
		FP		inthdr ;	/* 割込みハンドラの起動番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* 割込みハンドラ名*/
	} T_DINH ;

/* 割込みサービスルーチン生成情報のパケット形式*/

	typedef struct t_cisr {
		ATR		isratr ;	/* 割込みサービスルーチン属性 */
		VP_INT	exinf ;		/* 割込みサービスルーチンの拡張情報 */
		INTNO	intno ;		/* 割込みサービスルーチンを付加する割込み番号 */
		FP		isr ;		/* 割込みサービスルーチンの起動番地 */
		/* 以下実装独自の追加 */
		const char*	name;		/* 割込みサービスルーチン名*/
	} T_CISR ;

/* 割込みサービスルーチン状態のパケット形式 */
	typedef struct t_risr {
		/* 以下実装独自の追加 */
		const char*	name;		/* 割込みハンドラ名*/
	} T_RISR ;
/* (10) サービスコール管理機能 */
/* 拡張サービスコール定義情報のパケット形式 */

	typedef struct t_dsvc {
		ATR		svcatr ;	/* 拡張サービスコール属性 */
		FP		svcrtn ;	/* 拡張サービスコールルーチンの起動番地 */
		/* 以下実装独自の追加 */
	} T_DSVC ;

/* (11) システム構成管理機能 */
/* CPU例外ハンドラ定義情報のパケット形式 */
	typedef struct t_dexc {
		ATR		excatr ;	/* CPU例外ハンドラ属性 */
		FP		exchdr ;	/* CPU例外ハンドラの起動番地 */
		/* 以下実装独自の追加 */
	} T_DEXC ;


/* コンフィギュレーション情報のパケット形式 */
#if 0
	typedef struct t_rcfg {
		/* 以下実装独自の追加 */
	} T_RCFG ;
#endif

/* バージョン情報のパケット形式 */

	typedef struct t_rver {
		UH		maker ;		/* カーネルのメーカーコード */
		UH		prid ;		/* カーネルの識別番号 */
		UH		spver ;		/* ITRON仕様のバージョン番号 */
		UH		prver ;		/* カーネルのバージョン番号 */
		UH		prno[4] ;	/* カーネル製品の管理情報 */
	} T_RVER ;

/*****************************************************************************
	μITRON 定数とマクロの定義
*****************************************************************************/

/* (1) オブジェクト属性 */

#define	TA_HLNG		0x00	/* 高級言語用のインタフェースで処理単位を起動 */
#define	TA_ASM		0x01	/* アセンブリ言語用のインタフェースで処理単位を起動 */
#define	TA_TFIFO	0x00	/* タスクの待ち行列をFIFO順に */
#define	TA_TPRI		0x01	/* タスクの待ち行列をタスクの優先度順に */
#define	TA_MFIFO	0x00	/* メッセージのキューをFIFO順に */
#define	TA_MPRI		0x02	/* メッセージのキューをメッセージの優先度順に */
#define	TA_ACT		0x02	/* タスクを起動された状態で生成 */
#define	TA_RSTR		0x04	/* 制約タスク */
#define	TA_WSGL		0x00	/* イベントフラグを複数のタスクが待つことを許さない */
#define	TA_WMUL		0x02	/* イベントフラグを複数のタスクが待つことを許す */
#define	TA_CLR		0x04	/* 待ち解除時にイベントフラグをクリア */
#define	TA_INHERIT	0x02	/* ミューテックスが優先度継承プロトコルをサポート */
#define	TA_CEILING	0x03	/* ミューテックスが優先度上限プロトコルをサポート */
#define	TA_STA		0x02	/* 周期ハンドラを動作している状態で生成 */
#define	TA_PHS		0x04	/* 周期ハンドラの位相を保存 */

/* (2) サービスコールの動作モード */

#define	TWF_ANDW	0x00	/* イベントフラグのAND待ち */
#define	TWF_ORW		0x01	/* イベントフラグのOR待ち */

/* (3) 特殊な意味を持つタイムアウト値 */
#define TMO_POL		(0)    /* ポーリングを表すタイムアウト値 */
#define TMO_FEVR	(-1)   /* 永遠のタイムアウト(つまり,タイムアウト無効)値 */

/* (3) オブジェクトの状態 */

#define	TTS_NON		0x00

#define	TTS_RUN		0x01		/* 実行状態 */
#define	TTS_RDY		0x02		/* 実行可能状態 */
#define	TTS_WAI		0x04		/* 待ち状態 */
#define	TTS_SUS		0x08		/* 強制待ち状態 */
#define	TTS_WAS		0x0c		/* 二重待ち状態 */
#define	TTS_DMT		0x10		/* 休止状態 */

#define	TTW_SLP		0x0001		/* 起床待ち状態 */
#define	TTW_DLY		0x0002		/* 時間経過待ち状態 */
#define	TTW_SEM		0x0004		/* セマフォ資源の獲得待ち状態 */
#define	TTW_FLG		0x0008		/* イベントフラグ待ち状態 */
#define	TTW_SDTQ	0x0010		/* データキューへの送信待ち状態 */
#define	TTW_RDTQ	0x0020		/* データキューからの受信待ち状態 */
#define	TTW_MBX		0x0040		/* メールボックスからの受信待ち状態 */
#define	TTW_MTX		0x0080		/* ミューテックスのロック待ち状態 */
#define	TTW_SMBF	0x0100		/* メッセージバッファへの送信待ち状態 */
#define	TTW_RMBF	0x0200		/* メッセージバッファからの受信待ち状態 */
#define	TTW_CAL		0x0400		/* ランデブの成立待ち状態 */
#define	TTW_ACP		0x0800		/* ランデブの受付待ち状態 */
#define	TTW_RDV		0x1000		/* ランデブの完了待ち状態 */
#define	TTW_MPF		0x2000		/* 固定長メモリブロックの獲得待ち状態 */
#define	TTW_MPL		0x4000		/* 可変長メモリブロックの獲得待ち状態 */

#define	TTEX_ENA	0x00		/* タスク例外処理許可状態 */
#define	TTEX_DIS	0x01		/* タスク例外処理禁止状態 */
#define	TCYC_STP	0x00		/* 周期ハンドラが動作していない */
#define	TCYC_STA	0x01		/* 周期ハンドラが動作している */
#define	TALM_STP	0x00		/* アラームハンドラが動作していない */
#define	TALM_STA	0x01		/* アラームハンドラが動作している */
#define	TOVR_STP	0x00		/* 上限プロセッサ時間が設定されていない */
#define	TOVR_STA	0x01		/* 上限プロセッサ時間が設定されている */

/* (4) その他の定数 */

#define	TSK_SELF	(0)			/* 自タスク指定 */
#define	TSK_NONE	(0)			/* 該当するタスクが無い */
#define	TPRI_SELF	(0)			/* 自タスクのベース優先度の指定 */
#define	TPRI_INI	(0)			/* タスクの起動時優先度の指定 */
#ifndef NULL
#define	NULL		((void *)0)	/*無効ポインタ値*/
#endif
#ifndef TRUE
#define TRUE		(1)         /* 論理値の真 */
#endif
#ifndef FALSE
#define FALSE		(0)         /* 論理値の偽 */
#endif
#define	E_OK		(0)			/* 正常終了 */

#define TA_NULL		(0)			/* 特別な属性を指定しない */

/******************************************************************************
 * μITRON エラーコードの定義
 *****************************************************************************/

#define	E_SYS	(-5)	/* システムエラー */
#define	E_NOSPT	(-9)	/* 未サポート機能 */
#define	E_RSFN	(-10)	/* 予約機能コード */
#define	E_RSATR	(-11)	/* 予約属性 */
#define	E_PAR	(-17)	/* パラメータエラー */
#define	E_ID	(-18)	/* 不正ID番号 */
#define	E_CTX	(-25)	/* コンテキストエラー */
#define	E_MACV	(-26)	/* メモリアクセス違反 */
#define	E_OACV	(-27)	/* オブジェクトアクセス違反 */
#define	E_ILUSE	(-28)	/* サービスコール不正使用 */
#define	E_NOMEM	(-33)	/* メモリ不足 */
#define	E_NOID	(-34)	/* ID番号不足 */
#define	E_OBJ	(-41)	/* オブジェクト状態エラー */
#define	E_NOEXS	(-42)	/* オブジェクト未生成 */
#define	E_QOVR	(-43)	/* キューイングオーバーフロー */
#define	E_RLWAI	(-49)	/* 待ち状態の強制解除 */
#define	E_TMOUT	(-50)	/* ポーリング失敗またはタイムアウト */
#define	E_DLT	(-51)	/* 待ちオブジェクトの削除 */
#define	E_CLS	(-52)	/* 待ちオブジェクトの状態変化 */
#define	E_WBLK	(-57)	/* ノンブロッキング受付け */
#define	E_BOVR	(-58)	/* バッファオーバーフロー */

/******************************************************************************
	μITRON システムコール(C言語インターフェース)
 *****************************************************************************/

/* (1) タスク管理機能 */

#define CRE_TSK(tskid,tskatr,exinf,task,itskpri,stksz,stk,name)		\
	{(tskid),{(tskatr),(exinf),(task),(itskpri),(stksz),(stk),(name)}	},

/*KP_EXTERN	ER act_tsk ( ID tskid ) ;*/
/*KP_EXTERN	ER iact_tsk ( ID tskid ) ;*/
/*KP_EXTERN	ER_UINT can_act ( ID tskid ) ;*/
/*KP_EXTERN	ER sta_tsk ( ID tskid, VP_INT stacd ) ;*/
KP_EXTERN	void ext_tsk ( void ) ;
/*KP_EXTERN	ER ter_tsk ( ID tskid ) ;*/
KP_EXTERN	ER chg_pri ( ID tskid, PRI tskpri ) ;
KP_EXTERN	ER get_pri ( ID tskid, PRI *p_tskpri ) ;
KP_EXTERN	ER ref_tsk ( ID tskid, T_RTSK *pk_rtsk ) ;
KP_EXTERN	ER ref_tst ( ID tskid, T_RTST *pk_rtst ) ;

/* (2) タスク付属同期機能*/

KP_EXTERN	ER slp_tsk ( void ) ;
KP_EXTERN	ER tslp_tsk ( TMO tmout ) ;
KP_EXTERN	ER dly_tsk ( RELTIM dlytim ) ;
KP_EXTERN	ER wup_tsk ( ID tskid ) ;
KP_EXTERN	ER iwup_tsk ( ID tskid ) ;
KP_EXTERN	ER_UINT can_wup ( ID tskid ) ;
KP_EXTERN	ER rel_wai ( ID tskid ) ;
KP_EXTERN	ER irel_wai ( ID tskid ) ;

/*
//KP_EXTERN	ER sus_tsk ( ID tskid ) ;
//KP_EXTERN	ER rsm_tsk ( ID tskid ) ;
//KP_EXTERN	ER frsm_tsk ( ID tskid ) ;
*/


/* (3) タスク例外処理機能 */

/*
//KP_EXTERN	ER ras_tex ( ID tskid, TEXPTN rasptn ) ;
//KP_EXTERN	ER iras_tex ( ID tskid, TEXPTN rasptn ) ;
//KP_EXTERN	ER dis_tex ( void ) ;
//KP_EXTERN	ER ena_tex ( void ) ;
//KP_EXTERN	BOOL sns_tex ( void ) ;
*/

/* (4) 同期・通信機能 */

/*セマフォ*/

#define CRE_SEM(semid,sematr,isemcnt,maxsem,name)		\
	{(semid),{(sematr),(isemcnt),(maxsem),(name)}	},


KP_EXTERN	ER sig_sem ( ID semid ) ;
KP_EXTERN	ER isig_sem ( ID semid ) ;
KP_EXTERN	ER wai_sem ( ID semid ) ;
KP_EXTERN	ER pol_sem ( ID semid ) ;
KP_EXTERN	ER twai_sem ( ID semid, TMO tmout ) ;
KP_EXTERN	ER ref_sem ( ID semid, T_RSEM *pk_rsem ) ;



/* イベントフラグ */

#define CRE_FLG(flgid,flgatr,iflgptn,name)		\
	{(flgid),{(flgatr),(iflgptn),(name)}	},

KP_EXTERN	ER set_flg ( ID flgid, FLGPTN setptn ) ;
KP_EXTERN	ER iset_flg ( ID flgid, FLGPTN setptn ) ;
KP_EXTERN	ER clr_flg ( ID flgid, FLGPTN clrptn ) ;
KP_EXTERN	ER wai_flg ( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn ) ;
KP_EXTERN	ER pol_flg ( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn ) ;
KP_EXTERN	ER twai_flg ( ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout ) ;
KP_EXTERN	ER ref_flg ( ID flgid, T_RFLG *pk_rflg ) ;



/* データキュー */

#define CRE_DTQ(dtqid,dtqatr,dtqcnt,dtq,name)		\
	{(dtqid),{(dtqatr),(dtqcnt),(dtq),(name)}	},

KP_EXTERN	ER snd_dtq ( ID dtqid, VP_INT data ) ;
KP_EXTERN	ER psnd_dtq ( ID dtqid, VP_INT data ) ;
KP_EXTERN	ER ipsnd_dtq ( ID dtqid, VP_INT data ) ;
KP_EXTERN	ER tsnd_dtq ( ID dtqid, VP_INT data, TMO tmout ) ;
KP_EXTERN	ER fsnd_dtq ( ID dtqid, VP_INT data ) ;
KP_EXTERN	ER ifsnd_dtq ( ID dtqid, VP_INT data ) ;
KP_EXTERN	ER rcv_dtq ( ID dtqid, VP_INT *p_data ) ;
KP_EXTERN	ER prcv_dtq ( ID dtqid, VP_INT *p_data ) ;
KP_EXTERN	ER trcv_dtq ( ID dtqid, VP_INT *p_data, TMO tmout ) ;


/* メールボックス */

#define CRE_MBX(mbxid,mbxatr,maxmpr,mprihd,name)		\
	{(mbxid),{(mbxatr),(maxmpr),(mprihd),(name)}	},

KP_EXTERN	ER snd_mbx ( ID mbxid, T_MSG *pk_msg ) ;
KP_EXTERN	ER rcv_mbx ( ID mbxid, T_MSG **ppk_msg ) ;
KP_EXTERN	ER prcv_mbx ( ID mbxid, T_MSG **ppk_msg ) ;
KP_EXTERN	ER trcv_mbx ( ID mbxid, T_MSG **ppk_msg, TMO tmout ) ;
KP_EXTERN	ER ref_mbx ( ID mbxid, T_RMBX *pk_rmbx ) ;


/* (5) メモリプール管理機能 */


/* 固定長メモリプール */

#define CRE_MPF(mpfid,mpfatr,blkcnt,blksz,mpf,name)		\
	{(mpfid),{(mpfatr),(blkcnt),(blksz),(mpf),(name)}	},

KP_EXTERN	ER get_mpf ( ID mpfid, VP *p_blk ) ;
KP_EXTERN	ER pget_mpf ( ID mpfid, VP *p_blk ) ;
KP_EXTERN	ER tget_mpf ( ID mpfid, VP *p_blk, TMO tmout ) ;
KP_EXTERN	ER rel_mpf ( ID mpfid, VP blk ) ;
KP_EXTERN	ER ref_mpf ( ID mpfid, T_RMPF *pk_rmpf ) ;



/* (6) 時間管理機能 */


/* システム時刻管理 */
KP_EXTERN	ER set_tim ( SYSTIM *p_systim ) ;
KP_EXTERN	ER get_tim ( SYSTIM *p_systim ) ;

/* 周期ハンドラ */
#define CRE_CYC(cycid,cycatr,exinf,cychdr,cyctim,cycphs,name)		\
	{(cycid),{(cycatr),(exinf),(cychdr),(cyctim),(cycphs),(name)}	},

KP_EXTERN	ER sta_cyc ( ID cycid ) ;
KP_EXTERN	ER stp_cyc ( ID cycid ) ;


/* (7) システム状態管理機能 */
KP_EXTERN	ER rot_rdq ( PRI tskpri ) ;
KP_EXTERN	ER irot_rdq ( PRI tskpri ) ;
KP_EXTERN	ER get_tid ( ID *p_tskid ) ;
KP_EXTERN	ER iget_tid ( ID *p_tskid ) ;
/*KP_EXTERN	ER loc_cpu ( void ) ;*/
/*KP_EXTERN	ER iloc_cpu ( void ) ;*/
/*KP_EXTERN	ER unl_cpu ( void ) ;*/
/*KP_EXTERN	ER iunl_cpu ( void ) ;*/
KP_EXTERN	ER dis_dsp ( void ) ;
KP_EXTERN	ER ena_dsp ( void ) ;
KP_EXTERN	BOOL sns_ctx ( void ) ;
KP_EXTERN	BOOL sns_loc ( void ) ;
KP_EXTERN	BOOL sns_dsp ( void ) ;
KP_EXTERN	BOOL sns_dpn ( void ) ;
/*KP_EXTERN	ER ref_sys ( T_RSYS *pk_rsys ) ;*/

/* (8) 割込み管理機能 */
#define DEF_INH(inhno,inhatr,inthdr,name)		\
	{(inhno),{(inhatr),(inthdr),(name)}	},

KP_EXTERN	ER dis_int(INTNO intno);
KP_EXTERN	ER ena_int(INTNO intno);
KP_EXTERN	ER vchg_ifl ( IFL ifl );
KP_EXTERN	ER vget_ifl ( IFL *p_ifl );

/* (9) システム構成管理機能 */
#define ATT_INI(iniatr,exinf,inirtn)		\
	{(iniatr),(exinf),(inirtn)	},

KP_EXTERN	ER ref_ver ( T_RVER *pk_rver ) ;


#endif /*__ITRON_H__*/