090115

|



ヘルメットを新調しました。09からは心機一転、ロスマンズスペンサーです。
南海部品でちょうど今、売り出してます。ラパイドじゃないと嫌なのだけど、
背に腹は替えられない。仕方なくRX-7RR5です。アゴが丸いのが嫌なんだ。前の
トリコロールスペンサーは041003にUPCで買ったUPC別注。これはラパイドOr ベー
スでよかったんだよね。ヘルメットは3年が交換時期なのでもうそろそろ新しいのを用意しないと、ということで。

ロスマンズスペンサーは心ときめく。一番最初に買ったオンロードヘルメット はロスマンズスペンサーだった。当時はまだ上野にバイク街があって、光輪の 逸品館でさんざ迷ったあげく買った。22年以上前だ... 1986年。まさにスペン サーブームまっただなか。思えば遠くまで来たものだ。


さて。今日はコンパイラを変更しました。今迄pkgsrc/crossのh8300-hms-gcc(3.1)を 使っていたのを、素のgcc-4.3.2からh8300-elf-gccにしました。
使うのはこれ。
gmp-4.2.4.tar.bz2
mpfr-2.3.2.tar.bz2
binutils-2.18.tar.gz
newlib-1.17.0.tar.gz
gcc-4.3.2.tar.bz2

gmpとmpfrは最近のgccに必要なようです。

----------------------------------------
gmp
----------------------------------------
$ cd gmp-4.2.4
$ mkdir obj
$ cd obj
$ ../configure --prefix=/usr/local
gmake all;gmake install
----------------------------------------

----------------------------------------
mpfr
----------------------------------------
$ cd mpfr-2.3.2
$ mkdir obj
$ cd obj
$ ../configure --prefix=/usr/local --with-gmp=/usr/local
gmake all;gmake install
----------------------------------------

----------------------------------------
binutils
----------------------------------------
これはラインセパレータが欲しいので、binutils-2.18/gas/config/tc-8300.c
を変更します。

const char line_separator_chars[] = "$";

$ mkdir obj.h8300-elf
$ cd obj.h8300-elf/
$ ../configure --prefix=/usr/local --target=h8300-elf
gmake all;gmake install

----------------------------------------
gcc
----------------------------------------
libgccのコンパイルにnewlibを使うので、newlibを展開しておき、そのヘッダ位置を
configureで指定します。そのヘッダのディレクトリは先にインストールディレクトリ
にコピーされる
Copying /home/uch/h8/ccs/newlib-1.17.0/newlib/libc/include to /usr/local/h8300-elf/sys-include
ので、然るべきパーミッションに。

コンパイル中、
cannot compute suffix...
でconfigureがエラーになるときはmpfrのLD_LIBRARY_PATHが抜けてるので指定
しておきます.

$ tar zxf newlib-1.17.0.tar.gz
$ tar zxf gcc-4.3.2.tar.bz2
$ cd gcc-4.3.2
$ mkdir obj.h8300-elf
$ cd obj.h8300-elf/
$ ../configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local --target=h8300-elf --enable-languages="c,c++" --with-newlib --with-headers=/home/uch/h8/ccs/newlib-1.17.0/newlib/libc/include
gmake all; gmake installl

----------------------------------------
newlib
----------------------------------------
$ cd newlib-1.17.0
$ mkdir obj.h8300-elf
$ cd obj.h8300-elf/
$ ../configure --prefix=/usr/local --target=h8300-elf
gmake all;gmake install

インストールに特に問題はありませんでした。

実際に使ってみると、

#pragma interruptが効かなくなっている。(rteじゃなくrtsになっている)
void func (void) __attribute ((interrupt_handler));
のように宣言で(H8/300H固有のattribute)設定すれば大丈夫。rteにしてくれる。

.rodataStr1.1のようなセクションを出すので、 *(.rodata*)にする。

