

			 ITRON 構築マニュアル
			 ====================


			 
			       		内藤隆一 ggc00661@niftyserve.or.jp



  --------------------------------------------------------------------------
  変更履歴
  
  Version 0.1 (1994/12/4)       初版
  Version 0.2 (1995/1/2)        プレーンテキスト版

  $Log: itron.text,v $
  Revision 1.1  2011/12/27 17:13:36  liu1
  Initial Version.

  Revision 1.4  1995-11-05 01:25:41  night
  改行コードを UNIX 形式に合わせた。

  Revision 1.3  1995/11/01  14:08:23  night
  ファイルを CVS にて管理するように設定した。


  本ドキュメントに記述している ITRON は、μ ITRON 3.0 仕様を基にしたも
  のです。μ ITRON 3.0 自体についての詳細な内容は、(株)パーソナルメディ
  アが出版している「μ ITRON 3.0 標準ハンドブック」を参考にしてくださ
  い。
  --------------------------------------------------------------------------





------------------------------------------------------------------------------
  1 はじめに (本ドキュメントの内容)
------------------------------------------------------------------------------


本ドキュメントは、B-Free/OS の中心核となる ITRON についての情
報を記述したものです。

B-Free OS を作成するときの ITRON(中心核) のコンパイルする方法および中心核
の上に載るプログラム(周辺核等)をどのように中心核と一緒に動かすのかという方法
が書いてあります。

以下に続く本ドキュメントの構成は以下のとおりです。

  2. ITRON の make 方法
  3. ITRON 上に載るアプリケーションの作成方法
  4. ITRON で使用できるシステムコールおよびライブラリ関数



------------------------------------------------------------------------------
  2 ITRON の make 方法
------------------------------------------------------------------------------


2.1 ディレクトリ構成

B-Free / OS のソース環境は以下のディレクトリ構造になっています。


ソース環境のトップディレクトリ
------------------------------

 	boot	ブートプログラムのソースです
    	kernel  中心核(ITRON)および周辺核のソースが
		入っています
                kernelディレクトリは更に次のディレクトリに分かれていま
		す。

                btron		BTRON API を提供するための周辺核(群)が
				入ります。
                device		デバイスドライバ群のソースが入ります。
                itron-3.0	中心核(ITRON)のソースが入ります。
		kernlib		中心核のシステムコールを呼び出すための 
                                ライブラリ関数が入ります。
		make		カーネルを作成するためのディレクトリで
				す。
                posix		POSIX 互換サーバが入ります。
		servers		外核を構成するサーバ群が入るところです。

     lib	ユーザライブラリが入るディレクトリです。
                ライブラリの種類としては、以下のものが入る予定です。

		itron		中心核へのネイティブなシステムコール関
                                数が入ります。
		posix		POSIX準拠の関数群が入ります。
                                UN*X 系のソフトウェア用です
		standard	標準的な関数が入ります。
		syscall		システムコールとのインタフェースルーチ
                                ンが入ります。今のところusyscall.sが入
                                っているだけです。
		window		ウィンドウマネージャ関連の関数が入りま
                                す。
     tool	ツールプログラムが入ります。
                今のところ使っているツールは kp だけです。

		bin86		8086 系のアセンブラ/リンカが入る予定で
                                す。
		fdformat	BTRON/FD 形式で FD をフォーマットする
                                ためのコマンドです。
                                まだ、完成していません。
		kp              文字列/文字を EUC で書いた C のプログ
                                ラムを TRON コード形式に直してコンパイ
                                ルするプリプロセッサです。このプリプロ
                                セッサを通したCのソースをコンパイルし
                                ます。


2.1 make の準備

ITRON を make する前に、ツールプログラム kp をセットアップしてく
ださい。

kp の make は以下の手順で行います。

  カレントディレクトリを btron/src/tool/kp ディレクトリに(cd コマン
  ドで)移します。
  make コマンドを実行してください。
  kp というファイルができていれば完成です。

2.2 make の実行


今の環境では boot と ITRON そして portmanager が作成できます。
作成は以下の順序で行ってください。

B-Free OS の Make には、Z format が作成できる ld が必要です。
(その ld は、/usr/local/bin に入っている必要があります)

B-Free OS の make 方法

トップディレクトリにて、make を実行してください。

ブートプログラム/OS イメージをそれぞれ別の FD に落としてください。

	cp $TOP/src/boot/boot.image /dev/fd0
	cp $TOP/src/kernel/make/btron /dev/fd0

/dev/fd0 には、1200KB の PC9801 フォーマット (512バイト/ブロック) の
FD ドライバを指定してください。




------------------------------------------------------------------------------
  3. 周辺核とのリンク
------------------------------------------------------------------------------


本章では、ITRON を使って応用プログラムを載せるための方法について記述し
ます。応用プログラムの例としては、B-Free の周辺核などがあります(という
より、こっちが本題)。 


3.1 立ち上げ処理

ブートは次のような順序で行います。


(1) IPL                             BOOT を読み込む 
(2) BOOT                            ヘッダを読み込む
(3) BOOT                            ヘッダに書かれているモジュールを読
                                    み込む 
(4) KERNEL                          ヘッダの順序にモジュールの初期化 
                                    (起動)ルーチンを呼び出す 
(5) 中心核/周辺核/デバイスドライバ  初期化ルーチンの実行



BOOT プログラムは、中心核と周辺核をまとめてひとつの固まりにしたものを
読み込みます。

この章では、BOOT プログラムが読み込むファイルをどのようにして作成する
かについて説明します。


3.2 周辺核とのリンク方法


中心核と周辺核は、別個に make します。

boot するためには、これをひとつにまとめるための作業が必要になります。
この作業は、build コマンド (src/kernel/make/build) が行います。

build コマンドは、config.tab というファイルを元に boot が読み込み可能
な形式のファイルを作成します。

config.tab には、中心核や周辺核をどのように配置するかを記述してありま
す。

  BTRON カーネルの構築方法
  ========================

  <中心核>   <デバイスドライバ>    <周辺核>  config.tab
      |               |                |         |
      |               |                |         |
      +---------------+----------------+     config.pl
                      |                          |
                      |                          |
                    build  <---------------- config.c
                      |
                      |
                    btron


3.2.1 リンク記述ファイル


  リンク記述ファイルの内容
  ========================

  # 註釈 (行の中で # 以下は註釈であり解釈されない)
  # ファイル名                    仮想アドレス  物理アドレス    モード
  ../itron-3.0/make/itron.image	  0x80010000	0x010000	kernel  "kernel"
  ../servers/port-manager	  0x00010000	0x100000	kernel "port-manager"


リンク記述ファイルには、次の内容が入ります。

モジュールの種類  ここでは、リンクするプログラムをモジュールと呼びます。
                  モジュールの種類としては、カーネル(kernel)(このモジュー
                  ルのみひとつしかない)/マネージャ(manager)/ドライバ
                  (driver)/ユーザプログラム (user)(外核も含む)のうちひ
                  とつを指定します。

ファイル名        モジュールの中身が入っているファイルを指定します。

オプション        モジュールの挙動を細かく指定する時に使用します。


モジュールは、リンク記述ファイルに書いてある順番で起動します。

カーネルについては、必ず config.tab の一番最初のエントリに書いてくださ
い。




------------------------------------------------------------------------------
  4 ライブラリ
------------------------------------------------------------------------------


4.1 データ型


4.1.1 基本データ型


ITRON を使用する場合の基本データ型は次のとおり。

 型名   型              		意 味
  B     char    		符号付き 8 ビット整数 
  H     short   		符号付き 16 ビット整数
  W     long    		符号付き 32 ビット整数
  UB    unsigned char   	符号なし 8 ビット整数
  UH    unsigned short  	符号なし 16 ビット整数
  UW    unsigned long   	符号なし 32 ビット整数
  VW    long            	
  VH    short           
  VB    char            
  VP    void *          	タイプなしポインタ
  FP    void (*)()      	関数ポインタ
  INT   int     		int 型(コンパイラの自然な整数)
  UINT  unsigned int    	
  BOOL  enum {			Boolean 型
	 FALSE=0, TRUE=1 
	}
  FN    short   		関数番号
  ID    int     		ID 型
  BOOL_ID      int     
  HNO   int     
  RNO   int     
  NODE  int     
  ATR   unsigned int    	アトリビュート型
  ER    int     
  PRI   int     
  TMO   int     
  TCODE UH               	TRON 文字コード



