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

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


目次

    
FAQ-ID = 78k0-nnn
156: リンク・ディレクティブついて。
175: 内部拡張RAMにデータを配置したいのですが?
541: 外部メモリ空間に変数を配置したいのですが、リンク時にエラーになります。
71: スタックの設定について。
543: スタックが、どこに割り当たっているか確認できますか?
313: Cソースで、アドレス80H〜7FFHまでにプログラムを配置するには?
537: 78K0で汎用レジスタ領域への変数配置を禁止する機能はありますか?
454: マイコンが暴走した時の対策としてROMの空きエリアをNOP命令で埋めて最後にジャンプ命令で初期設定に飛ぶ場合、手入力を行う以外の方法はありますか?
148: リンク時に、エラー・メッセージ A402 File ’ファイル名’ has no string table for symbol が表示されます。
227: リンク時に、エラー・メッセージ A901 Can’t open overlay file ’ファイル名’が表示されます。
101: リンク時に、エラー・メッセージ A903 Can’t read input file ’ファイル名’ が表示されます。
110: リンク時に、エラー・メッセージ F108 Overlapped memory area ’ROM’ and ’ROM_L’ が表示されます。
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’ と表示されます。
540: バージョン・アップ後、@@CALFセグメントがリンク時にE3206エラーになります。
354: "対象外のメモリ領域のため無視する"という内容のエラー・メッセージが表示されます。

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
-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
-537
78K0で汎用レジスタ領域への変数配置を禁止する機能はありますか?
Q
78K0でSADDR領域に変数を配置していたところ、汎用レジスタ領域(0FEE0H)に変数が配置されました。
汎用レジスタ領域への変数配置を禁止する機能はありますか?
A
ありません。
汎用レジスタ領域は、汎用レジスタとして使用しない場合には通常の変数領域として使用できます。そのため通常のRAM領域として扱っています。
汎用レジスタとして使用する場合には、DS疑似命令等で他のデータが配置されないようにしてください。

(例)
	REG     DSEG    AT 0FEE0H
	        DS      20H

-78K0-

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

78k0
-454
マイコンが暴走した時の対策としてROMの空きエリアをNOP命令で埋めて最後にジャンプ命令で初期設定に飛ぶ場合、手入力を行う以外の方法はありますか?
Q
マイコンが暴走した時の対策としてROMの空きエリアをNOP命令で埋めて最後に ジャンプ命令で初期設定に飛ぶ場合、手入力を行う以外の方法はありますか?
A
たとえば、78K0で内部ROM領域: 0〜5FFFHの場合には、以下のようになります。

(1) 5FFBH番地に、初期ルーチンに戻るBR命令を記述したアセンブラ・ソースtest2.asm を以下のように記述する。
    --- test2.asm ---
    CODE    CSEG    AT 5FFBH
            MOVW    AX, !0H     ; 3バイト
            BR      AX          ; 2バイト
            END
    -----------------
(2) 上記モジュールをアセンブルする。
    > ra78k0 -cpXXX test2.asm
(3) ユーザ作成のオブジェクトtest.relといっしょにリンクする。
    > lk78k0 s0l.rel test.rel test2.rel -s -bcl0.lib -otest -ptest
(4) オブジェクト・コンバータで、空いたROM領域にNOP(00H)を充填する。
    > oc78k0 -u00h test.lmf
なお、デバッグの際は、上記(4)で作成した、Hexファイルをダウンロードしてください。
また、シンボル・デバッグのためには、ロード・モジュール・ファイルも続けてダウンロードするようにしてください。

-78K0-

この情報はお役にたちましたか?
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
-110
リンク時に、エラー・メッセージ F108 Overlapped memory area ’ROM’ and ’ROM_L’ が表示されます。
Q
リンク時に、エラー・メッセージ

*** ERROR F108 Overlapped memory area ’ROM’ and ’ROM_L’

が表示されます。
A
リンク・ディレクティブのメモリ領域名の指定方法が間違っています。

