• 検索結果がありません。

ロケータは、次のラベルを参照するとき、それぞれのラベルにアドレスを割り当てます。

__lc_cp: コピーテーブルの開始。コピーテーブルは、コピーするセクションのソースアドレスと

デスティネーションアドレスを指定します。このテーブルは、このラベルが使用される 場合に限り、ロケータによって生成されます。

__lc_bs: スタック空間の開始(キーワードstackを使用)。

__lc_es: スタック空間の終了。スタックポインタの初期化。

__lc_b_name: セクションnameの開始。

__lc_e_name: セクションnameの終了。

__lc_u_name: ユーザ定義ラベル。このラベルは記述ファイルで定義します。例を示します。

label mylab;

__lc_ub_name:ユーザ定義ラベルの開始。このラベルは記述ファイルで定義します。例を示します。

label mybuffer length=100;

__lc_ue_name:ユーザ定義ラベルの終了。

4.9.1 ロケータラベルのリファレンス

この節では、すべてのロケータラベルについて説明します。ロケータラベルは、__lc_が最初に付きます。

これらのラベルは、リンカでは無視されて、ロケート時に解決されます。これらのラベルには、セクショ ンの最初と最後に実際に置かれるラベルになるものもあります。他のラベルについては、ロケータ生成デー タをアドレスするときにも使用できるようになっています。これらのデータは、ラベルが使用されるとき に限り生成されます。

__lc_が最初に付くラベルは、リンカとロケータで扱い方が変わるため、この種のラベルは、定義用ではな く参照用として使用します。

注: Cのレベルでは、すべてのロケータラベルの最初にアンダースコア( ̲ )が1つ付いています(コンパイ ラがアンダースコアをもう1つ追加する)。

__lc_b_section, __lc_e_section

構文:

extern unsigned char _lc_b_section[ ];

extern unsigned char _lc_e_section[ ];

説明:

プログラム内のセクションsectionのアドレスを取得するときに、一般ロケータラベル__lc_b_sectionと __lc_e_sectionを使用することができます。bバージョンは、セクションの最初をポイントし、eバージョ ンは、セクションの最後をポイントします。

セクション名の前のドットをアンダースコア(̲)で置換することにより、これらのラベルに"C"からアク セスできるようになります。ただしこの変換により、名前の競合が発生する可能性があります。たとえ ば、セクション.textとセクション_textの両方が存在する場合、一般ラベル__lc_b_textは、

_textの最初に設定されます。そのためセクション.textのラベルは、アセンブリレベルでのみ実際の 名前によって使用することができます。このような競合は、もちろん回避する必要があるため、アン ダースコアが最初に付くセクション名は使用しないようにします。

例:

Printf ("Text size is 0x%x¥n", _lc_e__text-_lc_b__text);

__lc_bh, __lc_eh

構文:

extern unsigned char _lc_bh[ ];

extern unsigned char _lc_eh[ ];

説明:

すべてのロケータhラベルは、ヒープに関連しています。ヒープは、クラスタの記述で定義することに よって割り当てることができます。DELFEEキーワードheapも参照してください。

__lc_bhは、ヒープの最初に置かれるラベルです。"C"レベルの場合、_lc_bhはヒープを表します。この ラベルはchar配列として定義されますが、任意の基本型の配列として定義することができます。__lc_eh は、ヒープの最後を表します。

例:

ヒープの定義

block total_range { .

.

cluster ram { amode data {

heap length = 200;

. } } . }

sbrkコード

extern unsigned char _lc_bh[];

extern unsigned char _lc_eh[];

static char *

sbrk( long length ) { .

.

if ( (lastmem + length) > _lc_eh ) { return (char *) -1; /* overflow */

}

__lc_bs, __lc_es

構文:

extern unsigned char _lc_bs[ ];

extern unsigned char _lc_es[ ];

説明:

すべてのロケータsラベルは、スタックに関連しています。スタックは、クラスタの記述で定義するこ とによって割り当てることができます。DELFEEキーワードstackも参照してください。

__lc_bsは、スタックの最下位アドレスのラベルです。"C"レベルの場合、_lc_bsはスタックの下位アドレ スを表します。このラベルはchar配列として定義されますが、任意の基本型の配列として定義すること ができます。__lc_esは、スタックの最上位アドレスを表します。__lc_esは、__lc_bsより高いアドレスに なります。S1C88のスタックはもっと低いアドレスになるため、実際にはスタックはラベル__lc_esで開 始し、__lc_bsで終了します。

例:

スタックの定義

block total_range { cluster ram { amode data {

stack length = 100;

. } } }

スタックの初期化 __START:

LD SP, #__lc_es ; set stack pointer to begin of stack space

__lc_cp

構文:

extern char* _lc_cp;

説明:

コピーテーブルはプロセスごとに生成されます。このテーブルの各エントリは、コピーまたは消去のア クションを表しています。テーブルのエントリは、次のセクションで、ロケータによって自動的に生成 されます。

- 属性bを持つすべてのセクション。スタートアップ時にクリアされます(クリアアクション)。 - 属性iを持つすべてのセクション。プログラムのスタートアップ時にROMからRAMへコピーされま

す(コピーアクション)。

コピーテーブルのレイアウトは、"4.8  コピーテーブル"に記述されています。タイプcpt-tはlocate.h を定義しています。

__lc_u_identifier

構文:

extern int _lc_u_identifier[ ];

説明:

このロケータラベルは、ユーザがDELFEEキーワードlabelを使用して定義することができます。このラ ベルは、DELFEEファイルで、接頭辞__lc_u_を付けずに定義する必要があります。アセンブリからは接 頭辞__lc_u_を付けてラベルを参照することができ、Cからは接頭辞_lc_u_(最初のアンダースコアが1つ)

を付けて参照できます。

例:

記述ファイルの内容 block total_range {

cluster ram { amode data {

label bstart;

section text;

label bend;

} } . . }

Cからの呼び出し

#include <stdio.h>

extern int _lc_u_bstart[];

extern int _lc_u_bend[];

int main() {

printf( "Size of cluster ram is %d¥n", (long)_lc_u_bend

(long)_lc_u_bstart );

}

__lc_ub_identifier, __lc_ue_identifier

構文:

extern int _lc_ub_identifier[ ];

extern int _lc_ue_identifier[ ];

説明:

これらのロケータラベルは、ユーザがDELFEEキーワードreserved label=を使用して定義することができ ます。このロケータラベルは、予約領域の最初と最後を指定します。identifierは予約領域の名前であり、

DELFEEファイルで、接頭辞__lc_ub_または__lc_ue_を付けずに定義する必要があります。アセンブラか らは接頭辞__lc_ub_および__lc_ue_を付けてラベルを参照することができ、Cからは接頭辞_lc_ub_およ び_lc_ue_(最初のアンダースコアが1つ)を付けて参照できます。

例:

記述ファイルの内容 block address_range {

cluster ram {

attribute w;

amode data {

section selection=w;

reserved label=xvwbuffer length=0x10;

// Start address of reserved area is // label __lc_ub_xvwbuffer

// End address of reserved area is // label__lc_ue_xvwbuffer

} }

}

Cからの呼び出し

#include <stdio.h>

extern int _lc_ub_xvwbuffer[];

extern int _lc_ue_xvwbuffer[];

int main() {

printf( "Size of reserved area xvwbuffer is %d¥n", (long)_lc_ue_xvwbuffer

(long)_lc_ub_xvwbuffer );

}

5 DEscriptive Language for Embedded Environment