4.1.2 ITRON 核で定義しているデータ型


4.1.3 BTRON 周辺核で定義しているデータ型



4.2 システムコール

4.2.1 タスク管理

タスク管理関係のシステムコールは、表 に示すとお
りです。

システムコール名                機能
   can_wup              タスクの起床要求を無効化 
   cre_tsk              タスクの生成 
   chg_pri              プライオリティの変更 
   dis_dsp              ディスパッチ禁止 
   ena_dsp              ディスパッチ許可 
   ext_tsk              自タスク終了 
   exd_tsk              自タスク終了と削除 
   frsm_tsk             強制待ち状態のタスクから待ち状態を解除(多重の
                        待ち状態用) 
   get_tid              自タスクのタスク ID 参照 
   ref_tsk              タスク状態の参照 
   rot_rdq              同一プライオリティでのタスクの順序を変更する 
   rsm_tsk              強制待ち状態のタスクから待ち状態を解除 
   slp_tsk              自タスクを待ち状態にする 
   sta_tsk              タスクの起動 
   sus_tsk              指定したタスクを強制待ち状態に移行 
   ter_tsk              他タスク強制終了 
   wup_tsk              指定されたタスクを起床する


4.2.1.1 タスク管理情報

  タスクを管理する情報としては次のものがある。

  o タスク ID
  o タスク属性
  o タスク状態
  o タスク待ち要因
  o タスク優先度
  o 仮想メモリ管理テーブル
  o カーネルスタック
  o IPC (Inter process communication) 用の情報
  o 例外処理ハンドラテーブル


タスク ID

タスク ID は、各タスクを識別するための情報です。タスク ID は、各タスク
ごとにユニークな番号が割り当てられます。
本 ITRON では、タスク情報の配列のインデックスとなっています。
μ ITORN 3.0 仕様に従い、タスク ID 0 は、自分自身のタスクを表わします。 


タスク属性

タスク属性は、タスクを記述する言語が何であるかを示す情報です。
この情報は μITRON3.0 仕様によって決められているものです。
本 ITRON では、アセンブラと高級言語で記述されたことの区別はつけないた
め、常に高級言語で記述した場合の値(TA_HLNG)が入ります。


タスク状態

タスク状態は、現在のタスクの状態を示します。
タスクの状態は、次に示す値のどれかになっています(マクロ名を示す。括弧
内は、実際の値)。

  TTS_NON(0x00000000):  未生成状態  
  TTS_RUN(0x00000001):  走行状態。この値を示すタスクは、常にシステム内
                        で1つだけである 
  TTS_RDY(0x00000002):  走行可能状態 
  TTS_WAI(0x00000004):  待ち状態。自分でイベントを待つことを指定した場
                        合にこの値をもつ 
  TTS_SUS(0x00000008):  強制待ち状態。他のタスクから強制的に待ち状態に
                        された場合、この値をもつ 
  TTS_WAS(0x00000010):  タスクが待ち状態に入っている場合に、他のタスク
                        から強制的に待ち状態に、この値をもつ 
  TTS_DMT(0x00000020):  休止状態。タスクが生成されてはいるがまだ起動さ
                        れていない場合にこの値をもつ。この状態のときに
                        は、タスクは自分の資源をなにも消費していない 


タスク待ち要因

TTS_WAI,TTS_SUS,TTS_WASのいずれかの状態のときに、何の要因で待ち状態
に入っているのかを示す値である。

待ちとして以下の状態を定義している:

  タイマ待ち	       (セマフォ、イベントフラ、メッセージの待ちと組み
		       合わせて使う)
  セマフォ待ち
  イベントフラグ待ち
  メッセージ待ち

セマフォ/イベントフラグ/メッセージは、タイマ待ちと組み合わせることが
できます。

逆にタイマ待ちを除いては、セマフォ/イベントフラグ/メッセージの待ち状
態は重なることはありません(例えばイベントフラグとセマフォとを同時に待
つことはない)。


タスク優先度

タスク優先度は、タスクを実行する場合にどのタスクを先に実行するかを示
す値です。もし、同じ優先度のタスクがあった場合、その優先度のタスクリス
トの先頭にあるタスクが先に実行さます。タスクリストについては、タスクの
構造を参照してください。


仮想メモリ管理テーブル

タスクごとに必要とする仮想メモリのマッピング情報。

カーネルモードで動く領域についてはすべて同じマッピングだが、ユーザモー
ド(アプリケーションプログラム)の領域は、マッピング情報がタスクごとに異
なっている。

仮想メモリ管理テーブルの詳細については、仮想メモリ機能の項目を参照の
こと。


カーネルスタック

タスクごとにもつ、カーネルモードで動作するときに使用するスタック領域。

この大きさはタスクの生成時に指定します。本来の ITRON 規約ではバイト
単位でサイズを指定しますが、本 ITRON では、ページサイズに切り上げます。 
これは、スタック領域をオーバーフローしたことを関知するために、スタック
領域の前後のページを未マップ状態にするためです。スタック領域をはずれて
アクセスした場合にどのような処理をするかは、例外処理ハンドラとして各タ
スクごとに指定することができます。


IPC (Inter process communication) 用の情報

本 ITRON では、タスク間通信として次の機能をサポートしています

  o セマフォ
  o メッセージ
  o イベントフラグ


通信機能に必要な情報は、タスク情報として各タスクに付随しています。


例外処理ハンドラテーブル

例外が発生した場合に実行されるハンドラへのアドレスを収めるテーブル。
例外には、次の種類がります。

  o メモリフォールト
  o トラップ (システムコール)
  o 浮動小数点例外


もし、例外発生時にタスク独自の処理をする必要がなければ、システムで決
められた処理を行います。その場合、ハンドラアドレスとしてアドレス 0
(NULLポインタ)をセットしておいてください。

例外処理の詳細については、例外処理機能の項目を参照してください。



can_wup  --- タスクの起床要求を無効化


呼び出し形式
------------

#include <itron.h>

ER can_wup (void);


引数
----
	INT *p_wupcnt	キューイングしていた起床要求の数
	ID tskid	タスク ID}


返り値
------

以下のエラー番号が返る。

	E_OK	システムコールは正常に終了した
	E_ID	タスク ID がおかしい
	E_NOEXS	タスク ID で指定したタスクが存在しない
	E_OBJ	タスク ID の状態が待ち状態ではない。


機能
----

このシステムコールは、引数 tskid で指定した ID をもつタスクの起床要求
カウンタをリセットする。

タスクの起床要求カウンタは、待ち状態にあるタスクを起床するシステムコー
ルが発行されるごとにカウントアップしていく。
また、待ち状態にあるタスクが起床するとカウントダウンする。

起床要求カウンタが1以上の値を持っているとき、待ち状態に遷移するシステ
ムコールを発行してもタスクは待ち状態にならない。

このシステムコールが発行できるのは、タスクが待ち状態にあるときだけであ
る。タスクが待ち状態でないときは E_OBJ のエラーとなる。


補足
----

このシステムコールは、μ ITRON 3.0 の本来の仕様と以下のような違いがあ
ります。

  o タスク ID が 0 の場合にも自タスクを指定できない。
  o 以下のエラーコードはインプリメントしていない。
    E_OACV
    EN_OBJNO
    EN_CTXID
    EN_RPAR

cre_tsk  --- タスクの生成

呼び出し形式
------------

ER cre_tsk (ID tskid, T_CTSK *pk_ctsk);