デフォルトで定義されているメモリ領域ROMをROM_Lという名前で再定義する場合には、 ROM_LだけでなくROMも定義する必要があります。

デフォルトのROM領域が0H番地〜8000Hサイズで、ディレクティブの設定がない場合、 以下のようにディレクティブを記述したものと解釈されます。
MEMORY ROM:(0H, 8000H)

(1) ROM領域すべてをROM_Lとする場合

デフォルト領域名であるROMは「0番地からサイズ0」と定義する必要があります。
MEMORY ROM :(0H, 0H)
MEMORY ROM_L:(0H、8000H)

(2) ROM領域のうち0番地から1000HサイズまでをROM_Lとする場合。 (1000H番地以降はROM領域とする場合)

ROM_L領域を差し引いた部分が、自動的にROM領域になるわけではありません。
1000H番地以降、残りの7000HサイズをROM領域として定義する必要があります。
MEMORY ROM_L:(0H, 1000H)
MEMORY ROM:(1000H, 7000H)

(3) ROM領域の途中(1000H番地から2000Hサイズ)をROM_Lとする場合

ROM_L領域より前をROM、後をROM1とします。 (同名の領域名を付けることはできません)
MEMORY ROM :(0H, 1000H)
MEMORY ROM_L:(1000H, 1000H)
MEMORY ROM1 :(2000H, 6000H)

-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  

78k0
-540
バージョン・アップ後、@@CALFセグメントがリンク時にE3206エラーになります。
Q
バージョン・アップ後、@@CALFセグメントがリンク時にE3206エラーになります。
A
リンク・ディレクティブの中の@@CALFセグメント記述を削除してください。

(例) MERGE @@CALF:AT(80H)
RA78K0 V3.60からV3.70へのバージョン・アップに伴い、@@CALFセグメントの扱いが変更されました。

V3.60以前では、@@CALFセグメントを、800H番地に配置しようとしていました。
しかし、サイズが0の場合には、800H番地に配置すると、ほかのセグメント配置の際にまたいで配置できなくなります。
そのため、上記のようにリンク・ディレクティブで指定することにより、回避していました。

V3.70では、配置する際にサイズが0の@@CALFセグメントの優先度を低くすることで、分断しないように仕様変更されました。
これにより、上記のリンク・ディレクティブでの指定が必要なくなります。

ただし、V3.60以前での回避したリンク・ディレクティブをV3.70で使用した場合、他のセグメント配置後に、 @@CALFセグメントを配置しようとするため、重なって、E3206のエラーになります。
このような場合には、リンク・ディレクティブの @@CALFセグメントの記述を削除してください。

-78K0-

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

78k0
-354
"対象外のメモリ領域のため無視する"という内容のエラー・メッセージが表示されます。
Q
UPD78F0034Aは外部メモリにアクセスが可能なタイプですが、 ROMを0000h-7FFFh、外部RAMを8000h-F7FFhに設定して使用しようとしています。


ところが、アセンブラが、

   data2   dseg  8000h
   tmp:    ds    2
のところで、“対象外のメモリ領域のため無視する”という内容のエラー・メッセージが表示されます。


外部メモリ領域へのアクセスは、この方法ではできないのですか?

A
これは、リンク・ディレクティブで、 外付けのRAMがあることを宣言していないために表示されるエラー・メッセージです。

エディタを使用して、以下のメモリ・ディレクティブを、リンク・ディレクティブの中に記述します。
   MEMORY RAMEX : (8000H、7800H)
ここで、RAMEXは追加した外部メモリ領域の名前で、すでに使用している名前以外の名前を指定します。
このようにして作成したリンク・ディレクティブを、リンカのオプション -D で指定してください。

詳細については、ユーザーズ・マニュアル RA78K0 操作編の章 「リンカ」の 「リンク・ディレクティブ」、「リンカ・オプション」を参照してください。

-78K0-

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





















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