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/ srcCVSの関係上ソースは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
- --prefix
--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つのオプションが必要である。
- --enable-languages
- --with-newlib
- --with-headers
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円取られた)。これが非常にコンパクトで実に素晴らしい出来なのだ!その雄姿を紹介しよう。
左から、
- パッケージ全体像。小さな本体(10x12cm程度)と日本用の電源アダプター(DC12V)。
- 前後面像。前面にはシリアル用のコネクター2つが用意されている。後面には電源アダプター、RS422、100/10 BAST-T RJ-45 コネクターが装備してある。
- ボード全体像。中央にAXIS オリジナルの ETRAX 100LX CPU が光る(これがとてつもない多機能 CPU なのだ)。
この Developer board は最初から Flash RAM にLinux が搭載されており、もちろん TCP/IP 対応である。IPアドレスの設定は HTTP/telnet/FTP の何れもOKという優秀さ、私は telnet で設定した。
ハードウェアもさることながら、ソフトウェア開発環境が凄い!恐らく、組み込み Linux の応用製品としては世界一の完成度を誇るであろう。なにが凄いかって?それは後のお楽しみ。