引数
----
	tskid	生成するタスクの ID
	pk_ctsk	タスク生成情報
	    tskatr	タスク属性
	    startaddr   タスク起動アドレス
	    itskpri     タスク起動時優先度
	    stksz       スタックサイズ
	    addrmap     アドレスマップ    


返り値
------

以下のエラー番号が返る。

	E_OK   システムコールは正常に終了した
	E_OK   正常終了
	E_ID   タスクの ID 番号が不正
	E_OBJ  同一のタスクが存在している


機能
----

引数 tskid のタスク ID をもつタスクを生成する。

生成したタスクは、DORMANT 状態となる。

タスクの実行を開始するには、システムコール sta_tsk を呼び出す必要があ
る。
実行を開始するときのエントリアドレスは、引数 pk_ctsk の中の startaddr 
によって指定する。

引数 tskid で指定した値と同じタスク ID をもつタスクが既に存在していた
場合には、E_ID のエラーとなる。
よって、タスク生成には、必ずユニークなタスク ID を指定する必要がある。


関連関数
--------

	sta_tsk タスクの実行を開始する。

chg_pri  --- プライオリティの変更

呼び出し形式
------------

ER chg_pri (ID tskid, PRI tskpri);


引数
----

	tskid	プライオリティを変更するタスクの ID
	tskpri	変更後のプライオリティ

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     tskid で指定したタスク ID が不正
	E_NOEXS  tskid で指定したタスク ID に該当するタスクが存在
		 しない。


機能
----

タスクのプライオリティを変更する。

タスクのプライオリティは、0 から 31 までの範囲の値となる。
プライオリティの高いものは低いものより優先して実行される。

タスクの プライオリティ 0 も使用することができる。

tskid に 0 を指定した場合、自タスクを指定したことになる。


Internal
--------

タスクのプライオリティの範囲は、src/kernel/itron/include/config.h の中
のマクロ MIN_PRIORITY (最小のプライオリティ) と MAX_PRIORITY (最大のプ
ライオリティ)の2つで定義する。

内部的には、タスクのプライオリティはタスクの RUN キューの入る配列のイ
ンデックスとなっている(つまり中心核は RUN キューは、32 個の要素からな
る配列で管理する)。


dis_dsp  --- ディスパッチ禁止


呼び出し形式
------------

ER dis_dsp (VOID)

引数
----

	なし


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した


機能
----

タスクの切換えを禁止する。


Internal
--------

ITRON 内では、タスク切換えの許可/不許可は、フラグ dispatch_flag の値
が TRUE か FALSE かで行っている(値 TRUE の場合にタスク切換えを行う)。 
本システムコールは、タスク切換えのフラグ dispatch_flag の値を FALSE 
にする。

ena_dsp  --- ディスパッチ許可


呼び出し形式
------------

ER ena_dsp ()

引数
----

なし


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した


機能
----

dsp_dsp によって禁止したタスクの切換えをできるようにする。


Internal
--------

本システムコールは、タスク切換えのフラグ dispatch_flag の値を TRUE 
にする。

ext_tsk  --- 自タスク終了


呼び出し形式
------------

ER ext_tsk (VOID)


引数
----

なし


返り値
------

このシステムコールは、返り値を返さない。
また、このシステムコールを呼び出したタスクのコンテキストはなくなってし
まうため、呼び出しもとには戻らない。


機能
----

このシステムコールを実行したタスクを終了する。
メモリ資源などは返却しない。

このシステムコールを実行したあとは、もとのコンテキストには戻らない。

ただし、コンテキスト情報は削除しないため、sta_tsk システムコールによっ
て実行を再開することはできる。


Internal
--------

この関数では、ready タスクキューにつながれているタスクのうち、
最も優先度の高いものを選択し、次に実行するタスクとする。
(選択するタスクがないということはない。--- 必ず走行している 
idle タスクがあるため)
switch_task() では、今走行してるタスクをreadyタスクキューに入
れる。しかし、ext_tsk() では、元のタスクは終了するため、ready
タスクキューには入れず、状態をTTS_DMTにする。


exd_tsk  --- 自タスク終了と削除

呼び出し形式
------------

ER exd_tsk (VOID)


引数
----

なし


返り値
------

このシステムコールは、返り値を返さない。
また、このシステムコールを呼び出したタスクのコンテキストはなくなってし
まうため、呼び出しもとには戻らない。


機能
----

RUN キューにつないでいるタスクを TTS_NON 状態 (存在していない状態)へ移
動する。メモリ資源などは返却しないが、マッピングされたメモリについては、
解放する。

このシステムコールを実行したあとは、もとのコンテキストには戻らない。


Internal
--------

この関数では、ready タスクキューにつながれているタスクのうち、
最も優先度の高いものを選択し、次に実行するタスクとする。
(選択するタスクがないということはない。--- 必ず走行している 
idle タスクがあるため)
switch_task() では、今走行してるタスクをreadyタスクキューに入
れる。しかし、ext_tsk() では、元のタスクは終了するため、ready
タスクキューには入れず、状態をTTS_DMTにする。

frsm_tsk --- 強制待ち状態のタスクから待ち状態を解除(多重の待ち状態用)

呼び出し形式
------------

ER frsm_tsk (ID tskid)


引数
----

	tskid	対象となるタスク ID

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が不正
	E_NOEXS  タスクが存在しない(TTS_NON 状態)
	E_OBJ    タスクの状態が不正(TTS_SUS, TTS_WAS, TTS_NON 以外)

機能
----

待ち状態にあるタスクを待ち状態から強制的に解除する。

待ち状態は多重になることがあるが、すべての待ちを解除する。

get_tid  --- 自タスクのタスク ID 参照

呼び出し形式
------------

ER get_tid (ID *tskid)


引数
----

  tskid	自タスクのタスク ID を入れるための領域のポインタ


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した。

引数 tskid には、返り値としてタスク ID が入れられる。


機能
----

タスク ID を取得するためのシステムコール。

ref_tsk  --- タスク状態の参照

呼び出し形式
------------

ER ref_tsk (T_RTSK *pk_rtsk, ID tskid)


引数
----

	pk_rtsk	返り値：タスク情報を入れる領域へのポインタ
	tskid	情報を取得するタスクの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が不正
	E_NOEXS  タスク ID で指定したタスクは存在しない


機能
----

引数で指定したタスクの状態を返す。

タスク状態は、次の構造体の情報として返す。

  typedef struct t_rtsk
  {
    VP    exinf;
    PRI   tskpri;                 /* タスクの優先順位      */
    UINT  tskstat;                /* タスク状態            */
    W     total_time;             /* タスクの総使用時間    */
  } T_RTSK;


rot_rdq  --- 同一プライオリティでのタスクの順序を変更する


呼び出し形式
------------

ER rot_rdq (PRI tskpri)


引数
----

	tskpri	タスクのプライオリティレベル

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_PRI    プライオリティ値が不正(範囲外)


機能
----

引数で指定したプライオリティレディキューの配列のインデックスとなってい
る。同じプライオリティをもつタスクは、レディキューのエントリからつながっ
たリストになっている。
リスト中にあるタスクのうち、リストの先頭(レディキューに近い側)から CPU 
の制御が渡る。
rot_rdq システムコールは、このレディキューからのリストの順番を変更す
る。
具体的には、リストの先頭にあるタスクをリストの最後に移動する。
リスト中の次のタスクが、先頭のタスク(同じプライオリティをもつタスクの
中で次に実行されるタスク)になる。

Internal
--------

このシステムコールの処理は次のようになる。

  先頭のタスク = readyタスクリストの配列[tskpri]。
  先頭のタスクを削除。
  先頭のタスクを (readyタスクリストの配列[tskpri]) の一番最後に追加。

rsm_tsk  --- 強制待ち状態のタスクから待ち状態を解除


呼び出し形式
------------

ER rsm_tsk (ID tskid)


引数
----

	tskid	対象となるタスクの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が不正
	E_NOEXS  タスクが存在しない(TTS_NON 状態)
	E_OBJ    タスクの状態が不正(TTS_SUS, TTS_WAS, TTS_NON 以外)


