2001-08-07 Mon 24:32
週末、秋月電子のH8 CPU/Mother board 相手に奮闘。土曜日の夜中12時から約4時間かけて組み立て完了。半田ごてを握ったのは久しぶりだ。これまでにトランジスタ2つ3つ程度の超初心者キットを作った経験はあるが、そんな私でもなんとか完成できた。あとは動くかどうかだが、残念ながら外からプログラムを書き込んでやらないと動作確認ができない。予めテストプログラムを書き込んでおいてもらうと助かるのだが。7800円キットにはライター機能を搭載したマザーボードが付いてくる。H8のI/Oポートにつながったタクトスイッチ4個、LED 2個、ディップスイッチ8ビット分ひとつ、そして16文字x2行表示 LCD (右下)が搭載されている。この他にRS-232C用に9ピン、25ピンのコネクタトが用意されている(左端)。CPUボードはマザーボードと4つのコネクタを介して接続する設計になっている(写真中央)。25ピンコネクタと比較すると、その小ささがお分かり頂けるだろう。

Linux 上での日立 H8 プロセッサー・クロス開発環境の構築方法について記録しておく。

まず8/1の記述に従い、GNU binutils, GNU gcc, newlib のCVSから最新版ソースツリーを入手する。

私は /usr/src/ にそれぞれ cvs-binutils, cvs-gcc, cvs-newlib の3つのディレクトリを作成し、この中にソースツリーを展開した。

     
# ls cvs-binutils/ src # ls cvs-gcc gcc # ls cvs-newlib/ src

CVSの関係上ソースは1段深いサブディレクトリに展開されるため、パスの指定が大変だ。そこで、/usr/src/ にリンクを作成。

     
18:36:31 root@mebius /usr/src # ls -l binutils gcc newlib lrwxrwxrwx 1 root root 16 Aug 7 18:36 binutils -> cvs-binutils/src lrwxrwxrwx 1 root root 11 Aug 7 18:36 gcc -> cvs-gcc/gcc lrwxrwxrwx 1 root root 14 Aug 7 18:36 newlib -> cvs-newlib/src

これで /usr/src/binutils を参照することで、常に最新のソースツリーを参照することが可能になる。開発環境のアップデートは毎日行われているので、まめにアップデートすることにしよう

準備は整ったので、いよいよ構築に入る。まず、最初に binutils を完成させる。binutils の中にはアセンブラー、アーカイバー、リンカー、ローダーなど基本ツール群が含まれており、これらなくして gcc や newlib は生成出来ないからである。

構築にあたり必要な情報は、生成されたクロス開発ツールや関連ファイル(man、インクルードファイル、ライブラリーなど)を配置するディレクトリー名である。デフォルトでは /usr/local/ に展開されるようになっているが、これから先 Super H や MIPS など複数のクロス開発ツール群を一カ所にインストールしてしまうと訳が分からなくなるため、私は CPU 別にディレクトリーを設けることにした。H8/300H CPU には /usr/local/h8/ ディレクトリーを割り当てた。ちなみに実行ファイルは /usr/local/h8/bin/ に配置される。

また注意すべき点として、ビルドはソースディレクトリーとは別のディレクトリーで実施することが挙げられる。この方法をとれば、複数の CPU に対するコンパイルを実施しても、ソースツリーは一カ所で済むためディスク容量を節約できる。

以上より、ビルドは /usr/src/h8/ ディレクトリーで、インストールは /usr/local/h8/ ディレクトリーに行う事とした。それでは binutils ソースディレクトリーのトップレベルにある configure スクリプトをオプション付きで起動する。configure スクリプトには多くのオプションがあるが、ここで必要なものは以下のふたつである。

--target は名前の通り、ターゲットCPUを指定するためのオプションである。これを省略するとネイティブCPU (x86)対応となる。今回は以前説明した通り H8/300H を表す h8300-hms を指定する。--prefix はインストール先を指定するためのオプションで省略すると /usr/local になる。今回は /usr/locaol/h8 を指定。このスクリプトを実行することで、Makefile の生成などが行われる。いよいよ make だが、Makefile 中で CFLAGS は "-g -O2" と定義されているため、デフォルトでデバッグ情報付きの巨大な実行ファイルが生成されてしまう。これではディスクスペースの無駄使いなので、-g オプションを無効化するために make コマンドライン中で強制指定を行う。 無事コンパイル・リンクが終了すれば(SHARP mebius celeron 300MHz で約4分) make install を実行し、出来上がり!最後に、/usr/local/h8/bin へのパスを忘れずに通しておこう。次の gcc のコンパイルの際に、binutils ツールが早速必要になるからである。この点は盲点になりやすいのでくれぐれも注意すること(エラーメッセージに「h8300-hms-ar が見あたらない」と表示される)。

     
$ mkdir /usr/local/h8 $ cd /usr/src/h8 $ mkdir build-binutils $ cd build-binutils $ /usr/src/binutils/configure --target=h8300-hms --prefix=/usr/local/h8 $ make CFLAGS="-O2" all $ su # make install $ export PATH=$PATH:/usr/local/h8/bin

