www.pudn.com > norti2.0 > NOSYS.H


/****************************************************************************** 
* μITRON仕様OS NORTisystem内部定義ヘッダ                       * 
*                                                                             * 
*  File name : nosys.h                                                        * 
*  Copyright (c) Miyazaki System Planning Office. 1991-1995                   * 
*                                                                             * 
* 91-10-25 TRCOM Version                                                      * 
* 92-02-16 Ver1.00                                                            * 
* 92-08-20 Ver1.10                                                            * 
* 93-01-18 Ver1.11                                                            * 
* 93-02-17 Ver1.12                                                            * 
* 93-05-16 Ver1.13β                                                          * 
* 94-01-05 Ver1.14                                                            * 
* 95-06-15 Ver1.20                                                            * 
* 95-09-12 Ver1.21                                                            * 
******************************************************************************/ 
 
#ifndef	NOSYS_H 
#define	NOSYS_H 
 
#ifndef	NORTI_H 
#include "norti.h" 
#endif 
 
#ifdef __cplusplus 
extern "C" { 
#endif 
 
/* kenel内部にaccessする場合に #include してください。 */ 
/* ただし、ここに定義されている内容については、version upにより互換性 */ 
/* が損われる可能性があります。 */ 
/* nocfg.h, noknl.c, nomon.c から #include されています。 */ 
 
/************************************/ 
/* CPUに依存する定数等の定義		*/ 
/************************************/ 
#ifdef	NORTi86 
 
/* 退避contextの構造(noknl.c からは r0, pc のみ参照)*/ 
 
typedef struct 
{ 
	int stkhqq;					/* MS-Cのstack管理変数 */ 
	int es; 
	int ds; 
	int di; 
	int si; 
	int bp; 
	int sp; 
	int bx; 
	int dx; 
	int cx; 
	int r0;						/* 戻値register(AX)*/ 
	int filler[2];				/* 空き */ 
	TASKP pc;					/* program counter(CS:IP)*/ 
	int flag; 
 
} T_CTX; 
 
/* 構造体sizeを2の累乗に整える定数 */ 
 
#define	FLG_FILLER	2			/* event flag調整size */ 
#define	SEM_FILLER	2			/* semaphore調整size */ 
#define	MBX_FILLER	4			/* mailbox調整size */ 
#define	RDQ_FILLER	0			/* ready queueヘッダ調整size */ 
 
#endif 
 
/* 86以外の定義の読込み */ 
 
#ifdef	NORTi80 
#include "norz80.h" 
#endif 
#ifdef	NORTiZ80 
#include "norz80.h" 
#endif 
#ifdef	NORTi68K 
#include "nor68k.h" 
#endif 
#ifdef	NORTiH83 
#include "norh83.h" 
#endif 
#ifdef	NORTiPPC 
#include "norppc.h" 
#endif 
 
/************************************/ 
/* object等の構造体の定義		*/ 
/************************************/ 
 
/* TCBの構造(注:ltimeまでT_TMRと同じ構造) */ 
 
typedef packed struct t_tcb 
{ 
	struct t_tcb NEAR *next;	/* 次のTCB/timerへのpointer */ 
	struct t_tcb NEAR *prev;	/* 前のTCB/timerへのpointer */ 
	void NEAR *que;				/* 待ち行列ヘッダへのpointer */ 
	TASKP ipc;					/* task  start  address  */ 
	UINT sts;					/* task 状態 flag  */ 
	ID tid;						/* task ID */ 
	UH ltime;					/* 起動時刻(下位)*/ 
	TPRI pri;					/* task 優先度 */ 
	TPRI ipri;					/* task 初期優先度 */ 
	UINT waiptn;				/* event flag待ちpattern */ 
	INT wupcnt;					/* 起床要求count */ 
	INT suscnt;					/* 強制待ち要求count */ 
	UINT FAR *arg;				/* 退避引数 */ 
  #ifdef NORTi86 
	int stktop;					/* stack先頭offset address (NORTi/86)*/ 
  #else 
	B FAR *stktop;				/* stack先頭 address (その他)*/ 
  #endif 
	T_CTX FAR *isp;				/* 初期stack pointer */ 
	T_CTX FAR *sp;				/* 退避stack pointer */ 
 
} T_TCB; 
 
/* timerの構造 */ 
 
typedef packed struct t_tmr 
{ 
	struct t_tmr NEAR *next;	/* 次のTCB/timerへのpointer */ 
	struct t_tmr NEAR *prev;	/* 前のTCB/timerへのpointer */ 
	void NEAR *que;				/* 時間待ちqueueヘッダへのpointer */ 
	TMRHDRP ipc;				/* timer handler start  address  */ 
	UINT sts;					/*  handler状態 flag  */ 
	ID tid;						/* 未使用(0) */ 
	UH ltime;					/* 起動時刻(下位)*/ 
	UH mtime;					/* 起動時刻(中位)*/ 
	UH utime;					/* 起動時刻(上位)*/ 
	UH defltime;				/* 定義された起動時間/時刻(下位)*/ 
	UH defmtime;				/* 定義された起動時間/時刻(中位)*/ 
	UH defutime;				/* 定義された起動時間/時刻(上位)*/ 
 
} T_TMR; 
 
/* event flagの構造 */ 
 
typedef packed struct 
{ 
	T_TCB NEAR *head;			/* 先頭TCBへのpointer */ 
	INT qcnt;					/* 待ちtask 数 */ 
	UINT ptn;					/*  flag pattern */ 
  #if FLG_FILLER 
	VB filler[FLG_FILLER];		/* (size調整) */ 
  #endif 
 
} T_FLG; 
 
/* semaphoreの構造 */ 
 
typedef packed struct 
{ 
	T_TCB NEAR *head;			/* 先頭TCBへのpointer */ 
	INT qcnt;					/* 待ちtask 数 */ 
	INT cnt;					/* semaphore count */ 
  #if SEM_FILLER 
	VB filler[SEM_FILLER];		/* (size調整) */ 
  #endif 
 
} T_SEM; 
 
/* mailboxの構造 */ 
 
typedef packed struct 
{ 
	T_TCB NEAR *head;			/* 先頭TCBへのpointer */ 
	INT qcnt;					/* 待ちtask 数 */ 
  #if MBX_FILLER 
	VB filler[MBX_FILLER];		/* (size調整) */ 
  #endif 
	T_MSG FAR *top;				/* 先頭 messageへのpointer */ 
	T_MSG FAR *end;				/* 末尾 messageへのpointer */ 
 
} T_MBX; 
 
/* memory poolの構造 */ 
 
typedef packed struct 
{ 
	T_TCB NEAR *head;			/* 先頭TCBへのpointer */ 
	INT qcnt;					/* 待ちtask 数 */ 
	int frbcnt;					/* 空きブロック数 */ 
	void FAR *top;				/* 先頭blockへのpointer */ 
 
} T_MPL; 
 
/* ready queueヘッダの構造 */ 
 
typedef packed struct 
{ 
	T_TCB NEAR *head;			/* 先頭TCBへのpointer */ 
	INT qcnt;					/* 待ちtask 数 */ 
  #if RDQ_FILLER 
	VB filler[RDQ_FILLER];		/* (size調整) */ 
  #endif 
 
} T_RDQ; 
 
/************************************/ 
/* 定数の定義						*/ 
/************************************/ 
 
/* task / handler状態 flag の構成 */ 
 
#define	S_HDR		0x80		/* timer handler */ 
#define	S_ALM		0x08		/* alarm handler */ 
#define	S_CYC		0x04		/* 周期起動 handler */ 
#define	S_ACT		0x01		/* 周期起動 handler活性(= TCY_ON) */ 
 
#define	S_SLP		0x40		/* 単純待機(slp_tsk) */ 
#define	S_QUE		0x3f		/* 何らかの待ち行列に繋がれた状態 */ 
#define	S_RDY		0x20		/* READY状態(RUNを含む)*/ 
#define	S_WAI		0x10		/* 時間待ち(wai_tsk)*/ 
#define	S_MPL		0x08		/* memory block待ち(get_blk)*/ 
#define	S_FLG		0x04		/* event flag待ち(wai_flg)*/ 
#define	S_ORW		0x02		/* OR待ち(1)/AND待ち(0)(= TWF_ORW)*/ 
#define	S_CLR		0x01		/* clear あり(= TWF_CLR)*/ 
#define	S_SEM		0x02		/* semaphore待ち(wai_sem) */ 
#define	S_MBX		0x01		/*  message待ち(rcv_msg) */ 
#define	S_DMT		0x00		/* DORMANT状態(NON-EXISTENTを含む)*/ 
 
/************************************/ 
/* objectの定義				*/ 
/************************************/ 
 
/* system用object定数(〜0)*/ 
 
#define	TSKID_MIN	0			/* task ID下限 */ 
#define	FLGID_MIN	0			/* event flagID下限 */ 
#define	SEMID_MIN	0			/* semaphoreID下限 */ 
#define	MBXID_MIN	0			/* mailboxID下限 */ 
#define	MPLID_MIN	0			/* memory poolID下限 */ 
#define	CYHNO_MIN	0			/* 周期起動 handler番号下限 */ 
#define	ALHNO_MIN	0			/* alarm handler番号下限 */ 
 
/* object */ 
/* MCC68K 最適化のため、[2]で配列宣言 */ 
 
#ifndef	NOCFG_H 
extern T_TCB NEAR cdecl _TCB[2]; 
extern T_FLG NEAR cdecl _FLG[2]; 
extern T_SEM NEAR cdecl _SEM[2]; 
extern T_MBX NEAR cdecl _MBX[2]; 
extern T_MPL NEAR cdecl _MPL[2]; 
extern T_TMR NEAR cdecl _CYH[2]; 
extern T_TMR NEAR cdecl _ALH[2]; 
extern T_RDQ NEAR cdecl RDQ[2]; 
extern T_RDQ NEAR cdecl TMQ[256]; 
extern T_TCB NEAR * NEAR cdecl _pTCB[2]; 
extern T_MPL NEAR * NEAR cdecl _pMPL[2]; 
extern T_TMR NEAR * NEAR cdecl _pCYH[2]; 
extern T_TMR NEAR * NEAR cdecl _pALH[2]; 
#endif 
 
/* 上記配列access用macro  */ 
 
#define	TCB		(_TCB-(TSKID_MIN)) 
#define	FLG		(_FLG-(FLGID_MIN)) 
#define	SEM		(_SEM-(SEMID_MIN)) 
#define	MBX		(_MBX-(MBXID_MIN)) 
#define	MPL		(_MPL-(MPLID_MIN)) 
#define	CYH		(_CYH-(CYHNO_MIN)) 
#define	ALH		(_ALH-(ALHNO_MIN)) 
 
#define	pTCB	(_pTCB-(TSKID_MIN)) 
#define	pMPL	(_pMPL-(MPLID_MIN)) 
#define	pCYH	(_pCYH-(CYHNO_MIN)) 
#define	pALH	(_pALH-(ALHNO_MIN)) 
 
/* count値上限(1〜UINTの上限,-1で最大) */ 
 
#define	WUPCNT_MAX	(-1)		/* 起床要求count値上限 */ 
#define	SUSCNT_MAX	(-1)		/* 強制待ち要求count値上限 */ 
#define	SEMCNT_MAX	(-1)		/* semaphore count値上限 */ 
 
/************************************/ 
/* その他kenel内部変数の宣言		*/ 
/************************************/ 
 
extern T_VER FAR cdecl NORTI_VER;	/* version */ 
 
extern T_TIME NEAR cdecl SYSCLK;	/* system clock */ 
extern T_CTX NEAR cdecl CTX;		/* 初期context */ 
extern UINT NEAR cdecl IMASK;		/* 中断mask flag  */ 
extern B NEAR cdecl INEST;			/* 中断nest counter(減count)*/ 
extern B NEAR cdecl DELAY;			/* 遅延dispatch 要求 flag  */ 
extern TPRI NEAR cdecl NOWPRI;		/* 現在のtask 優先度 */ 
extern UH NEAR cdecl IDLE_LOOP_CNT;	/* idle loop counter */ 
extern ER NEAR cdecl SYSER;			/* system error code   */ 
extern B FAR * NEAR cdecl USP;		/* user  stack pointer値 */  
extern B FAR * NEAR cdecl ISP;		/* 中断stack pointer初期値 */ 
 
#ifdef NORTiH83 
extern UW NEAR cdecl STKLEN;		/* 残りstack長(NORTi/H83)*/ 
#else 
extern unsigned NEAR cdecl STKLEN;	/* 残りstack長(その他)*/ 
#endif 
 
#ifdef	OLDVER 
extern INT near cdecl TSKCNT;		/* 起動されたtask 数(旧仕様)*/ 
#endif 
 
#ifdef __cplusplus 
}; 
#endif 
 
#endif