/* ------------------------------------------------------------------------ */
/*  Hyper Operating System V4  μITRON4.0仕様 Real-Time OS                  */
/*    カーネル依存情報定義ヘッダ メッセージバッファ                         */
/*                                                                          */
/*                                  Copyright (C) 1998-2002 by Project HOS  */
/*                                  http://sourceforge.jp/projects/hos/     */
/* ------------------------------------------------------------------------ */


#ifndef __HOS_V4__knl_mbf_h__
#define __HOS_V4__knl_mbf_h__


#include "knl_hos.h"



/* ------------------------------------------ */
/*                  定数定義                  */
/* ------------------------------------------ */

/* IDの範囲 */
#define KERNEL_TMIN_MBFID	TMIN_MBFID			/* メッセージバッファIDの最小値 */
#define KERNEL_TMAX_MBFID	(KERNEL_TMIN_MBFID + kernel_mbfcb_cnt - 1)
												/* メッセージバッファIDの最大値 */



/* ------------------------------------------ */
/*                 型定義                     */
/* ------------------------------------------ */

/* メッセージバッファ生成情報 */
typedef struct t_cmbf
{
	ATR  mbfatr;		/* メッセージバッファ属性 */
	UINT maxmsz;		/* メッセージの最大サイズ(バイト数) */
	SIZE mbfsz;			/* メッセージバッファ領域のサイズ(バイト数) */
    VP   mbf;			/* メッセージバッファ領域の先頭番地 */
} T_CMBF;

/* メッセージバッファ状態情報 */
typedef struct t_rmbf
{
	ID   stskid;		/* メッセージバッファの送信待ち行列の先頭のタスクのID番号 */
	ID   rtskid;		/* メッセージバッファの受信待ち行列の先頭のタスクのID番号 */
	UINT smsgcnt;		/* メッセージバッファに入っているメッセージの数 */
	SIZE fmbfsz;		/* メッセージバッファ領域の空き領域のサイズ(バイト数、最低限の管理領域を除く) */
} T_RMBF;


/* メッセージバッファコントロールブロック(ROM部) */
typedef struct t_kernel_mbfcb_rom
{
	ATR  mbfatr;		/* メッセージバッファ属性 */
	UINT maxmsz;		/* メッセージの最大サイズ(バイト数) */
	SIZE mbfsz;			/* メッセージバッファ領域のサイズ(バイト数) */
    VP   mbf;			/* メッセージバッファ領域の先頭番地 */
} T_KERNEL_MBFCB_ROM;

/* メッセージバッファコントロールブロック(RAM部) */
typedef struct t_kernel_mbfcb_ram
{
	T_MKNL_QUE sndque;	/* メッセージバッファ送信待ちタスクキュー */
	T_MKNL_QUE rcvque;	/* メッセージバッファ受信待ちタスクキュー */
	SIZE       head;	/* 先頭メッセージの位置 */
	SIZE       fmbfsz;	/* メッセージバッファ領域の空きサイズ */
	UINT       smsgcnt;	/* メッセージバッファに入っているメッセージの数 */
	const T_KERNEL_MBFCB_ROM *mbfcb_rom;	/* メッセージバッファコントロールブロックROM部へのポインタ */
} T_KERNEL_MBFCB_RAM;

/* 送信メッセージデータ情報 */
typedef struct t_kernel_mbfdat
{
	UINT msgsz;			/* メッセージサイズ */
	VP   msg;			/* メッセージの先頭番地 */
} T_KERNEL_MBFDAT;



/* ---------------------------------- */
/*        グローバル変数宣言          */
/* ---------------------------------- */

/* メッセージバッファ管理 */
extern       T_KERNEL_MBFCB_RAM *kernel_mbfcb_ram_tbl[];	/* メッセージバッファコントロールブロックテーブル(RAM部) */
extern const INT kernel_mbfcb_cnt;							/* メッセージバッファコントロールブロック個数 */

/* メッセージバッファコントロールブロック変換マクロ */
#define KERNEL_MBFID_TO_MBFCB_RAM(mbfid)	(kernel_mbfcb_ram_tbl[(mbfid) - KERNEL_TMIN_MBFID])
															/* メッセージバッファIDからMBFCB RAMアドレスを取得 */



/* ------------------------------------------ */
/*                 マクロ定義                 */
/* ------------------------------------------ */

/* メモリ領域のサイズ */
#define TSZ_MBF(msgcnt, msgsz)		((SIZE)((UINT)(msgcnt) * ((UINT)(msgsz) + 2) + 1))



/* ------------------------------------------ */
/*                関数宣言                    */
/* ------------------------------------------ */

#ifdef __cplusplus
extern "C" {
#endif

/* メッセージバッファ */
void    kernel_ini_mbf(void);								/* メッセージバッファの初期化 */
ER      cre_mbf(ID mbfid, const T_CMBF *pk_cmbf);			/* メッセージバッファの生成 */
ER_ID   acre_mbf(const T_CMBF *pk_cmbf);					/* メッセージバッファの生成(ID番号自動割付け) */
ER      kernel_cre_mbf(ID mbfid, const T_CMBF *pk_cmbf);	/* メッセージバッファの生成(カーネル内部関数) */
ER      del_mbf(ID mbfid);									/* メッセージバッファの削除 */
ER      snd_mbf(ID mbfid, VP msg, UINT msgsz);				/* メッセージバッファへの送信 */
ER      psnd_mbf(ID mbfid, VP msg, UINT msgsz);				/* メッセージバッファへの送信(ポーリング) */
ER      tsnd_mbf(ID mbfid, VP msg, UINT msgsz, TMO tmout);	/* メッセージバッファへの送信(タイムアウトあり) */
ER      kernel_snd_mbf(const T_KERNEL_MBFCB_ROM *mbfcb_rom,
			T_KERNEL_MBFCB_RAM *mbfcb_ram, VP msg, UINT msgsz);	/* メッセージバッファへの送信(カーネル内部関数) */
ER_UINT rcv_mbf(ID mbfid, VP msg);							/* メッセージバッファからの受信 */
ER_UINT prcv_mbf(ID mbfid, VP msg);							/* メッセージバッファからの受信(ポーリング) */
ER_UINT trcv_mbf(ID mbfid, VP msg,  TMO tmout);				/* メッセージバッファからの受信(タイムアウトあり) */
ER_UINT kernel_rcv_mbf(const T_KERNEL_MBFCB_ROM *mbfcb_rom,
			T_KERNEL_MBFCB_RAM *mbfcb_ram, VP msg);			/* メッセージバッファからの受信(カーネル内部関数) */
ER      ref_mbf(ID mbfid, T_RMBF *pk_rmbf);					/* メッセージバッファの状態参照 */

#ifdef __cplusplus
}
#endif



#endif	/* __HOS_V4__knl_mbf_h__ */


/* ------------------------------------------------------------------------ */
/*  Copyright (C) 1998-2002 by Project HOS                                  */
/* ------------------------------------------------------------------------ */
