フレーム無し 関数一覧(フレーム無し) フレーム付き

XTAL RT
SH3 Zaurus
固有仕様
システムコール/ライブラリ
説明書

Ver.-0.750
(MAY/09/2000)
(DEC/14/1995)

(株)アックス
AXE, Inc.



目次


  1. はじめに
  2. システムコール
    プログラム・コード (program code)
    プロセス (process)
    メモリ管理 (memory)
    割り込み (interrupt)
    デバッグ (debugging)
  3. ライブラリ
  4. 関数一覧

I. はじめに

本ドキュメントは、CrystalRT共通仕様より SH3-Zarusuのために追加されたシステムコールを記述しています。


II. システムコール
  1. プログラム・コード (program code)
     
    
    int
    code_create(name, top, size, entry)
    OBJECT_NAME name;
    BYTE *top;
    BYTE4 size;
    BYTE *entry;
     
     
    プログラム・コードを登録する
    top
    先頭番地
    size
    大きさ (in Byte)
    entry
    プログラム実行開始番地


    エラーの時は -1 が返る
     
    
    int
    code_create_rom(name, top)
    OBJECT_NAME name;
    BYTE *top;
     
     
    ROM上のプログラム・コードを登録する

    topはROM内モジュールへのポインタである。
    ROM内モジュール先頭には次の配置情報が、付加されていなければならない。

    
    	  top---> data.address	データの先頭の論理アドレス
    		  data.end	データの先頭の論理アドレス
    					+データのサイズ
    		  data.offset	初期化データのROM上のアドレス
    		  bss.address	ゼロ初期化データの先頭の論理アドレス
    		  bss.end	ゼロ初期化データの先頭の論理アドレス
    					+ゼロ初期化データのサイズ
    		  entry		スタートアドレス
    	  XXX000  text code -- リンクされたアドレスに配置されている。
    		  ---
    	  entry:  ---
    		  ---
    	  YYYc00  data code 
    		  ---
     
    各領域の意味
    text
    プログラムテキスト領域
    data
    初期化データ領域
    プロセス生成時にメモリを割り付け、 ROMから初期化データをコピーして、論理マップを行なう。
    bss
    非初期化データ領域
    プロセス生成時にゼロ初期化したメモリを割り付け、論理空間へマップを行なう。
     
    
    int
    code_create_file(name,filename)
    OBJECT_NAME name;
    char *filename;
     
     
    フラッシュメモリ(ファイル・システム)上のプログラム・コードを登録する

    ファイルの先頭には、モジュールのヘッダが付加されていなければならない。
    モジュールのヘッダは次の通り。

    
    	  header  text.address	テキストの先頭の論理アドレス
    		  text.end	テキストの先頭の論理アドレス
    					+テキストのサイズ
    		  text.offset	テキストのファイル上の位置
                      data.address	データの先頭の論理アドレス
    		  data.end	データの先頭の論理アドレス
    					+データのサイズ
    		  data.offset	初期化データの入っている論理アドレス
    		  bss.address	ゼロ初期化データの先頭の論理アドレス
    		  bss.end	ゼロ初期化データの先頭の論理アドレス
    					+ゼロ初期化データのサイズ
    		  entry		スタートアドレス
    		  ---------
    		  text code
    		  --------
    		  data
     
    各領域の意味
    text
    プログラムテキスト領域
    要求に応じて必要なページをRAMに読み込みながら走る。 RAM容量が限られているので、 LRU(Least Recently Used)アルゴリズムを使用してページ管理を行う
    data
    初期化データ領域
    プロセス生成時にメモリを割り付け、フラッシュメモリから あらかじめ初期化データをコピーして論理マップを行なう。
    bss
    非初期化データ領域
    プロセス生成時にゼロ初期化したメモリを割り付け、論理空間へマップを行なう。
     
    
    int
    code_delete(name)
    OBJECT_NAME name;
     
     
    プログラム・コードを delete する そのコードを使用中のプロセスが存在する場合は、 削除に失敗しエラーとなる。何も変化しない

    エラーの時は -1 が返る
    戻り値
    成功:0
    失敗:コード参照中のプロセスの数



  2. プロセス (process)
     
    
    OBJECT_NAME
    proc_fork(start,stack_size)
    BYTE *start;
    BYTE4 stack_size;
     
     
    新しいプロセスを作り出す。

    新プロセスのページテーブルは、 proc_fork()を発行したプロセスと全て共有する。
    ただしスタックのページのみは、共有しない。

    start は fork してできた、 新しいプロセスのエントリ・ポイントとなる関数へのポインタ。

    stack_size は新しいプロセスのスタックサイズ。

    現在一般に言われる「スレッド」を作るために使用する。

    注意:
    UNIX の fork とは、まったく仕様が違う

     
    
    int
    self_ungrab_cpu1()
     
     
    CPUを開放可能にし、プロセス・スケジューリングを起こす



  3. メモリ管理 (memory)
    (1) DMA 等に対応したドライバを記述するための機能

     
    
    void *
    proc_log2phy_address(proc, logAdrs)
    OBJECT_NAME proc;
    void *logAdrs;
     
     
    procで指定されたプロセス中の、論理空間上のアドレスlogAdrsの 実メモリ上での位置を返す。

    指定されたlogAdrsが、procの触れない部分である時は、NULLが返る。


    エラーの時は -1 が返る




    (2) 不要なスタック領域の解放機能
     
    
    int
    memory_stack_fold(sp)
    char *sp;
     
     
    論理アドレス sp より前の物理ページを解放する

    エラーの時は -1 が返る
     
    
    char *
    self_get_sp()
     
     
    現在のスタックポインタを得る。

    memory_stack_fold()の引数として使用すると便利である


    エラーの時は -1 が返る




    (3) ヒープ中の不要な物理ページの解放機能
     
    
    int
    memory_strip_page(start, size)
    char *start;
    int size;
     
     
    論理アドレス start から size バイトの領域の内側の物理 ページを解放する。

    start がページの先頭でなければ、startを含むページは解 放されない。
    同様に (start+size-1) がページの終端でなければ、 (start+size-1) を含むページは解放されない。

    論理アドレス start から size バイトの領域内に共有メモリがマップ されていた場合、共有メモリは影響を受けない。


    エラーの時は -1 が返る
     
    
    char *
    memory_page_start(logical_address)
    char *logical_address;
     
     
    logical_address を含むページの先頭の論理アドレスを得る。

    エラーの時は (char *)-1 が返る
     
    
    int
    memory_page_size1(logical_address)
    char *logical_address;
     
     
    logical_address を含むページのサイズを得る。
    (1Kbyte または 4Kbyte が返る)

    (注) memory_page_size()は、sh版では使えない。

    エラーの時は -1 が返る




    (4) フラッシュファイル上のデータのマップ機能
     
    
    int
    data_map_file(name, filename, laddress, size, sh)
    OBJECT_NAME name;
    char *filename;
    BYTE4* laddress;
    BYTE4 size;
    int sh;
     
     
    filename で指定されたフラッシュファイル上のデータを 論理アドレス laddress に readonly でマップする。

    sh にて 共有指定を行なう。
    sh = 1 とすることにより、共有データとして、どのプロセスからも この論理アドレスを使用して読み出すことができる。

     
    
    int
    data_unmap_file(name)
    OBJECT_NAME name;
     
     
    マップを解除する。




    (5) 連続した物理メモリを確保する機能
     
    
    void *
    sys_malloc(size)
    int size;
     
     
    連続した size バイトの物理メモリを確保し、P1空間のアドレスを返す。
    エラーの時は NULL が返る
     
    
    void
    sys_free(p)
    void *p;
     
     
    sys_malloc() で確保した物理メモリを解放する。




  4. 割り込み (interrupt)

    割り込み処理ルーチンからは event_set() が使用できないため、 「イベント・フラグ」というものを使用する。

    イベント・フラグは、その生成時にイベントに結びつけられる。

    割り込み処理ルーチンにより intrev_set() が発行され、イベント・フラグが セットされると、そのイベント・フラグに結び付いているイベントに自動的に「1」 がセットされる。
    その結果として、そのイベントを event_wait() しているプロセスを「READY」 にすることができる。

     
    
    void
    intvec_set(vecno, adr)
    BYTE4 vecno;
    BYTE4 *adr;
     
     
    vecno で指定された例外処理ルーチンの先頭アドレス(adr)を登録する
     
    
    int
    intrev_create(name, ev)
    OBJECT_NAME name;
    OBJECT_NAME ev;
     
     
    nameという名前のイベント・フラグをシステム内部に作り、 ev で指定されたイベントと結びつける。

    エラーの時は -1 が返る
    エラー原因の可能性:
    メモリが不足でオブジェクトが作れない。
    指定した名前のオブジェクトが既に存在している。
     
    
    int
    intrev_delete(name)
    OBJECT_NAME name;
     
     
    nameで指定されたイベント・フラグを削除する

    エラーの時は -1 が返る
    エラー原因の可能性:
    指定した名前のオブジェクトが存在しない。
     
    
    void
    intrev_set(name)
    OBJECT_NAME name;
     
     
    nameで指定されたイベント・フラグをセットする

    イベント・フラグに結び付けられたイベントに対して、 システムによって自動的に

    
    	value=1, mask=1, op=EVOP_SET
    	
    のイベントが発行される。




  5. デバッグ (debugging)
    (1)レジスタとメモリの読み書き
     
    
    int
    dbg_reg_get(name,reg)
    OBJECT_NAME name;
    int reg;
     
     
    name で指定されたプロセスの reg で指定されたレジスタの値を返す
     
    
    void
    dbg_reg_put(name,reg,value)
    OBJECT_NAME name;
    int reg;
    BYTE4 value;
     
     
    name で指定されたプロセスの reg で指定されたレジスタに、 値valueを書き込む
     
    
    void
    dbg_mem_get1(name,address)
    OBJECT_NAME name;
    BYTE *address;
     
     
    name で指定されたプロセスの address 番地の1バイトの値を返す
     
    
    void
    dbg_mem_put1(name,address,value)
    OBJECT_NAME name;
    BYTE *address;
    int value;
     
     
    name で指定されたプロセスの address 番地に、 value の最下位1バイトの値を書き込む
     
    
    int
    dbg_mem_get4(name,address)
    OBJECT_NAME name;
    BYTE4 *address;
     
     
    name で指定されたプロセスの address 番地の 4バイトワードの値を返す
     
    
    void
    dbg_mem_put4(name,address,value)
    OBJECT_NAME name;
    BYTE4 *address;
    BYTE4 value;
     
     
    name で指定されたプロセスの address 番地に、 値 value を書き込む




    (2)ブレークポイント
     
    
    int
    dbg_break_point_set(name, adrs)
    OBJECT_NAME name;
    UBYTE2 *adrs;
     
     
    name で指定されたプロセスの adrs 番地にブレーク・ポイントをセットする
     
    
    int
    dbg_break_point_clear(name, adrs)
    OBJECT_NAME name;
    UBYTE2 *adrs;
     
     
    name で指定されたプロセスの adrs 番地のブレーク・ポイントを 無効にする
     
    
    int
    dbg_proc_stop(name)
    OBJECT_NAME name;
     
     
    name で指定されたプロセスをブレーク状態にする
     
    
    int
    dbg_proc_resume(name)
    OBJECT_NAME name;
     
     
    name で指定されたプロセスのブレーク状態を解除する
     
    
    int
    dbg_is_proc_breaked(name)
    OBJECT_NAME name;
     
     
    name で指定されたプロセスがブレーク・ポイントでブレーク状態に 入っているか否かを調べる

    返り値
    ブレーク状態 : 1
    ブレーク状態でない : 0
    エラー : -1




    (3)デバッグ対象ファイル
     
    
    void
    dbg_target_file(filename)
    char *filename;
     
     
    filename で指定されたファイルをデバッグの対象とする

    デバッグ対象となったファイルがプロセスとして proc_create()された時に、 システム既定のイベント"_dbe"に 0x0001 がevent_set()される。
    同時にカーネル中にデバッグ対象ファイル名が保存され、 dbg_get_breaked_filename()によりこのファイル名を得ることができる。

    なお、デバッグ対象ファイルから、proc_create()されたプロセスは、 強制的にブレーク状態にされ、proc_start()を発行しても、ブレークしたままである。 デバッガによって、ブレーク状態を解除して、はじめてプログラムの実行を開始する。

     
    
    void
    dbg_untarget_file(filename)
    char *filename;
     
     
    filename で指定されたファイルをデバッグ対象から解除
     
    
    char *
    dbg_get_breaked_filename()
     
     
    dbg_target_file()で設定されたファイルのうち、 もっとも最近proc_create()されたもののファイル名へのポインタを返す

    ポインタはP1空間へのポインタとなっているので、 そのままファイル名のアクセスに使用できる。





    (4)プロセス名やコード名の検索
     
    
    OBJECT_NAME
    dbg_get_proc_by_code_1st(name)
    OBJECT_NAME name;
     
     
    name で指定されたコードを使用中の最初のプロセスの名前を返す

    使用中のプロセスがないか、name というコードがない場合は -1 が返る。

     
    
    OBJECT_NAME
    dbg_get_proc_by_code_next(name)
    OBJECT_NAME name;
     
     
    name で指定されたコードを使用中の次のプロセスの名前を返す

    使用中のプロセスがもうないか、nameというコードがない場合は -1 が返る。

     
    
    OBJECT_NAME
    dbg_get_code_by_filename(filename)
    char *filename;
     
     
    filename で指定されたファイルを使用しているコードの名前を返す

    注意:
    XTAL-Rt では、 一つのファイルから複数のコードを create することを禁止していません。
    しかし、この機能で、得られるコード名は、システムが探索を行なって、 最初にマッチしたものだけです。



    III. ライブラリ

    1. 名前(name)

      SH3版では、オブジェクト名は、ASCII文字4文字から成り立っている。

      注意:
      オブジェクト名<->文字列の変換には、 必ず、str_to_name(), name_to_str()を使用しなければ、 各XTAL間でのアプリケーションのソース・コード互換性が保証されない。