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