NEC ELECTRONICS NEC ELECTRONICS
NEC electronics NEC electronics NEC
ホーム
アプリケーション
製品情報
先端技術
サポート
WEBショップ
ニュース&イベント
会社案内
header
GO
詳細検索機能/特性検索
サイトマップ お問い合わせ

リンク/メモリ・マッピング関連


目次

    
FAQ-ID = 78k0-nnn
156: リンク・ディレクティブついて。
175: 内部拡張RAMにデータを配置したいのですが?
541: 外部メモリ空間に変数を配置したいのですが、リンク時にエラーになります。
71: スタックの設定について。
543: スタックが、どこに割り当たっているか確認できますか?
492: テーブル・データをROM領域だけに割り当てるにはどうすればよいですか?
614: マイコン内部のフラッシュは特定のプログラム・コードを書き込んで置き、プログラム改変の際には外部フラッシュROMのみを書き換えるようできますか?
313: Cソースで、アドレス80H〜7FFHまでにプログラムを配置するには?
341: C言語で実体定義をしたいのですが、実体が定義した順番に配置されません。
148: リンク時に、エラー・メッセージ A402 File ’ファイル名’ has no string table for symbol が表示されます。
227: リンク時に、エラー・メッセージ A901 Can’t open overlay file ’ファイル名’が表示されます。
101: リンク時に、エラー・メッセージ A903 Can’t read input file ’ファイル名’ が表示されます。
338: リンク時に、エラー・メッセージ F206 Segment ’@@DATA’ can’t allocate to memory-ignored. が表示されます。
70: リンク時に、エラー・メッセージ F304 Operand out of range (segment ’セグメント名’,address xxxxH、 type ’アドレシング・タイプ’) が表示されます。
217: リンク時に、エラー・メッセージ F305 Even value expected (segment ’セグメント名’,address xxxxH、type’アドレッシング・タイプ’) が表示されます。
189: リンク時に、エラー・メッセージ F405 Undefined symbol ’シンボル名’ in file ’ファイル名’ が表示されます。
107: リンク時に、エラー・メッセージ F403 Symbol ’シンボル名’ unmatched type in file ’ファイル名1’. First defined in file ’ファイル2’ と表示されます。

78k0
-156
リンク・ディレクティブついて。
Q
リンク・ディレクティブにてRAM領域を2箇所指定する場合、メモリ領域名は、 たとえばRAMとMEM1になりますが、このSFRを含むメモリ領域名「RAM」は固定の名前ですか?
RAMとMEM1を入れ換えることはできますか?
A
できません。
必ず「RAM」という領域にSFRが含まれるようにリンク・ディレクティブを記述してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-175
内部拡張RAMにデータを配置したいのですが?
Q
C言語で内部拡張RAMにデータを配置したいのですが、どうすればよいですか?
A
Cソース中で内部拡張RAMに割り当てたいデータを別名セクションに配置するように指定し、 リンク・ディレクティブを以下の例のように指定してください。

(Cソース例)
#pragma section @@DATA IXDATA
int i;  /* 内部拡張RAMに配置するデータ */
#pragma section @@DATA @@DATA
int j;  /* 内部高速RAMに配置するデータ */

(リンク・ディレクティブ例)
memory IXRAM : ( 0F400H, 400H )
merge  IXDATA := IXRAM

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-541
外部メモリ空間に変数を配置したいのですが、リンク時にエラーになります。
Q
外部メモリ空間に変数を配置したいのですが、リンク時に次のエラーになります。

*** ERROR F206 Segment ’セグメント名’ can’t allocate to memory - ignored.

次のようにアセンブラで定義していますが、どのように変更すればよろしいですか?
		PUBLIC _val0,_val1
	DATASEG	DSEG	AT 0F100H
	_val0:	DS	2
	_val1:	DS	2
		END
A
外部メモリ空間を使用する場合には、メモリ領域を定義する必要があります。
(内蔵ROM、内蔵RAMはデフォルトで定義されています)

外部メモリ空間のメモリ領域が定義されていないために、リンク時にエラーになっています。