機能
----

待ち状態にあるタスクを待ち状態から強制的に解除する。

待ち状態は多重になることがあるが、このシステムコールは、ひとつだけ待ち
を解除する。


slp_tsk  --- 自タスクを待ち状態にする


呼び出し形式
------------

ER slp_tsk (VOID)


引数
----

なし


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_DLT    待ち要因でエラーが発生した(?)。
	E_TMOUT  タイムアウト付きの待ち状態で、タイムアウトになっ
                 た。 


機能
----

自分自身を待ち状態にして、他のタスクに制御を渡す。

待ち要因は、この関数ではセットしない。

もし、現タスクがすでに起床要求をキューイングしている場合には、
起床要求のカウンタをひとつデクリメントしてそのまま返る。
その場合でもエラー番号は E_OK となる(エラーとはならない)。

Internal
--------

このシステムコールでは、待ち状態に移行するため、エラーがすぐには返らな
い。
タスクがスリープ状態から起床するときに、エラーによって起床する場合があ
る。その場合、本システムコールではエラーが発生したことが分からない。そ
のため、起床時に発生したときのエラー番号はタスク構造体の slp_err 要素
に入れる。


sta_tsk  --- タスクの起動


呼び出し形式
------------

ER sta_tsk (ID tskid, INT stacd)


引数
----

	tskid	タスク ID
	stacd	起動したタスクへ渡す引数


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が不正
	E_NOEXS  タスクが TTS_DMT 状態でない


機能
----

 引数tskidで指定したタスクを起動する。

 指定したタスクは、cre_tsk で生成されている必要がある。


sus_tsk  --- 指定したタスクを強制待ち状態に移行


呼び出し形式
------------

ER sus_tsk (ID tskid)


引数
----

  tskid	suspend するタスクの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が不正
	E_OBJ    指定したタスクが現タスク
	E_QOVR   タスクの多重待ち数を越えた
	E_NOEXS  タスクが生成されていない
	E_OBJ    タスク状態が TTS_RDY、TTS_SUS、TTS_WAI、
                 TTS_NON 以外だった。

機能
----

指定したタスクを 強制待ち状態へと移行する。

もし、タスクが TTS_WAI の場合には TTS_WAS 状態へと移行する。

ter_tsk  --- 他タスク強制終了


呼び出し形式
------------

ER ter_tsk (ID tskid)


引数
----

	tskid	強制終了するタスクの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_OBJ    自タスクを指定した


機能
----

引数で指定したタスクを強制的に終了させる。
終了するタスクのもっている資源は解放しない。
ただし、このシステムコールによって終了したタスクは、TTS_DMT 状
態になっただけなので、sta_tsk システムコールによって再開する
ことができる。


Internal
--------

待ち状態 (TTS_WAI) にあるタスクを強制終了する場合、
待ち状態を解放しなければならないが、現在は単に TTS_DMT に
なっているだけである。
そのため、待ち状態のまま TTS_DMT に遷移する。

wup_tsk  --- 指定されたタスクを起床する


呼び出し形式
------------

ER wup_tsk (ID tskid)


引数
----

	tskid	起床させるタスクの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     タスク ID が正しくない
	E_OBJ    タスク状態不正(すべての待ち状態が解除されていない)


機能
----

指定したタスクを wakeu する。
すなわち、タスクを TTS_RDY 状態にする。

待ち状態フラグ(tskwai)は、この関数を呼び出す時にリセットしていなければ
いけない。
もし待ち状態フラグがセットされていたならば、E_OBJ のエラーとなる。


4.2.2 同期・通信機構

本 ITRON でサポートしている同期・通信機能
-----------------------------------------

  本来の ITRON 規約では、セマフォ、イベントフラグ、メイルボックス、メ
ッセージバッファ、ランデブなどが使用できます。しかし、これらの機能をす
べてをサポートすることは、B-Free OS を動かすためだけには必要ないと思わ
れます。そこで、本 ITRON では、セマフォ、イベントフラグ、メッセージし
かサポートしていません。
  各 IPC 機能は、次の用途を目的としてサポートしています。

  1) セマフォ
     タスク間の同期をとる。タスク間で共有している情報をアクセスすると
     きなどに使用する。

  2) イベントフラグ
     タスク間で待ち状態を指定するときなどに使用する。
     ドライバタスクとそのタスクに対応したドライバ割り込みハンドラとで
     データのやりとりをするときに使用する。この機能は、セマフォでも代
     用できるので、ドライバによっては使用しない場合もありえる。

  3) メッセージ
     ユーザプロセスと各サーバプロセスとの通信に使用する。
     各サーバプロセスは、システムで決められたメッセージ ID をもつ。そ
     のメッセージ ID を使用してユーザプロセスは、サーバプロセスに対し
     て要求メッセージを送ることができる。
     ユーザプロセスは主にこの IPC 機能を使用するだろう。


  μITRON 3.0 の仕様では、この他にも IPC 機能として次の機能を定義して
います。しかし、本 ITRON では、これ以上の IPC 機能は必要ないと考えサポー
トしていません。各 IPC をサポートしない理由についても付記します。

  メイルボックス機能    メッセージ機能で代用できるため。また、メイルボ
                        ックス機能では、基本的にアドレス空間を各タスク
                        ごとに共有する必要がある。アドレス空間を基本的
                        に分離している B-Free OS では、特にユーザプロ
                        セスが使いにくいのではないかと考え、サポートし
                        ないことにした。

  ランデブ機能          メッセージ機能で代用できるため削除した。ランデ
                        ブは、ランデブを呼び出したタスクが、呼び出され
                        たタスクからの返事が帰ってくるまで待つことにな
                        っている。しかし、そうするとメッセージを送信し
                        が後に他の処理を行うことができなくなる。
                        B-Free OS では、サーバが他のサーバを呼び出す場
                        合があり、そうした場合にランデブを使用すると、
                        並列処理ができなるくなるため、効率が悪くなると
                        思われた(処理によってランデブとメッセージを使
                        いわけるというのも考えられるが、そうすると、要
                        求処理が複雑になる)。


  これらの IPC 機能については、ユーザプログラムによっては、必要となる
場合もあるが、そういった場合には、ユーザプログラム自身でこれらの機能を
エミュレートする必要がある。


セマフォ
-------

セマフォ関連のシステムコールは、表のとおりです。


  セマフォ関係のシステムコール
  ============================

  システムコール名 		機  能
     cre_sem		セマフォ生成
     del_sem		セマフォ削除
     preq_sem		セマフォ資源獲得 (ポーリング)
     ref_sem		セマフォ状態参照
     sig_sem		セマフォ資源返却
     twai_sem		セマフォ資源獲得 (タイムアウト有)
     wai_sem		セマフォ資源獲得



cre_sem  --- セマフォ生成}

呼び出し形式
------------

ER cre_sem (ID semid, T_CSEM *pkcsem)


引数
----

 semid	生成するセマフォの ID
  pkcsem { 生成するセマフォの情報 }


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     引数 semid で指定したセマフォの ID が間違っている
	E_OBJ    引数 semid で指定したセマフォはすでに生成している
	E_PAR    パラメータ不正


機能
----

  セマフォを新しく生成する。
  

del_sem  --- セマフォ削除
  



呼び出し形式
------------

ER del_sem (ID semid)


引数
----

	semid	セマフォ ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が異常
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)。


機能
----

cre_sem によって生成したセマフォを削除する。
もし、セマフォを使用しているタスクがあった場合、待ち状態を解除する。

preq_sem --- セマフォ資源獲得 (ポーリング)
  

呼び出し形式
------------

ER preq_sem (ID semid)


引数
----

	semid	獲得したいセマフォの ID


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が異常
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)。
	E_TMOUT  すでに,指定したセマフォは使われている。



機能
----

Polling 機能付きでセマフォを獲得する。すでに他のタスク
がセマフォを獲得していた場合、エラー(E_TMOUT)を返す。
この関数を実行したタスクは、待ち状態には入らない。