念のためにインストール内容を確認しておく。/usr/local/h8/bin/ には17個のツールがインストールされている事が分かる。実行ファイル名にターゲット名(h8300-hms-)がプレフィックスとして追加されている点に注意して欲しい。

     
19:26:33 root@mebius /usr/src/h8/build-binutils # ls -l /usr/local/h8 total 5 drwxrwxr-x 8 root root 200 Aug 7 19:26 . drwxr-xr-x 19 root staff 464 Aug 7 19:26 .. drwxrwxr-x 2 root root 656 Aug 7 19:26 bin drwxrwxr-x 4 root root 96 Aug 7 19:26 h8300-hms drwxrwxr-x 2 root root 136 Aug 7 19:26 include drwxrwxr-x 2 root root 200 Aug 7 19:26 lib drwxrwxr-x 3 root root 72 Aug 7 19:26 man drwxrwxr-x 2 root root 48 Aug 7 19:26 share 19:27:21 root@mebius /usr/src/h8/build-binutils # ls -l /usr/local/h8/bin total 3654 drwxrwxr-x 2 root root 656 Aug 7 19:26 . drwxrwxr-x 8 root root 200 Aug 7 19:26 .. -rwxr-xr-x 1 root root 204642 Aug 7 19:26 h8300-hms-addr2line -rwxr-xr-x 2 root root 177830 Aug 7 19:26 h8300-hms-ar -rwxr-xr-x 2 root root 361754 Aug 7 19:26 h8300-hms-as -rwxr-xr-x 1 root root 61992 Aug 7 19:26 h8300-hms-c++filt -rwxr-xr-x 1 root root 159355 Aug 7 19:26 h8300-hms-coffdump -rwxr-xr-x 1 root root 50852 Aug 7 19:26 h8300-hms-gasp -rwxr-xr-x 2 root root 347184 Aug 7 19:26 h8300-hms-ld -rwxr-xr-x 2 root root 215351 Aug 7 19:26 h8300-hms-nm -rwxr-xr-x 1 root root 348455 Aug 7 19:26 h8300-hms-objcopy -rwxr-xr-x 1 root root 411607 Aug 7 19:26 h8300-hms-objdump -rwxr-xr-x 2 root root 177829 Aug 7 19:26 h8300-hms-ranlib -rwxr-xr-x 1 root root 162244 Aug 7 19:26 h8300-hms-readelf -rwxr-xr-x 1 root root 154559 Aug 7 19:26 h8300-hms-size -rwxr-xr-x 1 root root 176041 Aug 7 19:26 h8300-hms-srconv -rwxr-xr-x 1 root root 153259 Aug 7 19:26 h8300-hms-strings -rwxr-xr-x 2 root root 348454 Aug 7 19:26 h8300-hms-strip -rwxr-xr-x 1 root root 193882 Aug 7 19:26 h8300-hms-sysdump

続いて gcc-3.1 の構築だ。--target および --prefix オプションの指定は同様だが、この他に3つのオプションが必要である。

gcc はデフォルトでC言語以外に C++, JAVA, Fortran77, Chill などにも対応するようになっている。後3者は必要ないので、このような時は --enable-languages オプションで必要な言語のみを選択する(もちろんCは必須であり、オプション扱い外)。

クロス開発環境では巨大な glibc ではなく、コンパクトなCライブラリーを採用する場合が多いだろう。newlib は現時点で最も完成度の高いコンパクトCライブラリーであり(redhat のサイトで公開されている)、GNU 環境も標準で対応している。--with-newlib オプションを指定すると同時に、--with-headers オプションで newlib のインクルードファイル・ディレククトリーを指定する。gcc は演算関数などの基本関数を libgcc.a ライブラリーとして提供するが、このライブラリーをコンパイルするために標準インクルードファイルが必要になるからである。さらに付け加えれば、getopt, strerror, strtol 関数などを含んだ GNU ツール用の libiberty.a という名前のライブラリーも生成される(liberty library)。--with-headers オプションはクロス開発環境構築のためには必須のオプションなのだが、不思議なことに紹介されている所を見たことがない。これが第2の盲点である(気づくまでに数日かかった・・)。