リンク・ディレクティブで外部メモリ領域の定義をして、その領域にセグメントを配置するように指定してください。
	MEMORY ERAM :(0F100H,0100H)
	MERGE DATASEG := ERAM

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-71
スタックの設定について。
Q
スタックの設定はリンク・ディレクティブで行うのと、 スタートアップ・ルーチンで行うものと、メイン処理の中で行うものと、 どれが優先的に行われるのですか?
それともすべてで行わなければならないのですか?

たとえば以下のように異なるところにスタックの設定をした場合はどうなりますか?
--- cstart.asm (スタートアップ・ルーチン)---
MOVW    AX, #0FE20H		;0FE20hに設定
MOVW    SP, AX

--- lk78k0s.dr(リンク・ディレクティブ) ---
memory STACK : (0FE00H, 30H)	;0FE30hに設定

また、スタックがどこに割り当たっているかを確認できますか?
A
リンク・ディレクティブでは、スタックを設定していません。
単に、STACKという名前の領域を確保しているだけです。
領域の確保を行わないとその領域は使用できないので、確保は必要です。

なお、スタック・ポインタは、0FE20hに設定されています。

上記の記述では、STACKとして領域が確保されていることが、 スタック・エリアが確保されていることの確認になります。

なお、スタックを設定する別の方法として、リンクする際に、-S オプションを指定すると、 スタック・エリアの両端を
定義するシンボルが生成されます。
   -SSTACK
     ~~~~~ <-ディレクティブで定義した、スタック用の領域
この場合のスタック・ポインタの設定は
   MOVW    AX, _@STBEG	;リンカが生成したシンボル
   MOVW    SP, AX
とします。

また、リンカでパブリックシンボルを.mapに出力すると(-kp)、スタック・エリアが確認できます。

_@STBEG 〜 _@STEND の空間がスタック・エリアとなります。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-543
スタックが、どこに割り当たっているか確認できますか?
Q
リンカのスタック解決用シンボル生成-Sオプションを使用しています。
スタックが、どこに割りあたっているか確認できますか?
A
スタック解決用シンボル生成-Sオプションを使用している場合には、 スタックの最下位アドレスの値を持つ「_@STEND」シンボルが、最上位アドレス+1の値を持つ 「_@STBEG」シンボルが生成されます。

543.jpg

リンカの-KP オプションを指定して、リンク・リスト・ファイル中に、 パブリック・シンボル・リストを出力するように指定してください。
上記の「_@STEND」シンボルと「_@STBEG」シンボルの間が、スタック領域になります。

*** Public symbol list ***

MODULE  ATTR    VALUE   NAME

        NUM     FE20H   _@STBEG 
        NUM     FB7EH   _@STEND

-78K0- -78K0S- -78K4- -78K0R-

この情報はお役にたちましたか?
back to top  

78k0
-492
テーブル・データをROM領域だけに割り当てるにはどうすればよいですか?
Q
テーブル・データをROM領域だけに割り当てるにはどうすればよいですか?
A
型修飾子 const を使用して宣言してください。