ref_sem  --- セマフォ状態参照

呼び出し形式
------------

ER ref_sem (T_RSEM *pk_rsem, ID semid)


引数
----

	pk_rsem	セマフォの状態(返り値)
	semid	セマフォの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が異常
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)。


機能
----

今、セマフォがどういう状態にあるか参照する。
ref_sem() は、セマフォ状態として、次の情報を返す。

    VP         exinf   拡張情報
    BOOL_ID    wtsk    待ちタスクの有無
    INT        semcnt  現在のセマフォのカウント値
        

Implementation
--------------

  ITRON で管理するセマフォ管理構造体には、次の情報が含まれている。  

    ID         セマフォ ID
    Counter    現在のセマフォカウント値
    next       次のセマフォへのポインタ(内部管理情報)
    before     前のセマフォへのポインタ(内部管理情報)




sig_sem  --- セマフォ資源返却

呼び出し形式
------------

ER sig_sem (ID semid)

引数
----

	semid	返却するセマフォの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が異常
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)


機能
----

  獲得したセマフォを解放する場合、sig_sem() を使用する。セマフォの解放
は、セマフォの削除と同一の機能ではない。セマフォの削除の場合、他にセマ
フォの獲得を待っていたタスクは、セマフォを獲得することができず、エラー
が返る。しかし、セマフォを解放した場合には、セマフォの獲得を待っていた
プロセスは、正常にセマフォを獲得することができる。

もし、セマフォを待っているタスクがあった場合には、そのタスクを 
wup_up() によって起床する。

セマフォの取得待ちタスクは、リストとして 各セマフォに附属している。

この機能は、いわゆるセマフォの V 操作に相当する。

twai_sem --- セマフォ資源獲得 (タイムアウト有)


呼び出し形式
------------

ER twai_sem (ID semid, TMO tmout)


引数
----

  semid	セマフォ ID
  tmout	タイムアウト時間


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が範囲外
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)


機能
----

この機能は、いわゆるセマフォの P 操作に対応する。

タイムアウト機能付きでセマフォを獲得する。
すでに他のタスクがセマフォを獲得していた場合、引数 tmout で指定した時
間だけ待ち、それまでにセマフォを獲得できなかった場合、エラー(E_TMOUT)
を返す。

タイムアウト時間を示す引数 tmout の単位は、ハードウェアクロック割り込
みの間隔である(1 ms)。 


wai_sem  --- セマフォ資源獲得


呼び出し形式
------------

ER wai_sem (ID semid)


引数
----

  semid	セマフォ ID


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID     セマフォ ID が範囲外
	E_OBJ    指定された ID のセマフォは存在しない (生成されていない)
	E_TMOUT  セマフォが削除された



機能
----

この機能は、いわゆるセマフォの P 操作に対応する。

指定したセマフォを獲得する。
すでに他のタスクがセマフォを獲得していた場合、解放するまで待つ。

ただし、del_sem システムコールによってセマフォが削除された場合、 
E_TMOUT のエラーとなり、待ち状態から解放される。




イベントフラグ
==============

イベントフラグ関係のシステムコールは表 <イベントフラグ関係のシステムコー
ル> に示すとおりです。


  イベントフラグ関係のシステムコール
  ==================================

 システムコール名 		機  能
   clr_flg		イベントフラグの値をクリアする
   cre_flg		イベントフラグの生成
   del_flg		イベントフラグの削除
   pol_flg		イベントフラグ待ち(ポーリング付き)
   ref_flg		イベントフラグ状態参照
   set_flg		イベントフラグに値をセットする
   twai_flg		イベントフラグ待ち(タイムアウト付き)
   wai_flg		イベントフラグ待ち


clr_flg  --- イベントフラグの値をクリアする


呼び出し形式
------------

ER clr_flg (ID flgid, UINT clrptn)


引数
----

  flgid  イベントフラグの ID
  clrptn クリアする値


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     フラグ ID が範囲外
	E_NOEXS  フラグ ID で指定したイベントフラグは存在していない



機能
----

指定した ID をもつイベントフラグをクリアする。
クリアする値は引数で指定できる。

このシステムコールを実行した後のイベントフラグの値は次の式で表すことが
できる。

  イベントフラグの値 = イベントフラグの値 & クリアパターン


cre_flg  --- イベントフラグの生成


呼び出し形式
------------

ER cre_flg (ID flgid, T_CFLG *pk_flg)


引数
----


  flgid    イベントフラグの ID
  pk_flg   イベントフラグの属性情報


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_OBJ    ID で指定したイベントフラグは、すでに生成済
	E_PAR    pk_flg の値がおかしい



機能
----
  イベントフラグを使用する場合、まず、cre_flg によってイベントフラグを
生成しなければならない。

  cre_flg は引数で指定された ID をもつイベントフラグを新規に生成する。
もし、指定した ID をもつイベントフラグがすでに生成されていたら、エラー
(E_ID) となる。



del_flg  --- イベントフラグの削除
  



呼び出し形式
------------

ER del_flg (ID flgid)


