3. プログラムをつくろう
3.5 プロジェクトのビルド
作成したファイルがプロジェクトに登録されていることを確認してビルドをします。「ビルド」アイコンをクリッ クしてください。
「リビルド」は全てのソースファイルを コンパイル、アセンブル、リンクします
登録したソースファイル
「ビルド」は変更のあったソースファイル のみをコンパイル、アセンブル、リンクします
図3-16 PM plus : プロジェクトのビルド
シンボルに割り当てられたアドレスの確認
ビルド(オブジェクト・コンバータ)で生成されたシンボル・テーブル・ファイル「a.sym」で、各シンボルに割り当てられた アドレスを確認することができます。
以下は、サンプルプログラムのシンボル・テーブル・ファイル(一部抜粋)です。
#05
;FF PUBLIC 020FC78_?DATA 020FC7A_?DATS 020FC7A_?INIS 020FC7A_?INIT 0100085_?R_INIS 0100088_?R_INIT 020FC56_@BRKADR 020FC46_@DIVR 020FC40_@FNCENT 020FC00_@FNCTBL
a.sym
(生成されたシンボル・テーブル・ファイル) ※一部抜粋78K0/Kx2マイコンのリンク・ディレクティブ
リンク・ディレクティブとは、プログラムのメモリ配置において、デフォルトの設定からの変更の指示(ディレクティブ)をリ ンカに与えることをいいます。
RA78K0 リンカは、アセンブラ、コンパイラが生成するセグメント(コンパイラではセクションと呼びます)を、メモリ領域情 報とセグメント・タイプにしたがってメモリに配置しています。
メモリ領域はデフォルトで FFFFH ~ FB00H が「RAM」、BFFFH ~ 0000H が「ROM」という名称になります。セグメント・
タイプはデフォルトで以下のようになります。(下図参照)
FFFFH
FEFFH FE20H FF00H
E000H FB00H
7FFFH 8000H BFFFH C000H
0000H F7FFH
saddr 領域
フラッシュメモリ
(32KByte) ROM
BANK0〜5 IXRAM
フラッシュメモリ バンク0〜5 (16KByte×6) 内部拡張RAM
(6KByte) SFR
内部高速RAM (1KByte)
RAM デフォルトの メモリ領域名 78K0/Kx2マイコン
(μPD78F0537)のメモリ
リンカの管理するメモリ領域、セグメント・タイプ
saddr領域 : short direct addressing領域 BSEG : ビット・セグメント DSEG : データセグメント CSEG : コードセグメント
デフォルトの
セグメント・タイプ アセンブラが生成する セグメント
コンパイラが生成する セクション
CSEG DSEG
BSEG ?DSEG
?CSEG
DSEGIX CSEGIX
@@INIT
@@DATA リンカが各セグメント、セクション の割り当てられているメモリ領域、
セグメント・タイプにしたがって 配置する
メモリ・ディレクティブ、セグメント配置ディレクティブ
リンク・ディレクティブには、メモリ・ディレクティブ、セグメント配置ディレクティブがあります。各ディレクティブを記述 するファイルは拡張子に「.dr」を付け、リンカオプション「-d」でファイル名を指定します。
<メモリ・ディレクティブ>
メモリ・ディレクティブとは、メモリ領域の変更を指示するディレクティブです。デフォルトの「ROM」、「RAM」領域に加えて、
新しい領域を確保する場合は、新しい領域を引いた「ROM」、「RAM」領域を改めて設定する必要があります。アセンブラ、コン パイラが生成する各セグメントは、デフォルトで「ROM」、「RAM」メモリ領域内の、該当するセグメント・タイプが設定されて いるアドレスに配置されるからです。新しく設定したメモリ領域にセグメントを配置したい場合は、セグメント配置ディレクティ ブで設定する必要があります。セグメント配置ディレクティブを設定しない場合は、セグメントはなにも配置されません。
<セグメント配置ディレクティブ>
セグメント配置ディレクティブとは、セグメントの配置情報の変更を指示するディレクティブです。デフォルトでは、アセンブ ラ、コンパイラが生成するセグメント(コンパイラの場合はセクション)は、「ROM」、「RAM」メモリ領域内の各セグメント・
アセンブラ、C 言語でのセグメント(セクション)に関する設定
アセンブラ、C 言語のソース・ファイルで、セグメント(セクション)の設定を記述することができます。アセンブラで記述で きる設定は、新しいセグメントの定義、セグメントの配置情報の変更です。C 言語で記述できる設定は、デフォルトのセクション 名と配置先の変更です。アセンブラではセグメント定義擬似命令、C 言語では拡張機能 #pragma section で記述します。
メモリ領域とセクションの配置状況
ビルド(リンカ)で生成されるリンク・リスト・ファイル「a.map」でメモリ領域とセクションの配置状況を確認することがで きます。
*** Memory map ***
SPACE=REGULAR MEMORY=ROM
BASE ADDRESS=00000H SIZE=08000H
OUTPUT INPUT INPUT BASE SIZE SEGMENT SEGMENT MODULE ADDRESS
@@VECT00 00000H 00002H CSEG AT @@VECT00 @cstart 00000H 00002H @@CALT 00002H 00000H CSEG @@CALT @cstart 00002H 00000H @@CALT initial 00002H 00000H @@CALT main 00002H 00000H @@CALF 00002H 00000H CSEG @@CALF @cstart 00002H 00000H @@CALF initial 00002H 00000H @@CALF main 00002H 00000H
* gap * 00002H 0007EH OPT_SET 00080H 00004H CSEG AT OPT_SET option 00080H 00004H ONC_SET 00084H 00001H CSEG AT ONC_SET option 00084H 00001H
@@R_INIS 00085H 00000H CSEG UNITP @@R_INIS @cstart 00085H 00000H
@@R_INIS initial 00085H 00000H @@R_INIS main 00085H 00000H @@R_INIS @rom 00085H 00000H
@@CNST 00085H 00000H CSEG UNITP @@CNST @cstart 00085H 00000H
@@CNST initial 00085H 00000H @@CNST main 00085H 00000H
* gap * 00085H 00001H
@@R_INIT 00086H 00002H CSEG UNITP @@R_INIT @cstart 00086H 00000H
@@R_INIT initial 00086H 00000H @@R_INIT main 00086H 00002H @@R_INIT @rom 00088H 00000H
:
MEMORY=STACK
BASE ADDRESS=0FB00H SIZE=00100H
OUTPUT INPUT INPUT BASE SIZE SEGMENT SEGMENT MODULE ADDRESS
* gap * 0FB00H 00100H
option.asm による設定
lk78k0.dr による設定