make は binutils と同様に CFLAGS を指定して、Makefile 中の -g オプションを無効化する。次に LANGUAGES 環境変数で生成する言語をCおよびC++のふたつに限定する。この指定を忘れると、JAVA など他の言語にも対応してしまうので注意。同様に、インストールの時点でも LANGUAGES を用いてCおよびC++のふたつに限定する。これも忘れやすいので要注意。コンパイルエラーを防ぐためにも、--enable-languages と LANGUAGES を用いて必要最小限の構築を行うことが肝心である。ここが第3の盲点。make に要する時間は Celeron 300MHz で約14分。


$ cd /usr/src/h8
$ mkdir build-gcc
$ cd build-gcc
$ /usr/src/gcc/configure --target=h8300-hms --prefix=/usr/local/h8 --enable-languages="c++"
  --with-newlib --with-headers=/usr/src/newlib/newlib/libc/include
$ make CFLAGS="-O2" LANGUAGES="c c++"
$ su
# make LANGUAGES="c c++" install

それでは無事インストールされたかどうか、確認してみよう。gccbug, h8300-hms-c++, h8300-hms-cpp, h8300-hms-g++ の計4つが新たに生成されている。


20:24:48 root@mebius /usr/src/h8/build-gcc # ls -l /usr/local/h8/bin
total 3990
drwxrwxr-x    2 root     root          808 Aug  7 20:24 .
drwxrwxr-x    9 root     root          224 Aug  7 20:24 ..
-rwxr-xr-x    1 root     root        15390 Aug  7 20:24 gccbug
-rwxr-xr-x    1 root     root       204642 Aug  7 19:26 h8300-hms-addr2line
-rwxr-xr-x    2 root     root       177830 Aug  7 19:26 h8300-hms-ar
-rwxr-xr-x    2 root     root       361754 Aug  7 19:26 h8300-hms-as
-rwxr-xr-x    2 root     root        79718 Aug  7 20:24 h8300-hms-c++
-rwxr-xr-x    1 root     root        62100 Aug  7 20:24 h8300-hms-c++filt
-rwxr-xr-x    1 root     root       159355 Aug  7 19:26 h8300-hms-coffdump
-rwxr-xr-x    1 root     root        80037 Aug  7 20:24 h8300-hms-cpp
-rwxr-xr-x    2 root     root        79718 Aug  7 20:24 h8300-hms-g++
-rwxr-xr-x    1 root     root        50852 Aug  7 19:26 h8300-hms-gasp
-rwxr-xr-x    1 root     root        78342 Aug  7 20:24 h8300-hms-gcc
-rwxr-xr-x    2 root     root       347184 Aug  7 19:26 h8300-hms-ld
-rwxr-xr-x    2 root     root       215351 Aug  7 19:26 h8300-hms-nm
-rwxr-xr-x    1 root     root       348455 Aug  7 19:26 h8300-hms-objcopy
-rwxr-xr-x    1 root     root       411607 Aug  7 19:26 h8300-hms-objdump
-rwxr-xr-x    2 root     root       177829 Aug  7 19:26 h8300-hms-ranlib
-rwxr-xr-x    1 root     root       162244 Aug  7 19:26 h8300-hms-readelf
-rwxr-xr-x    1 root     root       154559 Aug  7 19:26 h8300-hms-size
-rwxr-xr-x    1 root     root       176041 Aug  7 19:26 h8300-hms-srconv
-rwxr-xr-x    1 root     root       153259 Aug  7 19:26 h8300-hms-strings
-rwxr-xr-x    2 root     root       348454 Aug  7 19:26 h8300-hms-strip

ついでに gcc が正常に動くか確認する。--target-help を指定するとターゲット CPU に関する特別なオプションを表示することができる。生成された gcc は H8/300H はもちろん、下位CPU H8/S および上位 CPU H8/S2600 にも対応している事が分かる。素晴らしい!


21:10:19 root@mebius /usr/src/h8/build-gcc # h8300-hms-gcc --target-help

Target specific options:
  -malign-300               Use H8/300 alignment rules
  -mno-h                    Do not generate H8/300H code
  -mh                       Generate H8/300H code
  -mrelax                   Enable linker relaxing
  -mslowbyte                Consider access to byte sized memory slow
  -mno-quickcall            Do not use registers for argument passing
  -mquickcall               Use registers for argument passing
  -mint32                   Make integers 32 bits wide
  -mno-s2600                Do not generate H8/S2600 code
  -ms2600                   Generate H8/S2600 code
  -mno-s                    Do not generate H8/S code
  -ms                       Generate H8/S code