/tmp/ccgtXJFg.s: Assembler messages:
/tmp/ccgtXJFg.s:49: Warning: operand #0xffffffffffffffff out of range.
/tmp/ccgtXJFg.s:231: Warning: operand #0xffffffffffffffff out of range.
/tmp/ccgtXJFg.s:271: Warning: operand #0xffffffffffffffff out of range.
コンパイラの吐いたコード、
	mov.w	#-1,r1
	cmp.w	#-1,r3
	mov.w	#-1,r3
がこのWarningを出す。
   83f08:	79 23 ff ff 	cmp.w	#0xffff,r3
になる。問題なし。

ROMにもっていったところ、起動しない。問題は
Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .vectors      00000004  00000000  00000000  00005b5c  2**0
                  CONTENTS, READONLY
  1 .intvecs      000000c4  00000030  00000030  00000094  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  2 .text         000055c4  00000100  00000100  00000158  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .data         00000440  000fdf10  000056c4  0000571c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  4 .bss          00000f1c  000fe350  00005b04  00005b5c  2**2
                  ALLOC

.vectorsにLOADがたってない。ので、最初にジャンプすべきアドレスが伝わっ
てないのだ。
今迄
	.section .vectors
	.long	start
のようにアセンブラルーチンで指定して、
MEMORY {
       vectors	: o = 0x00000, l = 0x4
}
SECTIONS {
	 .vectors :
	 {
		*(.vectors)
	 } > vectors
}
のようにしていた。これがLOADにならない。どこからも参照されていないセクション
だからロードにならないのかも。
ここは
	 .vectors :
	 {
	 	LONG (ABSOLUTE (start))
	 } > vectors
としてやることでLOADを立てれました。ROMでの実行もこれでOK
ということで、ldscriptはこんな感じに変更。SEARCH_DIRはここに書いても
Makefileでldの引数に-Lで指定してもいい。ldの引数が優先される。
-mint32は使ってません。使う時はh8300h/int32/のライブラリを指定する。

OUTPUT_FORMAT ("elf32-h8300")
OUTPUT_ARCH (h8300:h8300h)

SEARCH_DIR("/usr/local/h8300-elf/lib/h8300h"); /* newlib */
SEARCH_DIR("/usr/local/lib/gcc/h8300-elf/4.3.2/h8300h"); /* libgcc */

MEMORY {
       start_vector	: o = 0x00000, l = 0x4
       intvecs	: o = 0x00030, l = 0xc4
       intram	: o = 0xfdf10, l = 0x2000
       rom	: o = 0x00100, l = 0x7ff00
}

SECTIONS {
	 _stack_start = 0xfff10;
	 .start_vector :
	 {
	 	LONG (ABSOLUTE (start))
	 } > start_vector

	 .intvecs :
	 {
		*(.intvecs)
	 } > intvecs

	 .text :
	 {
	 	 *(.text)
		 *(.rodata*)
		 . = ALIGN (4);
	 } > rom

	 _rom_data_start = .;
	 .data :
	 AT (ADDR (.text) + SIZEOF (.text))
	 {
	 	 _data_start = .;
	 	 *(.data)
		 . = ALIGN (4);
		 _data_end = .;
	 } > intram
	 _rom_data_end = _rom_data_start + SIZEOF (.data);

	 .bss :
	 {
	         _bss_start = .;
	      	 *(.bss)
	 } > intram
	_bss_end = .;

	/DISCARD/ : { *(.*debug*) }
	/DISCARD/ : { *(.comment) }
}

h8300-hms-gccはCOFF、h8300-elf-gccにしてELFになったので、weakシンボルが
使える。これが使えると、
void null_handler (void) __attribute ((interrupt_handler)); // place holder.
void irq0 (void) __attribute ((weak, alias ("null_handler")));
void irq1 (void) __attribute ((weak, alias ("null_handler")));

void (* const vector_table[])(void) __attribute__((section (".intvecs"))) =
{
  irq0,		/* 12 0x30 IRQ0 */
  irq1,		/* 13 0x34 IRQ1 */

のように設定しておいて、ユーザ側から定義があれば、それに置きかわるので
とても便利。
なんとかg++も使えそうです。