H8プログラムの作成
1.H8プログラム作成の流れ
H8プログラム作成の流れを以下に示す。
ソースコード
アッセンブラ言語、C言語でデータと処理が記述されたテキストファイル。ソースプログラムともいう。
C言語の場合、main()という関数が一個存在する。
リロケータブル・オブジェクトファイル
ソースコードからコンパイルして生成されたファイル。
ソースコードに特にメモリ番地の指定が無いとき、H8マイコン内での変数の番地(絶対番地)はまだ確定していない。このため「再配置が可能」という意味で「リローケータブル
」という。
なお、ソースコード上で、この変数はこの番地に指定する、などの番地指定があるとき、変数番地が確定しているため、リロケータブルとは呼ばない。
ライブラリ
先のオブジェクトファイルを集めたもの。
コンパイル
ソースコードからオブジェクトファイルを生成する処理。
ロードモジュール
リンクによって生成されるH8マイコンにダウンロードできるプログラムファイル。通常、H8マイコンのプログラムを作成するというとき、プログラムはこのロードモジュールを指す。
拡張子が、。MOTであるものと、。ABSであるものの2種類のファイル形態がある。
リンク
オブジェクトファイルとライブラリを組み合わせて編集・結合処理をしてロードモジュールを生成する処理。このリンク処理でプログラムと変数のメモリ配置が確定する。
すなわちロードモジュールではプログラムと変数のH8マイコン内でメモリ配置番地が確定している。
ダウンロード
ロードモジュールをH8マイコンのメモリに書き込むこと。
ロードモジュール内に、この部分はメモリの何番地に配置する、という情報があるからこの情報に従ってマイコンのメモリに書き込む。
2.プログラムと変数のメモリ割付
プログラムと変数をH8マイコンメモリ内へどう配置するかの指定は、(1)ソースコード内に記述する、(2)リンクのときに指定する、という2つの方法で行われる。
また、どちらの方法をとっても、モリ
配置作業はコンパイラとリンカーの共同作業で、以下の2つのステップで行われる。
(1)メモリブロックへのセクション名割付(コンパイラ)
論理的に、プログラムをメモリブロックの集まりであると見なす。このメモリブロックを「セクション」とよび、これに名前(「セクション名」)を付ける。
テーブル、変数、プログラムなどのメモリブロックへの割付単位はこの「セクション」単位で行なわれる。
セクションの指定には2つの方法がある。
(1)ソースコード上で指定する。
ソースコード上でメモリ割付単位としての「セクション」の名前を記述する。作成されるオブジェクトファイルの内部にセクション名が埋め込まれる。
(2)コンパイルの時に指定する。
コンパイルのとき、特別な指定がなければ、プログラムはPセクション、初期値無し変数はBセクション、初期値あり変数はDセクションとして作成される。
また、
コンパイルのときに、特別にプログラムコード、定数、初期値あり定数などにセクション名を指定する。
作成されるリロケータブル・オブジェクトファイルの内部にセクション名が埋め込まれ
て、以下のようになっている。
section_a
table1
table2
section_b
data1
data2
(2)セクション名に対して絶対番地割り付け(リンカ)
リンクのときに、セクションをどのメモリ番地(H8マイコン内の物理メモリ番地)に割り付けるかを指定する。この指定に基づいてリンクのプログラムがメモリ割付をする。
3.ROM版とRAM版プログラムの作成
プログラムが、再配置可能なリロケータブルオブジェクトだけ作成されていれば、ROM版とRAM版の2つの版が欲しい場合には、上記(2)リンクのときのセクション割付
で番地指定を変えるだけでできる。
ROM版プログラム作成
割り込みテーブル ROM番地へ
割り込み処理関数 ROM番地へ
main()関数 ROM番地へ
定数 ROM番地へ
初期値あり変数 ROM番地へ
初期値なし変数 RAM番地へ
RAM版プログラム作成
割り込みテーブル RAM番地へ
割り込み処理関数 RAM番地へ
main()関数 RAM番地へ
定数 RAM番地へ
初期値あり変数 RAM番地へ
初期値なし変数 RAM番地へ
しかし、ソースコード上で「セクション」での番地
指定が既になされているときは、オブジェクトファイルはリロケータブルではなくなっている。この場合にはリンクでメモリ番地に割り付けることができない。
(例)
ソースコード上で、以下のアッセンブラの特殊な命令を使って、「セクション」での番地指定をする場合がある。
LOCALE
ORG
この場合、作成されるオブジェクトファイルの内部にセクション名と同時にメモリの絶対番地が埋め込まれている。
すなわち、
オブジェクトファイルはリロケータブル(再配置可能)でなくなっている。
こうしたモジュールが混入していると、リンクプログラムはプログラムを自由に再配置できない。
今回の実験で使用するHEWでは、ベクタテーブルの指定にはこの方法が採用されている。したがって、HEWではROM版とRAM版のプログラムを
リンク時の設定変更だけで簡単に作成できない。
別別のソースコードを作成する必要がある。