There are undocumented target specific options as well.

Target specific options:
  -malign-300               Use H8/300 alignment rules
  -mno-h                    Do not generate H8/300H code
  -mh                       Generate H8/300H code
  -mrelax                   Enable linker relaxing
  -mslowbyte                Consider access to byte sized memory slow
  -mno-quickcall            Do not use registers for argument passing
  -mquickcall               Use registers for argument passing
  -mint32                   Make integers 32 bits wide
  -mno-s2600                Do not generate H8/S2600 code
  -ms2600                   Generate H8/S2600 code
  -mno-s                    Do not generate H8/S code
  -ms                       Generate H8/S code

There are undocumented target specific options as well.
  no emulation specific options.

最後に newlib を構築する。ここまで来れば簡単だ、型どおり以下を実行するのみ。出来上がった h8300-hms-gcc を使って、H8 専用のCライブラリーがコンパイルされる。make に要する時間は Celeron 300MHz で約8分。


$ cd /usr/src/h8
$ mkdir build-newlib
$ cd build-newlib
$ /usr/src/newlib/configure --target=h8300-hms --prefix=/usr/local/h8
$ make CFLAGS="-O2" all
$ su
# make install

ライブラリーはビット長などに応じて全部で5種類作成され、/usr/local/h8/h8300-hms/lib/ に配置される。C Run Time start up file crt0.o、およびリンカースクリプトファイルも用意されている。crt0.o はハードウェアに応じて修正する必要がある。


21:29:45 root@mebius /usr/src/h8/build-newlib # ls -R /usr/local/h8/h8300-hms/lib/
/usr/local/h8/h8300-hms/lib/:
total 1251
drwxrwxr-x    5 root     root          224 Aug  7 21:28 .
drwxrwxr-x    6 root     root          152 Aug  7 21:28 ..
-rw-r--r--    1 root     root          712 Aug  7 21:28 crt0.o
drwxrwxr-x    3 root     root          168 Aug  7 21:28 h8300h
drwxrwxr-x    3 root     root          168 Aug  7 21:28 h8300s
drwxrwxr-x    2 root     root          480 Aug  7 19:26 ldscripts
-rw-r--r--    2 root     root       442730 Aug  7 21:28 libc.a
-rw-r--r--    2 root     root       442730 Aug  7 21:28 libg.a
-rw-r--r--    1 root     root       377620 Aug  7 21:28 libm.a

/usr/local/h8/h8300-hms/lib/h8300h:
total 1058
drwxrwxr-x    3 root     root          168 Aug  7 21:28 .
drwxrwxr-x    5 root     root          224 Aug  7 21:28 ..
-rw-r--r--    1 root     root          728 Aug  7 21:28 crt0.o
drwxrwxr-x    2 root     root          144 Aug  7 21:28 int32
-rw-r--r--    2 root     root       401190 Aug  7 21:28 libc.a
-rw-r--r--    2 root     root       401190 Aug  7 21:28 libg.a
-rw-r--r--    1 root     root       270704 Aug  7 21:28 libm.a

/usr/local/h8/h8300-hms/lib/h8300h/int32:
total 1073
drwxrwxr-x    2 root     root          144 Aug  7 21:28 .
drwxrwxr-x    3 root     root          168 Aug  7 21:28 ..
-rw-r--r--    1 root     root          728 Aug  7 21:28 crt0.o
-rw-r--r--    2 root     root       406152 Aug  7 21:28 libc.a
-rw-r--r--    2 root     root       406152 Aug  7 21:28 libg.a
-rw-r--r--    1 root     root       271788 Aug  7 21:28 libm.a

/usr/local/h8/h8300-hms/lib/h8300s:
total 1054
drwxrwxr-x    3 root     root          168 Aug  7 21:28 .
drwxrwxr-x    5 root     root          224 Aug  7 21:28 ..
-rw-r--r--    1 root     root          728 Aug  7 21:28 crt0.o
drwxrwxr-x    2 root     root          144 Aug  7 21:28 int32
-rw-r--r--    2 root     root       399414 Aug  7 21:28 libc.a
-rw-r--r--    2 root     root       399414 Aug  7 21:28 libg.a
-rw-r--r--    1 root     root       270014 Aug  7 21:28 libm.a

