www.pudn.com > norti2.0 > NORTI.H
/******************************************************************************
* μITRON仕様OS NORTi標準ヘッダ *
* *
* File name : norti.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-20 Ver1.21 *
******************************************************************************/
#ifndef NORTI_H
#define NORTI_H
#ifdef __cplusplus
extern "C" {
#endif
/* 処理系の判別 */
#ifdef M_I86 /* MS-C */
#define NORTi86
#endif
#ifdef __TURBOC__ /* TURBO-C, BORLAND-C */
#ifdef __HUGE__
#error not supported model!
#else
#define NORTi86
#endif
#endif
#ifdef LSI_C80 /* LSIC-80 */
#define NORTi80
#endif
#ifdef _MCC68K /* MCC68K */
#define NORTi68K
#endif
#ifdef __TID__
#if ((__TID__&0x7f00)==0x0a00) /* ICC H8/300H */
#define NORTiH83
#else
#if ((__TID__&0x7f00)==0x1700) /* ICC Z80 */
#define NORTiZ80
#else
#error not supported CPU!
#endif
#endif
#endif
#ifdef __CPU__
#if (__CPU__==3)
#define NORTiH83 /* Hitachi C H8/300H */
#else
#error not supported CPU!
#endif
#endif
#ifdef __DCC__
#ifdef m68k /* D-CC/68K */
#define NORTi68K
#endif
#ifdef __ppc /* D-CC/PowerPC */
#define NORTiPPC
#endif
#endif
/* near, far キーワード */
#ifdef NORTi86
#define NEAR near
#define FAR far
#else /* NORTi/86 以外では */
#define NEAR /**/ /* NEAR, FAR を無効化 */
#define FAR /**/
#endif
/* cdecl, pascal キーワード */
#ifndef NORTi86 /* NORTi/86 以外では */
#define cdecl /**/ /* cdecl, pascal を無効化 */
#define pascal /**/
#endif
/* packed キーワード */
#ifndef _MCC68K /* MCC68K 以外では */
#define packed /**/ /* パック構造体指定を無効化 */
#endif
/************************************/
/* ユーザに依存する定数(NORTi独自)*/
/************************************/
#ifndef MSGS
#define MSGS 16 /* メッセージ長(バイト数) */
#endif
#ifndef MSEC
#define MSEC 10 /* タイマ周期 */
#endif /* wai_tsk(100/MSEC);の様に用いる */
/************************************/
/* データタイプの定義 */
/************************************/
/* 基本的なデータタイプ */
typedef char B; /* 符号付き8ビット整数 */
typedef long W; /* 符号付き32ビット整数 */
typedef unsigned char UB; /* 符号無し8ビット整数 */
typedef unsigned long UW; /* 符号無し32ビット整数 */
typedef char VB; /* タイプ不定データ(8ビットサイズ)*/
typedef long VW; /* タイプ不定データ(32ビットサイズ)*/
typedef void *VP; /* タイプ不定データへのポインタ */
typedef void (*FP)(void); /* プログラムのスタートアドレス一般 */
#if (defined(NORTi68K)||defined(NORTiPPC))
typedef short H; /* 符号付き16ビット整数 */
typedef unsigned short UH; /* 符号無し16ビット整数 */
typedef short VH; /* タイプ不定データ(16ビットサイズ)*/
#else
typedef int H;
typedef unsigned UH;
typedef int VH;
#endif
/* 整数(プロセッサのビット幅)*/
#if (defined(NORTi80)||defined(NORTiZ80))
typedef char INT;
typedef unsigned char UINT;
#elif (defined(NORTi68K))
typedef short INT;
typedef unsigned short UINT;
#else
typedef int INT;
typedef unsigned UINT;
#endif
/* 特殊な意味を持つデータタイプ */
#ifndef BOOL
typedef INT BOOL; /* ブール値(FALSE または TRUE)*/
#endif
typedef INT ID; /* オブジェクトのID */
typedef INT HNO; /* ハンドラ番号 */
typedef INT ER; /* エラーコード */
typedef UH TMO; /* タイムアウト */
typedef INT FN; /* 機能コード */
typedef INT TPRI; /* タスク優先度 */
/* 関数のデータタイプ(ITRON2互換) */
#ifdef __TID__ /* ICC では C_task 付加 */
#define TASK C_task void /* タスク */
#define INTHDR C_task void /* 割込みハンドラ */
#else
#define TASK void FAR /* タスク */
#define INTHDR void FAR /* 割込みハンドラ */
#endif
#define TMRHDR void FAR /* タイマハンドラ */
typedef void (FAR *TASKP)(void); /* タスクスタートアドレス */
typedef void (FAR *INTHDRP)(void); /* 割込みハンドラタートアドレス */
typedef void (FAR *TMRHDRP)(void); /* タイマハンドラタートアドレス */
/* メッセージパケット構造体 */
typedef struct t_msg
{ struct t_msg FAR *next; /* OS管理領域(次のメッセージへのポインタ)*/
VB msgcont[MSGS]; /* メッセージ本体 */
} T_MSG;
/* 時刻データの構造 */
typedef packed struct
{ UH ltime; /* 時刻指定(下位)*/
UH mtime; /* 時刻指定(中位)*/
UH utime; /* 時刻指定(上位)*/
} T_TIME;
/* バージョン管理情報の構造 */
typedef packed struct t_ver
{ UH maker; /* メーカー */
UH id; /* 形式番号 */
UH spver; /* 仕様書バージョン */
UH prver; /* 製品バージョン */
UH prno[4]; /* 製品管理情報 */
UH cpu; /* CPU情報 */
UH var; /* バリエーション記述子 */
} T_VER;
/************************************/
/* 共通定数の定義 */
/************************************/
/* 全体 */
#ifndef TRUE
#define TRUE 1 /* 真 */
#endif
#ifndef FALSE
#define FALSE 0 /* 偽 */
#endif
#ifdef NORTi86
#define NADR (-1L) /* アドレスやポインタ値が無効 */
#else
#define NADR (-1)
#endif
/* tskid */
#define TSK_SELF 0 /* 自タスク指定 */
/* tskpri */
#define TPRI_INI 0 /* タスク起動時の初期優先度を指定(chg_pri)*/
#define TPRI_RUN 0 /* その時実行中の最高優先度を指定(rot_rdq)*/
/* wtskid */
#define NOTSK 0 /* 待ちタスク無し */
/* tmmode */
#define TTM_ABS 0 /* 絶対時間での指定 */
#define TTM_REL 1 /* 相対時間での指定 */
/* tskstat */
#define TTS_RUN 0x01 /* RUN 状態 */
#define TTS_RDY 0x02 /* READY 状態 */
#define TTS_WAI 0x04 /* WAIT 状態 */
#define TTS_SUS 0x08 /* SUSPEND 状態 */
#define TTS_WAS 0x0c /* WAIT-SUSPEND 状態 */
#define TTS_DMT 0x10 /* DORMANT 状態 */
/* cyact */
#define TCY_OFF 0 /* 周期起動ハンドラが起動されない */
#define TCY_ON 1 /* 周期起動ハンドラが起動される */
#define TCY_INI 2 /* 周期起動ハンドラが初期化される */
/* wfmode */
#define TWF_ANDW 0x00 /* イベントフラグ AND 待ち */
#define TWF_ORW 0x02 /* イベントフラグ OR 待ち */
#define TWF_CLR 0x01 /* イベントフラグクリア指定 */
/* tmout */
#define TMO_FEVR ((TMO)-1) /* 永久待ち */
/************************************/
/* エラーコードの定義(ER 16ビット)*/
/************************************/
#ifndef NORTi80
#ifndef NORTiZ80
/* システムコール例外を発生しないクラス */
#define E_OK 0 /* 正常終了 */
/* システムエラー例外クラス */
#define E_SYS (-0x405) /* システムエラー */
/* メモリ不足エラー例外クラス */
#define E_NOSMEM (-0x509) /* システムメモリ不足 */
#define E_NOMEM (-0x50a) /* メモリ不足 */
/* 予約機能エラー例外クラス */
#define E_NOSPT (-0x611) /* 未サポート機能 */
#define E_INOSPT (-0x612) /* ITRON/FILEでの未サポート機能 */
#define E_TNOSPT (-0x613) /* タイマ関係の未サポート機能 */
#define E_RSFN (-0x614) /* 予約機能コード番号 */
#define E_RSSFN (-0x615) /* 予約サブ機能コード/予約デバイス番号 */
#define E_RSMD (-0x616) /* 予約モード, 予約オプション */
#define E_RSID (-0x617) /* 予約ID */
#define E_RSATR (-0x618) /* 予約属性 */
/* パラメータエラー例外クラス */
#define E_PAR (-0x721) /* 一般的なパラメータエラー */
#define E_ILADR (-0x722) /* 不正アドレス */
#define E_IDOVR (-0x723) /* ID範囲外 */
#define E_SZOVR (-0x724) /* パラメータのサイズが制限を超えた */
#define E_PPRI (-0x725) /* 不正プロセス優先度 */
#define E_TPRI (-0x726) /* 不正タスク優先度 */
#define E_ILTIME (-0x727) /* 不正時間指定 */
#define E_ILFN (-0x728) /* 不正機能コード番号 */
#define E_ILMSG (-0x729) /* 不正メッセージ形式 */
#define E_VECN (-0x72a) /* 不正ベクトル番号 */
#define E_IMS (-0x72b) /* 不正IMASK */
/* 不正オブジェクト指定例外クラス */
#define E_SELF (-0x831) /* 自タスク、自プロセスの指定 */
#define E_NOPRC (-0x832) /* プロセスがまだ存在していない */
#define E_EXS (-0x833) /* オブジェクトが既に存在している */
#define E_NOEXS (-0x834) /* オブジェクトが存在していない */
#define E_DMT (-0x835) /* タスクがDORMANTである */
#define E_NODMT (-0x836) /* タスクがDORMANTでない */
#define E_NOCYC (-0x837) /* タスクに対してcyc_wupが発行されていない */
#define E_NOSUS (-0x838) /* タスクがSUSPENDでない */
#define E_ILSEM (-0x839) /* セマフォに対する不正操作 */
#define E_ILAKEY (-0x83a) /* セマフォアクセスキーが不正 */
#define E_ILBLK (-0x83b) /* 不正メモリブロックの返却、操作 */
#define E_NOWAI (-0x83e) /* タスクが待ち状態でない */
#define E_OBJ (-0x83f) /* オフジェクト状態に関するその他のエラー */
/* コンテキストエラー例外クラス */
#define E_CTX (-0xa45) /* コンテキストエラー */
/* 実行時エラー例外クラス */
#define E_QOVR (-0xb49) /* キューイングのオーバフロー */
#define E_OOVR (-0xb4a) /* オブジェクト数のオーバフロー */
/* 実行終了時エラー例外クラス */
#define E_DLT (-0xc51) /* 待ちオブジェクトが削除された */
#define E_INIHDR (-0xc52) /* 初期化ハンドラエラー */
/* 待ち状態強制解除例外クラス */
#define E_TMOUT (-0xd55) /* タイムアウト */
#define E_RLWAI (-0xd56) /* 待ち状態強制解 */
/* 処理実行結果を示す例外クラス */
#define E_PLFAIL (-0xe59) /* ポーリング失敗 */
#define E_AROVR (-0xe5a) /* 用意した領域のサイズが小さすぎる */
#define E_MPURG (-0xe5b) /* メモリブロックが削除された */
#define E_MRELOC (-0xe5c) /* メモリブロックが再配置された */
#endif
#endif
/************************************/
/* エラーコードの定義(ER 8ビット) */
/************************************/
#ifndef E_OK
/* システムコール例外を発生しないクラス */
#define E_OK 0 /* 正常終了 */
/* システムエラー例外クラス */
#define E_SYS 0xfb /* システムエラー */
/* メモリ不足エラー例外クラス */
#define E_NOSMEM 0xf7 /* システムメモリ不足 */
#define E_NOMEM 0xf6 /* メモリ不足 */
/* 予約機能エラー例外クラス */
#define E_NOSPT 0xef /* 未サポート機能 */
#define E_INOSPT 0xee /* ITRON/FILEでの未サポート機能 */
#define E_TNOSPT 0xed /* タイマ関係の未サポート機能 */
#define E_RSFN 0xec /* 予約機能コード番号 */
#define E_RSSFN 0xeb /* 予約サブ機能コード/予約デバイス番号 */
#define E_RSMD 0xea /* 予約モード, 予約オプション */
#define E_RSID 0xe9 /* 予約ID */
#define E_RSATR 0xe8 /* 予約属性 */
/* パラメータエラー例外クラス */
#define E_PAR 0xdf /* 一般的なパラメータエラー */
#define E_ILADR 0xde /* 不正アドレス */
#define E_IDOVR 0xdd /* ID範囲外 */
#define E_SZOVR 0xdc /* パラメータのサイズが制限を超えた */
#define E_PPRI 0xdb /* 不正プロセス優先度 */
#define E_TPRI 0xda /* 不正タスク優先度 */
#define E_ILTIME 0xd9 /* 不正時間指定 */
#define E_ILFN 0xd8 /* 不正機能コード番号 */
#define E_ILMSG 0xd7 /* 不正メッセージ形式 */
#define E_VECN 0xd6 /* 不正ベクトル番号 */
#define E_IMS 0xd5 /* 不正IMASK */
/* 不正オブジェクト指定例外クラス */
#define E_SELF 0xcf /* 自タスク、自プロセスの指定 */
#define E_NOPRC 0xce /* プロセスがまだ存在していない */
#define E_EXS 0xcd /* オブジェクトが既に存在している */
#define E_NOEXS 0xcc /* オブジェクトが存在していない */
#define E_DMT 0xcb /* タスクがDORMANTである */
#define E_NODMT 0xca /* タスクがDORMANTでない */
#define E_NOCYC 0xc9 /* タスクに対してcyc_wupが発行されていない */
#define E_NOSUS 0xc8 /* タスクがSUSPENDでない */
#define E_ILSEM 0xc7 /* セマフォに対する不正操作 */
#define E_ILAKEY 0xc6 /* セマフォアクセスキーが不正 */
#define E_ILBLK 0xc5 /* 不正メモリブロックの返却、操作 */
#define E_NOWAI 0xc2 /* タスクが待ち状態でない */
#define E_OBJ 0xc1 /* オフジェクト状態に関するその他のエラー */
/* コンテキストエラー例外クラス */
#define E_CTX 0xbb /* コンテキストエラー */
/* 実行時エラー例外クラス */
#define E_QOVR 0xb7 /* キューイングのオーバフロー */
#define E_OOVR 0xb6 /* オブジェクト数のオーバフロー */
/* 実行終了時エラー例外クラス */
#define E_DLT 0xaf /* 待ちオブジェクトが削除された */
#define E_INIHDR 0xae /* 初期化ハンドラエラー */
/* 待ち状態強制解除例外クラス */
#define E_TMOUT 0xab /* タイムアウト */
#define E_RLWAI 0xaa /* 待ち状態強制解 */
/* 処理実行結果を示す例外クラス */
#define E_PLFAIL 0xa7 /* ポーリング失敗 */
#define E_AROVR 0xa6 /* 用意した領域のサイズが小さすぎる */
#define E_MPURG 0xa5 /* メモリブロックが削除された */
#define E_MRELOC 0xa4 /* メモリブロックが再配置された */
#endif
/************************************/
/* システムコール関数宣言 */
/************************************/
/* システム起動等 */
void FAR pascal sysini(void);
ER FAR pascal syssta(void);
ER FAR pascal cre_tsk(ID, TASKP, TPRI, UH);
ER FAR pascal xcre_tsk(ID, TASKP, TPRI, UH, void FAR *);
void FAR pascal intent(void);
/* タスク管理機能 */
ER FAR pascal sta_tsk(ID);
void FAR pascal ext_tsk(void);
ER FAR pascal ter_tsk(ID);
ER FAR pascal chg_pri(ID, TPRI);
ER FAR pascal rot_rdq(TPRI);
ER FAR pascal rel_wai(ID);
ER FAR pascal get_tid(ID FAR *);
ID FAR pascal vget_tid(void);
ER FAR pascal tsk_sts(UINT FAR *, TPRI FAR *, ID);
#define ichg_pri chg_pri
#define irot_rdq rot_rdq
#define irel_wai rel_wai
/* タスク付属同期機能 */
ER FAR pascal sus_tsk(ID);
ER FAR pascal rsm_tsk(ID);
ER FAR pascal frsm_tsk(ID);
ER FAR pascal slp_tsk(void);
ER FAR pascal wai_tsk(TMO);
ER FAR pascal wup_tsk(ID);
ER FAR pascal can_wup(INT FAR *, ID);
void FAR pascal vcan_wup(void);
#define isus_tsk sus_tsk
#define irsm_tsk rsm_tsk
#define iwup_tsk wup_tsk
/* 同期・通信機能(1ビットイベントフラグ)*/
#ifndef WFLG
ER FAR pascal set_flg(ID);
ER FAR pascal clr_flg(ID);
ER FAR pascal wai_flg(ID);
ER FAR pascal cwai_flg(ID);
ER FAR pascal pol_flg(ID);
ER FAR pascal cpol_flg(ID);
#define iset_flg set_flg
#endif
/* 同期・通信機能(1ワードイベントフラグ)*/
ER FAR pascal set_wflg(ID, UINT);
ER FAR pascal clr_wflg(ID, UINT);
ER FAR pascal wai_wflg(UINT FAR *, ID, UINT, UINT);
ER FAR pascal pol_wflg(UINT FAR *, ID, UINT, UINT);
ER FAR pascal flg_sts(ID FAR *, UINT FAR *, ID);
#define iset_wflg set_wflg
#ifdef WFLG
#define set_flg set_wflg
#define clr_flg clr_wflg
#define wai_flg wai_wflg
#define pol_flg pol_wflg
#define iset_flg set_wflg
#endif
/* 同期・通信機能(セマフォ)*/
ER FAR pascal sig_sem(ID);
ER FAR pascal wai_sem(ID);
ER FAR pascal preq_sem(ID);
ER FAR pascal sem_sts(ID FAR *, INT FAR *, ID);
#define isig_sem sig_sem
/* 同期・通信機能(メイルボックス)*/
#ifndef NOKNL_C
ER FAR pascal snd_msg(ID, void FAR *);
ER FAR pascal rcv_msg(void FAR *, ID);
ER FAR pascal prcv_msg(void FAR *, ID);
ER FAR pascal mbx_sts(ID FAR *, void FAR *, ID);
#endif
#define isnd_msg snd_msg
/* 割込み管理機能(NORTi独自)*/
#ifdef NORTiPPC
#define ent_int() asm("\tstwu\tr0,-4(r1)\n\tmflr\tr0\n\tstwu\tr0,-4(r1)\n\tbl\tent_int")
#else
void FAR pascal ent_int(void);
#endif
UINT FAR pascal vdis_psw(void);
void FAR pascal vset_psw(UINT);
void FAR cdecl intini(void);
void cdecl intsta(void);
void cdecl intext(void);
/* 割込み管理機能 */
void FAR pascal ret_int(void);
void FAR pascal ret_wup(ID);
ER FAR pascal chg_ims(UINT);
ER FAR pascal ims_sts(UINT FAR *);
ER pascal def_int(UINT, INTHDRP);
ER pascal dis_int(UINT);
ER pascal ena_int(UINT);
/* メモリプール管理機能 */
#ifndef NOKNL_C
ER FAR pascal get_blk(void FAR *, ID);
ER FAR pascal pget_blk(void FAR *, ID);
#endif
ER FAR pascal rel_blk(ID, void FAR *);
ER FAR pascal mpl_sts(ID FAR *, int FAR *, ID);
/* 時間管理・タイマハンドラ機能 */
ER FAR pascal set_tim(T_TIME);
ER FAR pascal get_tim(T_TIME FAR *);
ER FAR pascal def_cyc(HNO, TMRHDRP, UINT, T_TIME);
ER FAR pascal act_cyc(HNO, UINT);
ER FAR pascal cyh_sts(UINT FAR *, T_TIME FAR *, HNO);
ER FAR pascal def_alm(HNO, TMRHDRP, T_TIME, UINT);
ER FAR pascal alh_sts(T_TIME FAR *, HNO);
#define ret_tmr() return
/* システム管理機能 */
ER FAR pascal get_ver(T_VER FAR *);
/* オブジェクト・モニタ機能(NORTi独自)*/
void cdecl monsta(void);
void cdecl monext(void);
BOOL cdecl set_montsk(ID);
BOOL cdecl set_monflg(ID);
BOOL cdecl set_monsem(ID);
BOOL cdecl set_monmbx(ID);
BOOL cdecl set_monmpl(ID);
#ifndef NOMON_C
extern B NEAR cdecl monbuf[2]; /* 仮に[2] */
#endif
/* その他(NORTi独自)*/
#ifdef NORTi86
void FAR pascal sysini_rom(void);
int FAR pascal ent_int2(void);
void FAR pascal vdis_pic(void);
void FAR pascal vena_pic(void);
void FAR pascal out_usrsig(BOOL on);
void cdecl intsta2(void);
BOOL cdecl judgepc(void);
BOOL cdecl ispc9801(void);
BOOL cdecl isibmpc(void);
BOOL cdecl isfmr(void);
extern UB NEAR cdecl CodeView;
#endif
#if (defined(NORTi80)||defined(NORTiZ80))
void set_mode2(void *);
#endif
/************************************/
/* システム変数宣言(NORTi独自) */
/************************************/
extern ID NEAR cdecl tskid_max; /* タスクID上限 */
extern ID NEAR cdecl flgid_max; /* イベントフラグID上限 */
extern ID NEAR cdecl semid_max; /* セマフォID上限 */
extern ID NEAR cdecl mbxid_max; /* メイルボックスID上限 */
extern ID NEAR cdecl mplid_max; /* メモリプールID上限 */
extern HNO NEAR cdecl cyhno_max; /* 周期起動ハンドラ番号上限 */
extern HNO NEAR cdecl alhno_max; /* アラームハンドラ番号上限 */
extern TPRI NEAR cdecl tpri_max; /* タスク優先度上限 */
extern int NEAR cdecl istksz; /* 割り込みハンドラのスタックサイズ */
#ifdef __cplusplus
};
#endif
#endif /* NORTI_H */