-
【覚え(あとで清書)】
これでコンパイル通って exec ffd940 で実行までできた
$ h8300-hms-gcc -O -mh -mint32 -T ram3068_ffd940.x -o blilk.coff -nostartfiles ramcrt0.S blink.c -lc
$ h8300-hms-objcopy -O srec blink.coff blink.mot
ram3068_ffd940.x (ram3068.xを修正)
OUTPUT_FORMAT("coff-h8300")。
OUTPUT_ARCH(h8300h)
ENTRY("_start")
MEMORY
{
syscall(r) : o = 0x000100, l = 0x0200
ram(rwx) : o = 0xffd940, l = 0x1800
}
編集予定
みついわさんのところから h8300-hms-gcc の開発環境のrpmパッケージを持ってきてもできた。
今までできなかったのは、exec ffd940 をしてなかったからってだけ。
それなのにいろいろなところを調べまくった。。
最終的にはelf形式もcoff形式もどっちもコンパイルできるような環境にはなったが。。
elf版、coff版で、後日両方まとめておくことにする。
ヘッダ類
を、
/usr/local/h8300-elf/include
に、h8 というフォルダを作って入れておく。
念のためパーミッションを 777 にする。
(上記フォルダに入れないと「見つかりません」と言われる)
メモリ定義ファイルの修正
ここを参照
iv. リンカスクリプトを修正する の部分を参照し、
今回 h8300-elf-gcc をインストールしたので対応したリンカを使うようにしなければならない
ram3068.x を emacs で開き、先頭部分を変更する
OUTPUT_FORMAT("coff-h8300")
を、
OUTPUT_FORMAT("elf32-h8300")
に変える。
コンパイル
みついわさんのところからもってきたram3068.xは、コンパイラがh8300-hms-gccを対象にしているため、さっき作った ram3068elf.xを使用してコンパイル&リンクする。
$ h8300-elf-gcc -O -mh -mint32 -T ram3068elf.x -o blink.coff -nostartfiles ramcrt0.S blink.c -lc
ここで、最初の"-O" は大文字であることに注意する!
大文字にせず、小文字にしてしまうと以下のようにエラーがでる!
(ここでだいぶはまった。。)
>/usr/local/lib/gcc-lib/h8300-elf/3.2.3/../../../../h8300-elf/bin/ld: unrecognised emulation mode: h
>Supported emulations: h8300elf h8300helf h8300self
>collect2: ld はステータス 1 で終了しました
次に中間ファイル(.coff)をモトローラS形式へ変換する
# h8300-elf-objcopy -O srec blink.coff blink.mot
転送
みついわさんのところから put コマンドを入手して、以下のようにして put する。
# put -e blink.mot /dev/ttyUSB0
みついわさんによるとこれで自動的にRAM上に転送されたプログラムが実行されるとあるが、
これがどうやらそうでもない。
これを信じてずっと「動かん動かん」と言っていたが、試しに minicom を開いて
H8/OS > exec ffd940
として実行してやることで初めて作動。ここでもはめられた。
ちなみにソースはこれ。
<h8/reg3067.h>
<h8/syscall.h>
int main(){
P4DDR = 0x01;
while(1){
P4DR = 0x00;
sleep(5);
P4DR = 0x01;
sleep(5);
}
}
syscall.h, reg3067.h が、どーこにおいても「見つかりません」と言われた時もあったので、
そういう時はソース blink.c と同じフォルダにおいて、ソースのインクルード行を
#include "syscall.h"
#include "reg3067.h"
にしてやればとりあえず見つけてもらうことはできる。
最終更新:2014年03月27日 22:38