/usr/local/h8/h8300-hms/lib/h8300s/int32:
total 1065
drwxrwxr-x    2 root     root          144 Aug  7 21:28 .
drwxrwxr-x    3 root     root          168 Aug  7 21:28 ..
-rw-r--r--    1 root     root          728 Aug  7 21:28 crt0.o
-rw-r--r--    2 root     root       404326 Aug  7 21:28 libc.a
-rw-r--r--    2 root     root       404326 Aug  7 21:28 libg.a
-rw-r--r--    1 root     root       271096 Aug  7 21:28 libm.a

/usr/local/h8/h8300-hms/lib/ldscripts:
total 61
drwxrwxr-x    2 root     root          480 Aug  7 19:26 .
drwxrwxr-x    5 root     root          224 Aug  7 21:28 ..
-rw-r--r--    1 root     root         1159 Aug  7 19:26 h8300.x
-rw-r--r--    1 root     root         1159 Aug  7 19:26 h8300.xbn
-rw-r--r--    1 root     root         1159 Aug  7 19:26 h8300.xn
-rw-r--r--    1 root     root          901 Aug  7 19:26 h8300.xr
-rw-r--r--    1 root     root         1027 Aug  7 19:26 h8300.xu
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300h.x
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300h.xbn
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300h.xn
-rw-r--r--    1 root     root         1180 Aug  7 19:26 h8300h.xr
-rw-r--r--    1 root     root         1306 Aug  7 19:26 h8300h.xu
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300s.x
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300s.xbn
-rw-r--r--    1 root     root         1445 Aug  7 19:26 h8300s.xn
-rw-r--r--    1 root     root         1180 Aug  7 19:26 h8300s.xr
-rw-r--r--    1 root     root         1306 Aug  7 19:26 h8300s.xu

最後の最後に、実際に H8 のコードが出力されるか調べてみよう。


21:38:03 root@mebius /usr/src/h8 # cat test.c
int main()
{
 int a,b;

 a = 2;
 b = 123;
 a *= b;
 return(a);
}

21:38:40 root@mebius /usr/src/h8 # h8300-hms-gcc test.c
21:38:47 root@mebius /usr/src/h8 # h8300-hms-gcc -S test.c
21:39:11 root@mebius /usr/src/h8 # ls -l
total 25
drwxrwxr-x    5 root     root          248 Aug  7 21:39 .
drwxr-xr-x   69 root     root         2984 Aug  7 18:42 ..
-rwxrwxr-x    1 root     root         2752 Aug  7 21:36 a.out
drwxrwxr-x   12 root     root          392 Aug  7 19:20 build-binutils
drwxrwxr-x    7 root     root          304 Aug  7 19:35 build-gcc
drwxrwxr-x    5 root     root          216 Aug  7 21:17 build-newlib
-rw-------    1 root     root           65 Aug  7 21:36 test.c
-rw-rw-r--    1 root     root          461 Aug  7 21:39 test.s
21:39:12 root@mebius /usr/src/h8 # cat test.s
;       GCC For the Hitachi H8/300
;       By Hitachi America Ltd and Cygnus Support


        .file   "test.c"
        .section .text
        .align 1
        .global _main
_main:
        push    r6
        mov.w   r7,r6
        subs    #2,sp
        subs    #2,sp
        mov.w   #2,r2
        mov.w   r2,@(-2,r6)
        mov.w   #123,r2
        mov.w   r2,@(-4,r6)
        mov.w   @(-4,r6),r1
        mov.w   @(-2,r6),r0
        jsr     @___mulhi3
        mov.w   r0,r2
        mov.w   r2,@(-2,r6)
        mov.w   @(-2,r6),r2
        mov.w   r2,r0
        adds    #2,sp
        adds    #2,sp
        pop     r6
        rts
        .end
        .ident
"GCC: (GNU) 3.1 20010806 (experimental)"

問題ないようだ。これでめでたく H8 クロス開発のための最新環境がセットアップできた。それにしても「メモ」と呼ぶにはえらく長いものになってしまった・・。

8/6 月曜日(原爆記念日、私は広島生まれ)、はるばるスェーデンから早くも「ブツ」が届く(関税で2000円取られた)。これが非常にコンパクトで実に素晴らしい出来なのだ!その雄姿を紹介しよう。

左から、

この Developer board は最初から Flash RAM にLinux が搭載されており、もちろん TCP/IP 対応である。IPアドレスの設定は HTTP/telnet/FTP の何れもOKという優秀さ、私は telnet で設定した。

ハードウェアもさることながら、ソフトウェア開発環境が凄い!恐らく、組み込み Linux の応用製品としては世界一の完成度を誇るであろう。なにが凄いかって?それは後のお楽しみ。