引数
----

  flgid{削除するイベントフラグの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_OBJ    ID で指定したイベントフラグは、すでに生成済


機能
----

引数 flgid で指定したイベントフラグを削除する。
削除したイベントフラグは再利用する。そのため、このシステムコールを実行
した後は、同じ ID をもつイベントフラグが生成することがある。

削除するイベントフラグを待っているタスクがある場合、そのタスクに対して
は、待ちが生じているシステムコールは E_TMOUT のエラーとなる。

  pol_flg  --- イベントフラグ待ち(ポーリング付き)
  

呼び出し形式
------------

ER pol_flg (UINT *flgptn, ID flgid, UINT waiptn, UINT wfmode)


引数
----


  flgptn {このシステムコールがイベントフラグ待ちから解放した
    時のイベントフラグのビットパターン
  flgid  {チェックするイベントフラグの ID
  waiptn {待ちから解放するときのイベントフラグのパターン
  wfmode {待ちモード


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_OBJ    ID で指定したイベントフラグはすでに生成済
	E_TMOUT  イベントフラグは waiptn に合致していない
	E_NOEXS  指定したイベントフラグは、生成されていない


機能
----

イベントフラグの状態を調べ、もしイベントフラグの値が指
定したビットパターンと合致していれば、正常終了する。ま
た、ビットフラグの値が指定したビットパターンと一致して
いない場合にもタスクは待ち状態とならず、呼び出し側に戻
る。ただし、エラー(E_TMOUT)を返す。

ref_flg  --- イベントフラグ状態参照


呼び出し形式
------------

ER ref_flg (T_RFLG *pk_rflg, ID flgid)


引数
----


  pk_rflg	フラグの状態
  flgid		状態を参照したいイベントフラグの ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_NOEXS  指定したイベントフラグは、生成されていない


機能
----

  指定したイベントフラグの状態を参照する。
  イベントフラグの状態は、次に示す構造体の形式で返される。

  typedef struct t_rflg
  {
    VP            exinf;          /* 拡張情報                             */
    BOOL_ID       wtsk;           /* 待ちタスクの有無                     */
    UINT          flgptn;         /* イベントフラグのビットパターン       */
  }


set_flg  --- イベントフラグに値をセットする


呼び出し形式
------------

ER set_flg (ID flgid, UINT setptn)


引数
----

  flgid {値をセットするイベントフラグの ID
  setptn{セットするビットパターン


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_NOEXS  指定したイベントフラグは、生成されていない


機能
----

指定した ID をもつイベントフラグをセットする。
もし、イベントフラグを待っていたタスクがあった場合、そのタスクは 
wakeup される。
イベントフラグを待つタスクは複数いてもよい。

twai_flg --- イベントフラグ待ち(タイムアウト付き)
  

呼び出し形式
------------

ER twai_flg (UINT *flgptn, ID flgid, UINT waiptn, UINT wfmode, TMO tmout)


引数
----


  flgptn このシステムコールがイベントフラグ待ちから解放した
	 時のイベントフラグのビットパターン
  flgid  チェックするイベントフラグの ID
  waiptn 待ちから解放するときのイベントフラグのパターン
  wfmode 待ちモード
  tmout  タイムアウトするまでの時間 (10 ms 単位)


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_OBJ    ID で指定したイベントフラグはすでに生成済
	E_TMOUT  イベントフラグは、引数 tmout で示す時間内に指定
		 したビットパターンにならなかった。あるいは、イベント
		 フラグが削除された。
	E_NOEXS  指定したイベントフラグは、生成されていない


機能
----

wai_flg にタイムアウト機能を追加したもの。
イベントフラグの値が指定したビットパターンと一致してい
なければ、待ち状態となる。そして、指定した時間が過ぎて
もイベントフラグがセットされなければ、この関数の呼び出
し側へエラー(E_TMOUT) 返す。

wai_flg  --- イベントフラグ待ち
  

呼び出し形式
------------

ER wai_flg (UINT *flgptn, ID flgid, UINT waiptn, UINT wfmode)


引数
----

  flgptn このシステムコールがイベントフラグ待ちから解放した
	 時のイベントフラグのビットパターン
  flgid  チェックするイベントフラグの ID
  waiptn 待ちから解放するときのイベントフラグのパターン
  wfmode 待ちモード


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID     イベントフラグの ID がおかしい
	E_OBJ    ID で指定したイベントフラグはすでに生成済
	E_TMOUT  イベントフラグが削除された。
	E_NOEXS  指定したイベントフラグは、生成されていない


機能
----

一番単純なイベントフラグ待ち関数。
指定した ID をもつイベントフラグの値が特定のビットパタ
ーンになるまで、この関数を実行したタスクは、wait 状態
となる。そして、set_flg によってイベントフラグの値が指
定したビットパターンになると、待ち状態にあったタスクは、
wakeup する (すなわち、wai_flg システムコールが終了する)。



メッセージバッファ
==================

メッセージバッファ関係のシステムコールは、表 に
示すとおりです。

  メッセージバッファ関係のシステムコール
  ======================================

  システムコール名 		機  能 
      cre_mbf		メッセージバッファ生成
      del_mbf		メッセージバッファを削除する
      prcv_mbf		メッセージバッファから受信する (ポーリング) 
      psnd_mbf		メッセージバッファへ送信(ポーリング)
      rcv_mbf		メッセージバッファから受信する
      ref_mbf		メッセージバッファ状態参照
      snd_mbf		メッセージバッファへ送信
      trcv_mbf		メッセージバッファから受信する(タイムアウト有)
      tsnd_mbf		メッセージバッファへ送信(タイムアウト機能つき)

cre_mbf  --- メッセージバッファ生成


呼び出し形式
------------

ER cre_mbf (ID id, T_CMBF *pk_cmbf)


引数
----

  id		生成するメッセージバッファ ID
  pk_cmbf	メッセージバッファ生成情報
		以下の要素をもつ構造体である。

		    mbfatr     メッセージ属性 (TA_FIFO 固定) 
		    bufsz      バッファサイズ
		    maxmsz     メッセージの最大長


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_OBJ     同一ID のメッセージがすでに存在する
	E_PAR     パラメータ不正


機能
----

メッセージバッファを生成する。

各メッセージバッファには識別のための メッセージ ID がつく。メッセージ 
ID は、引数 id によって指定する。


  del_mbf  --- メッセージバッファを削除する


呼び出し形式
------------

ER del_mbf (ID id)


引数
----

  id	削除するメッセージ ID


返り値
------

以下のエラー番号が返る。

	E_OK      システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない


機能
----

引数 ID で指定したメッセージバッファを削除する。

もし、削除するメッセージバッファにメッセージを受信/送信待ちしているタ
スクがあった場合、それぞれのタスクのシステムコールは中断し、E_DLT の
エラーコードが返る。


prcv_mbf --- メッセージバッファから受信する (ポーリング) 
  

呼び出し形式
------------

ER prcv_mbf (VP msg, INT *size, ID id)


引数
----

  msg        受信したメッセージを入れる領域
  size       受信したメッセージのサイズ(返り値)
  id         メッセージバッファ ID


返り値
------

以下のエラー番号が返る。

	E_OK      システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_TMOUT   受信すべきメッセージが存在しない


機能
----

prcv_mbf システムコールは、メッセージバッファからメッセージを受信する。 

もし、受信すべきメッセージがメッセージバッファに存在しない場合、
受信を待たずに E_TMOUT のエラーリターンとなる。


psnd_mbf --- メッセージバッファへ送信(ポーリング)


呼び出し形式
------------

ER psnd_mbf (ID id, INT size, VP msg)


引数
----


  id   メッセージバッファ ID
  size 送信メッセージのサイズ
  msg  送信メッセージの先頭アドレス


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_TMOUT   メッセージバッファをアロケートできなかった。


機能
----
メッセージバッファへメッセージを送る。

もし、メッセージバッファがいっぱいの場合、空くのを待たずに E_TMOUT で
エラーリターンする。

rcv_mbf  --- メッセージバッファから受信する
  
呼び出し形式
------------

ER rcv_mbf (VP msg, INT *size, ID id)


引数
----

  msg        受信したメッセージを入れる領域
  size       受信したメッセージのサイズ(返り値)
  id         メッセージバッファ ID


返り値
------

以下のエラー番号が返る。


	E_OK     システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_TMOUT   受信すべきメッセージが存在しない
	E_DLT     メッセージバッファが削除された


機能
----
rcv_mbf システムコールは、メッセージバッファからメッセージを受信する。 

もし、受信すべきメッセージがメッセージバッファに存在しない場合、
他のタスクからメッセージが送信されるまで待つ (スリープする)。

メッセージの受信待ちをしている状態で、メッセージバッファを削除した場合
には E_DLT のエラーとなり、システムコールは中断する。


ref_mbf  --- メッセージバッファ状態参照
  
呼び出し形式
------------

ER ref_mbf (T_RMBF *pk_rmbf, ID id)


引数
----

  pk_rmbf   メッセージバッファ状態 (返り値)
  id         メッセージ ID


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない


機能
----

引数 id で指定したメッセージバッファの状態を返す。

状態は、次の構造体として返る。

	typedef struct t_rmbf
	{
	  VP            exinf;
	  BOOL_ID       wtsk;
	  BOOL_ID       stsk;
	  INT           msgsz;
	  INT   frbufsz;
	}T_RMBF;

snd_mbf  --- メッセージバッファへ送信


呼び出し形式
------------

ER snd_mbf (ID id, INT size, VP msg)


引数
----

  id         メッセージバッファ ID
  size       送信メッセージのサイズ
  msg        送信メッセージの先頭アドレス


返り値
------

以下のエラー番号が返る。

	E_OK      システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_OBJ     メッセージバッファの領域を確保できなかった


機能
----
メッセージをメッセージバッファへ送信する

もしメッセージバッファが満杯の場合には、空きができるまでタスクは待ち状
態に入る。


trcv_mbf --- メッセージバッファから受信する(タイムアウト有) 


呼び出し形式
------------

ER trcv_mbf (VP msg, INT *size, ID id, TMO tmout)


引数
----


  msg        受信したメッセージを入れる領域
  size       受信したメッセージのサイズ(返り値)
  id         メッセージバッファ ID
  tmout      受信待ち時間


返り値
------

以下のエラー番号が返る。


	E_OK      システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_TMOUT   受信すべきメッセージが存在しない(タイムアウト)
	E_DLT     メッセージバッファが削除された



機能
----

trcv_mbf システムコールは、タイムアウト付きのメッセージ受信を行う。

メッセージバッファにメッセージがない場合、引数 tmout で指定した時間だ
け待つ。

もし、指定した時間が過ぎてもメッセージが送信されてこない場合には、
E_TMOUT のエラーとなる。その場合、引数 msg の値は何も変更しない。

メッセージの受信待ちをしている状態で、メッセージバッファを削除した場合
には E_DLT のエラーとなり、システムコールは中断する。


tsnd_mbf --- メッセージバッファへ送信(タイムアウト機能つき) 



呼び出し形式
------------

ER tsnd_mbf (ID id, INT size, VP msg, TMO tmout)


引数
----

  id         メッセージバッファ ID
  size       送信メッセージのサイズ
  msg        送信メッセージの先頭アドレス
  tmout      タイムアウト値


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      メッセージ ID 不正
	E_NOEXS   指定したメッセージは存在していない
	E_OBJ     メッセージバッファの領域を確保できなかった
	E_TMOUT   メッセージバッファが満杯で送信できなかった (タ
		  イムアウト)


機能
----

tsnd_mbf システムコールは、メッセージバッファにメッセージを追加する。

もし、メッセージバッファが満杯で送信できなかった場合には、引数 tmout 
で指定した時間だけ待つ。

もし、指定した時間が過ぎてもメッセージバッファに空きができない場合には、
E_TMOUT のエラーとなり、システムコールは終了する。


4.2.3 割り込み管理機能


  割り込み関係のシステムコール
  ============================

  システムコール名 		機  能
      dis_int	   	割り込みを禁止する
      ena_int		割り込みを許可する


dis_int --- 割り込みを禁止する
  
呼び出し形式
------------

ER dis_int (VOID)


引数
----

このシステムコールには、引数はない。


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した


機能
----

割り込みを禁止する。この場合、ソフトウェア割り込み/ ハードウェア割り込
みの区別なく、すべての割り込みを禁止する。


Internal
--------

このシステムコールは、i386 CPU の cli 命令を実行しているだけである。

ena_int --- 割り込みを許可する


呼び出し形式
------------

ER ena_int (VOID)


引数
----

このシステムコールには、引数はない。


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した


機能
----
ena_int システムコールは、dis_int システムコールによって禁止した割り
込みを再び許可する。


Internal
--------
このシステムコールは、i386 CPU の sti 命令を実行しているだけである。


4.2.4 メモリプール管理機能

  メモリプール関係のシステムコール
  ================================

  システムコール名		機    能
      cre_mpl  		メモリプールの生成
      del_mpl		可変長メモリプールの削除
      get_blk		可変長メモリブロック獲得
      pget_blk		可変長メモリブロック獲得(ポーリング)
      rel_blk		可変長メモリブロック返却
      ref_mpl		可変長メモリプール状態参照
      tget_blk		可変長メモリブロック獲得(タイムアウト有)

cre_mpl  --- メモリプールの生成
  

呼び出し形式
------------

ER cre_mpl (ID mplid, T_CMPL *pk_cmpl)


引数
----

  mplid		メモリプール ID
  ppk_cmpl	生成するメモリプールの属性情報
		次の形式の構造体である。

		typedef struct t_cmpl
		{
		  VP            exinf;
		  ATR           mplatr;
		  INT           mplsz;
		  INT           align;          /* アライメントサイズ */
		} T_CMPL;

返り値
------

以下のエラー番号が返る。

	E_OK      システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     すでに同一 ID の可変長メモリ ID が存在する。


機能
----
可変長メモリプールを生成する。



del_mpl  --- 可変長メモリプールの削除


呼び出し形式
------------

ER del_mpl (ID mplid)


引数
----

  mplid	削除するメモリプールの ID

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。


機能
----
可変長メモリプールを削除する。

削除したメモリプール領域は、システムメモリプール領域へ返却する。


get_blk  --- 可変長メモリブロック獲得

呼び出し形式
------------

ER get_blk (VP *pblk, ID mplid, INT blksz)


引数
----

  pblk       獲得したメモリブロックへのアドレス
  mplid      メモリブロックを獲得するメモリプール ID 
  blksz      獲得するブロックのサイズ

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。


機能
----

可変長メモリブロック獲得。

もし、メモリブロックを獲得できなかった場合、空きができるまで待つ。


Internal
--------

このシステムコールは、内部的に pget_mpl を使っている。



pget_blk --- 可変長メモリブロック獲得(ポーリング)


呼び出し形式
------------

ER pget_blk (VP *pblk, ID mplid, INT blksz)


引数
----

  pblk       獲得したメモリブロックへのアドレス
  mplid      メモリブロックを獲得するメモリプール ID 
  blksz      獲得するブロックのサイズ


返り値
------

以下のエラー番号が返る。

	E_OK      システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。
	E_TMOUT   メモリ取得ができなかった。


機能
----
可変長メモリブロック獲得。

もし、メモリブロックを獲得できなかった場合、すぐに終了する。その場合、
E_TMOUT を返す。



rel_blk  --- 可変長メモリブロック返却


呼び出し形式
------------

ER rel_blk(ID mplid, VP blk)


引数
----

  mplid      メモリブロックを返却するメモリプール ID 
  blk        返却するメモリブロックの先頭アドレス

返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。

機能
----
可変長メモリブロックを返却する。



ref_mpl  --- 可変長メモリプール状態参照


呼び出し形式
------------

ER ref_mpl (ID mplid, T_RMPL *pk_rmpl)


引数
----

  mplid      状態を参照するメモリプール
  pk_rmpl   メモリ状態情報 (返り値)。以下のような構造体で
	    ある。

	    typedef struct t_rmpl
	    {
	      VP            exinf;
	      BOOL_ID       wtsk;
	      INT           frsz;
	      INT           maxsz;
	    } T_RMPL;


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。


機能
----
可変長メモリブロックの状態を参照する。



tget_blk --- 可変長メモリブロック獲得(タイムアウト有)


呼び出し形式
------------

ER tget_blk(ID mplid, INT blksz)


引数
----

  mplid      メモリブロックを獲得するメモリプール ID 
  blksz      獲得するブロックのサイズ


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した
	E_ID      不正 ID 番号 (mplid が不正)
	E_OBJ     ID を指定した可変長メモリ ID が存在しない。
	E_TMOUT   メモリ取得ができなかった(タイムアウト)。


機能
----

可変長メモリブロック獲得。

本システムコールは、まだできていない。現在のところ、pget_blk システム
コールとして動作する。


4.2.5 システム管理機能

get_ver --- バージョン番号取得


呼び出し形式
------------

ER get_ver (T_VER *ver)


引数
----

  ver	ITRON のバージョン番号(返り値)


返り値
------

以下のエラー番号が返る。

	E_OK     システムコールは正常に終了した


機能
----

ITRON のバージョンを返す。

get_ver システムコールは、バージョンを次の構造体のデータとして返す。

	typedef struct t_ver
	{
	  UH    maker;
	  UH    id;
	  UH    spver;
	  UH    prver;
	  UH    prno[4];
	  UH    cpu;
	  UH    var;
	} T_VER;

4.2.6 仮想記憶管理

元の μ ITRON 3.0 仕様では、仮想記憶についての仕様は規定してありません。

    仮想記憶管理操作関数一覧
    ========================

    システムコール名			機  能
      vcre_reg  	     リージョンの生成             
      vdel_reg  	     リージョンの削除             
      vmap_reg  	     リージョンのマップ           
      vunm_reg  	     リージョンのアンマップ       
      vdup_reg  	     リージョンの複製を作る       
      vprt_reg  	     リージョンのプロテクト情報の設定
      vshr_reg  	     タスク間でのリージョンの共有 
      vput_reg  	     リージョンへの書き込み       
      vget_reg  	     リージョンからの読み込み     
      vsts_reg  	     リージョンの情報             

なお、95/11/1 現在これらのシステムコールはまだインプリメントされていま
せん。


vcre_reg --- リージョンの生成

  
呼び出し形式
------------

ER vcre_reg (id, start, min, max, perm, handle)


引数
----

	id         リージョンを生成するタスク
	start      リージョンの先頭仮想アドレス
	min        リージョンの最小サイズ(初期サイズ)
	max        リージョンの最大サイズ
	perm       リージョンの permission
	handle     マップされていない仮想ページにアクセスした時の処
                   理を指定する 


機能
----

引数に指定したとおりの新しいリージョンを作成する。

新しく作成したリージョンは、引数 id で指定したタスクに結びつける。

もし、引数で指定した仮想アドレス領域にすでに別のリージョンが存在した場
合にはエラーとなる。 

なお、このシステムコールを発行した時点では、仮想メモリだけが確保され実
メモリはマッピングされない。


返り値
------

以下のエラー番号が返る。


	E_OK     リージョンの確保に成功  
	E_NOMEM  メモリが不足している
	E_ID     引数で指定したタスク ID が不正
	E_NOSPT  本システムコールは、未サポート機能である
	E_OBJ    すでに別のリージョンが仮想アドレス領域上に存在している



vdel_reg --- リージョンの削除


呼び出し形式
------------

ER vdel_reg (id, start) 


引数
----

  id     削除するリージョンをもつタスク
  start  削除するリージョンの先頭アドレス


返り値
------

以下のエラー番号が返る。

	E_OK     リージョンの削除に成功  
	E_ID     引数 id に対応するタスクが存在しない
	E_NOSPT  本システムコールは、未サポート機能である


機能
----

引数 start で指定したアドレス領域を管理するリージョンを削除する。
削除したリージョンに含まれる領域中のデータは破棄する。

start の値で指定したアドレスは、リージョンの先頭アドレスである必要はな
い。リージョン内のアドレスならば、どのリージョンを指定したかをシステム
コール内で判断する。


vmap_reg --- リージョンのマップ


呼び出し形式
------------

ER vmap_reg (id, start, size)


引数
----

  id        タスク ID
  start     マップする仮想メモリ領域の先頭アドレス
  size      マップする仮想メモリ領域の大きさ(バイト単位)


返り値
------

以下のエラー番号が返る。

	E_OK     リージョンのマップに成功  
	E_NOMEM  (物理)メモリが不足している
	E_NOSPT  本システムコールは、未サポート機能である。


機能
----

引数で指定したアドレス領域に物理メモリを割り付ける。

複数のページに相当するサイズが指定された場合、全て
のページがマップ可能のときのみ物理メモリを割り付け
る。その他の場合は割り付けない。

マップする物理メモリのアドレスは指定できない。中心核が仮想メモリに割り
付ける物理メモリを適当に割り振る。



vunm_reg --- リージョンのアンマップ


呼び出し形式
------------

Er vunm_reg (id, addr, size)


引数
----

  id   リージョンをもつタスク
  addr アンマップする仮想メモリ領域の先頭アドレス
  size アンマップする仮想メモリ領域のサイズ(バイト単位)

返り値
------

以下のエラー番号が返る。

	E_OK     アンマップに成功  
	E_ID     引数 id に対応するタスクが存在しない
	E_NOSPT  本システムコールは、未サポート機能である


機能
----

引数 id で指定したタスクに附属するリージョンの物理メモリのマップを
解除する。

物理メモリの内容は、破棄される。



vdup_reg --- リージョンの複製を作る


呼び出し形式
------------

ER vdup_reg (src, dst, start)


引数
----

  src    複製するリージョンをもつタスク
  dst    リージョンの複製先のタスク
  start  複製するリージョンの先頭アドレス


返り値
------

以下のエラー番号が返る。

	E_OK     リージョンの複製に成功  
	E_NOSPT  本システムコールは、未サポート機能である。


機能
----

指定したタスクのもつリージョンを複製する。

複製したリージョンは、全く別のものとして扱われる。
src, dst のどちらかのタスクがリージョンの領域を変更しても、もう片方の
タスクは影響を受けない。



vprt_reg --- リージョンのプロテクト情報の設定


呼び出し形式
------------

ER vprt_reg (id, start, prot)


引数
----

  id     リージョンをもつタスク
  start  リージョンの先頭仮想アドレス
  prot   プロテクト情報

返り値
------

以下のエラー番号が返る。

	E_OK     リージョンのプロテクト情報の設定に成功  
	E_NOSPT  本システムコールは、未サポート機能である。


機能
----

リージョンに含まれるすべての仮想メモリページのプロテクト情報を設定する。

プロテクト情報としては以下の値が指定できる。

	VPROT_READ    読み込み可能
	VPROT_WRITE   書き込み可能
	VPROT_EXEC    実行可能

vshr_reg --- タスク間でのリージョンの共有


呼び出し形式
------------

ER vshr_reg (src, dst, start)


引数
----

  src    共有元のリージョンをもつタスク
  dst    新たにリージョンを共有するタスク
  start  リージョンの先頭アドレス


返り値
------

以下のエラー番号が返る。

	E_OK     リージョンの共有に成功  
	E_NOSPT  本システムコールは、未サポート機能である。


機能
----

引数 src で指定したタスクのもつリージョンを引数 dst で指定したタスクに
割り当てる。割りあてたリージョンは共有される。

共有されたリージョンに含まれる仮想アドレス領域には、タスク間で同じ物理
アドレスを割り当てる。そのため、片方のタスクが仮想アドレス領域内の情報
を変更した場合、他方のタスクにも反映される。



vput_reg --- リージョンへの書き込み


呼び出し形式
------------

ER vput_reg (id, start, size, buf) 


引数
----

  id     リージョンを持つタスク
  start  書き込む領域の先頭アドレス
  size   リージョンに書き込むサイズ
  buf    リージョンに書き込むデータ


返り値
------

以下のエラー番号が返る。

	E_OK     リージョンへの書き込みに成功  
	E_ID     引数 id に対応したタスクは存在しない
	E_NOSPT  本システムコールは、未サポート機能である


機能
----

任意のタスクの仮想メモリ領域にデータを書き込む。

ページインなどに使用できる。


vget_reg --- リージョンからの読み込み


呼び出し形式
------------

ER vput_reg (id, start, size, buf) 


引数
----

  id     リージョンを持つタスク
  start  読み込む領域の先頭アドレス
  size   リージョンから読み込むサイズ
  buf    リージョンから読み込んだデータを収めるバッファ


返り値
------

以下のエラー番号が返る。

	E_OK     成功  
	E_ID     リージョンをもつタスク
	E_NOSPT  本システムコールは、未サポート機能である


機能
----

任意のタスクの仮想メモリ領域からデータを読み込む。

ページアウトなどに使用できる。


vsts_reg --- リージョンの情報


呼び出し形式
------------

ER vsts_reg (id, start, stat)


引数
----

  id     リージョンをもつタスク
  start  リージョンの先頭アドレス
  stat   リージョン情報が入る(リージョン情報の詳細は未決定である)

返り値
------

以下のエラー番号が返る。

	E_OK     リージョンの情報の取得に成功  
	E_ID     引数 id で指定したタスクは存在しない
	E_NOSPT  本システムコールは、未サポート機能である


機能
----

リージョンの情報を取得する。

リージョン情報としては次のものが考えられる。

	リージョンの先頭仮想アドレス
	リージョンのサイズ
	プロテクト情報




------------------------------------------------------------------------------
  5 エラー番号
------------------------------------------------------------------------------



  エラー名	   エラー値	意味

  E_OK    	    0       	 正常終了
  E_SYS   	    (-5)    	 システムエラー      
  E_NOMEM 	    (-10)   	 メモリ不足          
  E_NOSPT 	    (-17)   	 未サポート機能      
  E_INOSPT 	    (-18)   	 ITRON/FILE での未サポート機能
  E_RSFN  	    (-20) 
  E_RSATR 	    (-24) 
  E_PAR   	    (-33) 
  E_ID    	    (-35) 
  E_NOEXS 	    (-52) 
  E_OBJ   	    (-63) 
  E_MACV  	    (-65) 
  E_OACV  	    (-66) 
  E_CTX   	    (-69) 
  E_QOVR  	    (-73) 
  E_DLT   	    (-81) 
  E_TMOUT 	    (-85) 
  E_RLWAI 	    (-86) 


