本ドキュメントは、CrystalRT共通仕様より SH3-Zarusuのために追加されたシステムコールを記述しています。
int code_create(name, top, size, entry) OBJECT_NAME name; BYTE *top; BYTE4 size; BYTE *entry;
先頭番地 | |
大きさ (in Byte) | |
プログラム実行開始番地 |
int code_create_rom(name, top) OBJECT_NAME name; BYTE *top;
topはROM内モジュールへのポインタである。
ROM内モジュール先頭には次の配置情報が、付加されていなければならない。
top---> data.address データの先頭の論理アドレス data.end データの先頭の論理アドレス +データのサイズ data.offset 初期化データのROM上のアドレス bss.address ゼロ初期化データの先頭の論理アドレス bss.end ゼロ初期化データの先頭の論理アドレス +ゼロ初期化データのサイズ entry スタートアドレス XXX000 text code -- リンクされたアドレスに配置されている。 --- entry: --- --- YYYc00 data code ---
プログラムテキスト領域 | |
初期化データ領域 プロセス生成時にメモリを割り付け、 ROMから初期化データをコピーして、論理マップを行なう。 |
|
非初期化データ領域 プロセス生成時にゼロ初期化したメモリを割り付け、論理空間へマップを行なう。 |
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
プログラムテキスト領域 要求に応じて必要なページをRAMに読み込みながら走る。 RAM容量が限られているので、 LRU(Least Recently Used)アルゴリズムを使用してページ管理を行う |
|
初期化データ領域 プロセス生成時にメモリを割り付け、フラッシュメモリから あらかじめ初期化データをコピーして論理マップを行なう。 |
|
非初期化データ領域 プロセス生成時にゼロ初期化したメモリを割り付け、論理空間へマップを行なう。 |
int code_delete(name) OBJECT_NAME name;
OBJECT_NAME proc_fork(start,stack_size) BYTE *start; BYTE4 stack_size;
新プロセスのページテーブルは、
proc_fork()を発行したプロセスと全て共有する。
ただしスタックのページのみは、共有しない。
start は fork してできた、 新しいプロセスのエントリ・ポイントとなる関数へのポインタ。
stack_size は新しいプロセスのスタックサイズ。
現在一般に言われる「スレッド」を作るために使用する。
注意:
UNIX の fork とは、まったく仕様が違う
int self_ungrab_cpu1()
void * proc_log2phy_address(proc, logAdrs) OBJECT_NAME proc; void *logAdrs;
指定されたlogAdrsが、procの触れない部分である時は、NULLが返る。
int memory_stack_fold(sp) char *sp;
char * self_get_sp()
memory_stack_fold()の引数として使用すると便利である
int memory_strip_page(start, size) char *start; int size;
start がページの先頭でなければ、startを含むページは解
放されない。
同様に (start+size-1) がページの終端でなければ、
(start+size-1) を含むページは解放されない。
論理アドレス start から size バイトの領域内に共有メモリがマップ されていた場合、共有メモリは影響を受けない。
char * memory_page_start(logical_address) char *logical_address;
int memory_page_size1(logical_address) char *logical_address;
int data_map_file(name, filename, laddress, size, sh) OBJECT_NAME name; char *filename; BYTE4* laddress; BYTE4 size; int sh;
sh にて 共有指定を行なう。
sh = 1 とすることにより、共有データとして、どのプロセスからも
この論理アドレスを使用して読み出すことができる。
int data_unmap_file(name) OBJECT_NAME name;
void * sys_malloc(size) int size;
void sys_free(p) void *p;
割り込み処理ルーチンからは event_set() が使用できないため、 「イベント・フラグ」というものを使用する。
イベント・フラグは、その生成時にイベントに結びつけられる。
割り込み処理ルーチンにより intrev_set() が発行され、イベント・フラグが
セットされると、そのイベント・フラグに結び付いているイベントに自動的に「1」
がセットされる。
その結果として、そのイベントを event_wait() しているプロセスを「READY」
にすることができる。
void intvec_set(vecno, adr) BYTE4 vecno; BYTE4 *adr;
int intrev_create(name, ev) OBJECT_NAME name; OBJECT_NAME ev;
int intrev_delete(name) OBJECT_NAME name;
void intrev_set(name) OBJECT_NAME name;
イベント・フラグに結び付けられたイベントに対して、 システムによって自動的に
value=1, mask=1, op=EVOP_SETのイベントが発行される。
int dbg_reg_get(name,reg) OBJECT_NAME name; int reg;
void dbg_reg_put(name,reg,value) OBJECT_NAME name; int reg; BYTE4 value;
void dbg_mem_get1(name,address) OBJECT_NAME name; BYTE *address;
void dbg_mem_put1(name,address,value) OBJECT_NAME name; BYTE *address; int value;
int dbg_mem_get4(name,address) OBJECT_NAME name; BYTE4 *address;
void dbg_mem_put4(name,address,value) OBJECT_NAME name; BYTE4 *address; BYTE4 value;
int dbg_break_point_set(name, adrs) OBJECT_NAME name; UBYTE2 *adrs;
int dbg_break_point_clear(name, adrs) OBJECT_NAME name; UBYTE2 *adrs;
int dbg_proc_stop(name) OBJECT_NAME name;
int dbg_proc_resume(name) OBJECT_NAME name;
int dbg_is_proc_breaked(name) OBJECT_NAME name;
void dbg_target_file(filename) char *filename;
デバッグ対象となったファイルがプロセスとして proc_create()された時に、
システム既定のイベント"_dbe"に 0x0001 がevent_set()される。
同時にカーネル中にデバッグ対象ファイル名が保存され、
dbg_get_breaked_filename()によりこのファイル名を得ることができる。
なお、デバッグ対象ファイルから、proc_create()されたプロセスは、 強制的にブレーク状態にされ、proc_start()を発行しても、ブレークしたままである。 デバッガによって、ブレーク状態を解除して、はじめてプログラムの実行を開始する。
void dbg_untarget_file(filename) char *filename;
char * dbg_get_breaked_filename()
ポインタはP1空間へのポインタとなっているので、 そのままファイル名のアクセスに使用できる。
OBJECT_NAME dbg_get_proc_by_code_1st(name) OBJECT_NAME name;
使用中のプロセスがないか、name というコードがない場合は -1 が返る。
OBJECT_NAME dbg_get_proc_by_code_next(name) OBJECT_NAME name;
使用中のプロセスがもうないか、nameというコードがない場合は -1 が返る。
OBJECT_NAME dbg_get_code_by_filename(filename) char *filename;
注意:
XTAL-Rt では、
一つのファイルから複数のコードを create することを禁止していません。
しかし、この機能で、得られるコード名は、システムが探索を行なって、
最初にマッチしたものだけです。
SH3版では、オブジェクト名は、ASCII文字4文字から成り立っている。
注意:
オブジェクト名<->文字列の変換には、
必ず、str_to_name(), name_to_str()を使用しなければ、
各XTAL間でのアプリケーションのソース・コード互換性が保証されない。