例)
const unsigned char table_data[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-614
マイコン内部のフラッシュは特定のプログラム・コードを書き込んで置き、プログラム改変の際には外部フラッシュROMのみを書き換えるようできますか?
Q
マイコン内部のフラッシュROMを書き換えることは手間が掛かるため、 マイコン内部のフラッシュROMについては特定のプログラム・コードを書き込んでおき、 プログラム改変の際に外部フラッシュROMのみを書き換えるようにすることはできますか?
A
マイコン内部のフラッシュROMには、ベクタ領域に絶対番地指定の ジャンプ命令のみを書き込んでおき、 その他のプログラムはすべて外部フラッシュROMに配置すれば、 外部フラッシュROMのみを書き換えるだけで問題ありません。

ただし、外部フラッシュROMの内容を書き換えた場合、 ジャンプ先のアドレスの不一致が起きないように注意する必要があります。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-313
Cソースで、アドレス80H〜7FFHまでにプログラムを配置するには?
Q
Cソースで、アドレス80h〜7ffhまでにプログラムが配置できません。

上記のセグメントは、@@R_INISとして高速RAM領域の変数の初期値として確保されているようですが、 初期値あり変数は使用していないので、上記セグメントにプログラムを配置したいのですが、 どのような指定を行えばよいですか?
A
800H〜をCALLFエントリ領域として使用しているか否かによって配置方法が異なります。
以下の中から、該当する方法を使用してください。

・callf関数を800H〜に配置していない場合

リンク・ディレクティブを
merge @@CALF : AT (80H)
と指定してください。

・callf関数を800H〜に配置している場合

リンク・ディレクティブを
memory VCT  : (00000H, 00040H)
memory CLT  : (00040H, 00040H)
memory ROM1 : (00080H, 00780H)
memory ROM  : (00800H, 0B800H)
merge CODE1 := ROM1
のように指定し、80H〜7FFHに配置する関数(以下の例ではfunc)を以下のように記述して
ください。
メモリ領域名VCT、CLT、ROM1、セクション名CODE1は、別の名前でも構いません。
#pragma section @@CODE CODE1
void func()
{
    ...
}
@@CODEセクションについては、Cソースの先頭以外に#pragma sectionを記述できないので、 CODE1セクションに配置したい関数のみを別ファイル化し、Cソースの先頭に
#pragma section @@CODE CODE1
を記述してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-341
C言語で実体定義をしたいのですが、実体が定義した順番に配置されません。
Q
メモリ配置についてですが、C言語で実体定義をしたいと考えています。
実体が定義した順番に配置されないのですが、どうすればよいですか?
A
配置を指定するには、C言語ではなく、アセンブリ言語で本体を定義してください。
この時、シンボルは"_"で始まる名前にして、public宣言をしてください。


C言語の場合は、"_"を取った名前をextern宣言してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-148
リンク時に、エラー・メッセージ A402 File ’ファイル名’ has no string table for symbol が表示されます。
Q
リンク時に、エラー・メッセージ

A402 File ’ファイル名’ has no string table for symbol

が表示されます。
A
CとASMソースが混在する場合で、シンボル定義とそれを参照しているモジュールが複数ある場合に、 ASM記述のEXTRNが最初に出現すると、このエラーが発生する場合があります (リンクの順番が異なっても、externと実体を1つに減らしてもエラーは表示されません)。

回避策として、CのモジュールをASMのモジュールより先に指定してリンクしてください。
また、プロジェクト・マネージャ上では、Cソースを優先してソース登録してください。
ただし、スタートアップ・ルーチンを使用されている場合は、 スタートアップ・ルーチンを一番最初にリンクするようにしてください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-227
リンク時に、エラー・メッセージ A901 Can’t open overlay file ’ファイル名’が表示されます。
Q
リンク時に、エラー・メッセージ

A901 Can’t open overlay file ’ファイル名’

が表示されます。
A
アセンブラ・パッケージを再インストールしてみてください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-101
リンク時に、エラー・メッセージ A903 Can’t read input file ’ファイル名’ が表示されます。
Q
リンク時に、エラー・メッセージ

A903 Can’t read input file ’ファイル名’

が表示されます。
A
ライブラリ・ファイルが大きすぎます。分割してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-338
リンク時に、エラー・メッセージ F206 Segment ’@@DATA’ can’t allocate to memory-ignored. が表示されます。
Q
リンク時に、エラー・メッセージ

F206 Segment ’@@DATA’ can’t allocate to memory-ignored.

が表示されます。

(リンク・ディレクティブ情報)
MEMORY ROM:(00000H, 0EFFFH)
MEMORY IXRAM:(0F000H, 07FFH)
MERGE @@CNST:AT(09a0H)=ROM
MERGE @@DATA:AT(0f000H)=IXRAM
... 途中省略 ...
  MEMORY=IXRAM
  BASE ADDRESS=F000H    SIZE=07FFH
         OUTPUT   INPUT    INPUT      BASE      SIZE
         SEGMENT  SEGMENT  MODULE     ADDRESS
         ZUNIT                        F000H     0020H   DSEG AT
                  ZUNIT    MONITOR    F000H     0020H
* gap *                               F020H     07DFH

... 途中省略 ...
*** Not allocated segment ***

SEGMENT   SIZE     TYPE         MEMORY
@@DATA    0336H    DSEG UNITP   IXRAM
なぜgapが空いているのに、上記のように配置できないのですか?
A
MERGE @@DATA:AT(0f000H)=IXRAM
この命令は、「IXRAM内の"0F000H"に割り当てる」というものです。

マップ・ファイルから、0F000H番地には"ZUNIT"というセグメントが先に割り当たっていることが確認できます。
(DSEG AT 0F000Hで指定されています。)
その結果、アドレスが重なっているので、リンカが0F000番地に@@DATAを割り当てることができず、エラーとなっています。

リンク・ディレクティブを
MERGE @@DATA:=IXRAM   ;「IXRAM内に割り当てる」
と変更すれば、正常にリンクできます。

もし、@@DATAが0F000Hになければならないという場合は、ZUNITの配置場所を移動し、 0F000H番地を空けてください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-70
リンク時に、エラー・メッセージ F304 Operand out of range (segment ’セグメント名’,address xxxxH、 type ’アドレシング・タイプ’) が表示されます。
Q
リンク時に、エラー・メッセージ

*** ERROR F304 Operand out of range (segment ’?CSEG’, address xxxxH, type ’saddrp’)

が表示されます。
A
F304 が出力された場合の該当箇所は、次の手順で探すことができます。

  1. リンカが出力した.MAPを参照し、エラーのaddressに該当するモジュールを特定する。


  2. 該当モジュールのスタート・アドレスを.mapで確認し、エラーとなっているアドレスと見比べて、 モジュールの最初から何バイトのところでエラーになっているかを計算する。


  3. .prnを参照し、2で求めたアドレスの行を探す。


-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-217
リンク時に、エラー・メッセージ F305 Even value expected (segment ’セグメント名’,address xxxxH、type’アドレッシング・タイプ’) が表示されます。
Q
リンク時に、エラー・メッセージ

*** ERROR F305 Even value expected (segment ’セグメント名’, address xxxxH, type ’saddrp’)

が表示されます。
A
movw saddrp,axのようにワード単位で参照される変数が、 CソースではBYTE型の配列で定義されているためです。

1バイトの型の配列は1バイト・アラインであり、奇数番地に割り当たる可能性があります。

2バイトの型に変更してください。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  

78k0
-189
リンク時に、エラー・メッセージ F405 Undefined symbol ’シンボル名’ in file ’ファイル名’ が表示されます。
Q
78K0でリンク時に、エラー・メッセージ

F405 Undefined symbol ’_printf’ in file ’ファイル名’

が表示されます。

浮動小数点数の演算を行うと、

F405 Undefined symbol ’@@fadd’ in file ’ファイル名’
F405 Undefined symbol ’@@fcmp’ in file ’ファイル名’

も表示されます。
A
ライブラリcl0.libをリンクしてください。
浮動小数点演算を行う場合は、cl0.libに加えて、cl0f.libもいっしょにリンクしてください。

-78K0-

この情報はお役にたちましたか?
back to top  

78k0
-107
リンク時に、エラー・メッセージ F403 Symbol ’シンボル名’ unmatched type in file ’ファイル名1’. First defined in file ’ファイル2’ と表示されます。
Q
リンク時に、エラー・メッセージ

F403 Symbol ’シンボル名’ unmatched type in file ’ファイル名1’. First defined in file ’ファイル2’

と表示されます。
A
Cソース中の関数名が24文字以上の場合、ASM文で31文字以上のシンボルとなっている場合や、 割り込み関数名が8文字以上の場合に、このエラー・メッセージが表示されることがあります。

-78K0- -78K0S- -78K4-

この情報はお役にたちましたか?
back to top  





















 ご利用にあたって  個人情報保護について  RSS       © 1995-2008  NEC Electronics Corporation