2001-08-01 Wed 23:17

Polytechnic University で教鞭を取る Tim Moors 氏から私の Linux networking code tour について励ましのメールが届く。ありがたいことに氏のLinuxネットワーク関連のリンク集にも加えて頂いたようだ。Thanks Tim!

礼状に「今後はx86ではなく、日立SuperHプロセッサーでの解析を進めたいと思う」と書いたら、本日その返事が届く。曰く、"You wouldn't happen to know about the Hitachi H8S/2246 processor, would you? It is used in the Cybiko PDA-like computers." Cybiko?なんじゃそりゃ?早速教えてくれた紹介ページをチェック、お〜〜これはグレート!面白そうだ。

なんでも開発者のDavid Yang氏がモスクワの病院に入院した際、あまりの退屈さに「隣の部屋の人達と手軽にコミュニケーション出来る手段があれば良いのに」と考えたのが発端だったとか。彼はその後徹底的なマーケットリサーチを行い、ターゲットを10代に絞ったという。結果、50万台以上を売り上げ典型的なサクセスストーリーを歩む。本体は日立H8Sプロセッサー(有名な秋月電子AKI-H8キットに搭載されたCPU H8/300Hの親戚)を積み、900MHzの周波数で30チャンネルのモバイル通信(同時に3000台参加可能)を楽しむことが出来るらしい。到達可能距離は室内で45m、屋外で90mだが、デイジーチェインによって、到達距離がグングン伸びていくというのが秀逸。"Friend Finder お友達探索" モードというのがあり、誰かが通信可能距離に入るとバイブレーションであるじに教えてくれるとのこと。日本では昔「あいげってぃー」とかいう、中途半端なおもちゃが流行したことがあるが、あれのハイテク版である。左は開発途中のモック写真。センスが良いが、実際の商品はもっとしょぼい。

ミーハーな私は早速入手を計ろうとするがなんと米国内だけの販売らしい。Amazon.comでもトイザラスと提携して販売していたが、こちらも日本への発送はダメとつれない返事。しゃ〜ないな〜と思って、国内で検索をかけるとなんと秋葉館PDAオンラインショップで販売している事が判明。「1台では通信できないし、どーしょ」と悩んでいたところに、次のソフトが目に飛び込んできた。

Cylandia がそれだ。和訳が面倒くさいので以下の原文を読んで欲しい。

CyLandia is a good example of what you can do with the Cybiko SDK, Standard Edition. CyLandia is the world's first distributed artificial life simulator. It features cute creatures, called Cy-Bs, capable of teleporting to other computers and living there, remembering their friends on other computers, and reading (yes!) Internet-based newspapers and adequately reacting to its news. Although the average Cybiko computer application archive requires ten to twenty kilobytes, CyLandia has reached 200 kilobytes and it's still growing and is in good shape - your larger apps will also work fine!

キュートなキャラクター(Cy-Bs)が他のCybikoにテレポートする訳だ。ポストペットと似たようなものだが、Cy-Bsはなんとインターネットで配信されるニュースを読んで行動するらしい。「ここまで読んで2台買わなければ男がすたる」、と自分を納得させ注文をすませた。1台13,800円也。米国ではカラーにより値段が異なるが、通常99ドルだから秋葉館の値段設定はリーズナブルと言える。なお、この説明はCybikoのデベロッパー向けのページで見つけた。WIN/Linux版の開発ソフトが無料で公開されている。プロフェッショナル版も販売されているが、これも日本向けはダメらしい、残念。とりあえずスタンダード版で遊んでみることにしよう。到着が楽しみだ。

日立のHプロセッサーは世界を席巻しつつある。これは本気で勉強せねばなるまい・・と、ついでに秋月電子のAKI-H8開発キットも注文。7,800円也(財布大丈夫か?>われ)。

こうなってくると、まず最初に必要になるのが Linux 上でのクロス開発環境だ。今更 Windows 環境に戻りたくはない・・(とうの昔にFATパーティションすらないやろ>我)。幸いなことに先人の努力でこのあたりのノウハウは文書としてネットに流れている。H8/300HについてはIWATA氏によるH8開発環境プロジェクトが優れている。ld のリンカースクリプトにまで言及してあるのには大変感心した。infoファイル以外で、リンカースクリプトについて言及した文書は私はこれが初めてである。取りあえず必要なソースをゲット。何度かコンパイルに失敗した経験があるので、全て CVS で入手した。方法は以下の通り。必要なものは GNU binary utilities, GCC, そして組み込み向けライブラリー newlib の3つだ。

binutils


# cvs -z 9 -d :pserver:anoncvs@anoncvs.cygnus.com:/cvs/src login
  ( enter "anoncvs" as the password )
# cvs -z 9 -d :pserver:anoncvs@anoncvs.cygnus.com:/cvs/src co binutils
  ( the latest source tree will be expanded in ../src )
# ls src
COPYING         README-maintainer-mode  configure     intl         ltmain.sh       mpw-config.in
COPYING.LIB     bfd                     configure.in  ld           makefile.vms    mpw-configure
COPYING.NEWLIB  binutils                etc           libiberty    missing         mpw-install
CVS             config                  gas           libtool.m4   mkdep           opcodes
ChangeLog       config-ml.in            gettext.m4    ltcf-c.sh    mkinstalldirs   setup.com
MAINTAINERS     config.guess            gprof         ltcf-cxx.sh  move-if-change  symlink-tree
Makefile.in     config.if               include       ltcf-gcj.sh  mpw-README      texinfo
README          config.sub              install-sh    ltconfig     mpw-build.in    ylwrap

gcc 3.0


# cvs -z 9 -d :pserver:anoncvs@gcc.gnu.org:/cvs/gcc login
  ( enter "anoncvs" as the password )
# cvs -z 9 -d :pserver:anoncvs@gcc.gnu.org:/cvs/gcc co gcc
  ( the latest source tree will be expanded in ../gcc )
# ls gcc
COPYING      README        configure     install-sh  libobjc       ltconfig            symlink-tree
COPYING.LIB  boehm-gc      configure.in  libchill    libstdc++     ltmain.sh           texinfo
CVS          config        contrib       libf2c      libstdc++-v3  maintainer-scripts  xiberty
ChangeLog    config-ml.in  etc           libffi      libtool.m4    missing             ylwrap
INSTALL      config.guess  fastjar       libiberty   ltcf-c.sh     mkdep               zlib
MAINTAINERS  config.if     gcc           libio       ltcf-cxx.sh   mkinstalldirs
Makefile.in  config.sub    include       libjava     ltcf-gcj.sh   move-if-change

newlib C library


# cvs -z 9 -d :pserver:anoncvs@anoncvs.cygnus.com:/cvs/src login
  ( enter "anoncvs" as the password )
# cvs -z 9 -d :pserver:anoncvs@anoncvs.cygnus.com:/cvs/src co newlib
  ( the latest source tree will be expanded in ../src/newlib )
# ls src/newlib
COPYING         README                  configure     ltcf-c.sh     mkdep           mpw-install
COPYING.LIB     README-maintainer-mode  configure.in  ltcf-cxx.sh   mkinstalldirs   newlib
COPYING.NEWLIB  config                  etc           ltcf-gcj.sh   move-if-change  setup.com
CVS             config-ml.in            gettext.m4    ltconfig      mpw-README      symlink-tree
ChangeLog       config.guess            install-sh    ltmain.sh     mpw-build.in    texinfo
MAINTAINERS     config.if               libgloss      makefile.vms  mpw-config.in   ylwrap
Makefile.in     config.sub              libtool.m4    missing       mpw-configure

本日、スウェーデンのAxis communications から注文を確認したとのメールが届く。

2001-08-02 Thu 22:30

クロス環境構築を始める。まず、資料の豊富な日立H8/300Hをターゲットにして構築しよう。

第一弾はGNU binutils (binary utilities)だ。binutils->gcc->newlibの順番に構築が行う必要があるためである。

まず最初にビルド専用のディレクトリー build を binutils 直下に作成しよう。私の場合、ソースツリーは binutils/src/ 下に展開した。binutils/src/ 内部で直接 make を実行することも可能だが、ソースツリーが汚染されてしまうので、コンパイルは別ディレクトリーで行うのがマナーである。

     
/usr/src/binutils/ $ ls src /usr/src/binutils/ $ mkdir build; cd build

GNU環境ではターゲットCPUを--targetオプションで指定し、configureスクリプトを実行する習慣になっている。どんなCPUが指定可能かは、トップディレクトリー(src/)にあるconfig.subファイルを見てみるとよい。

通常、--targetにはCPUタイプと会社名(basic CPU types with company name)を指定するようになっている。日立H8/300Hの場合はCPUタイプが h8300、会社名として hms (恐らく、Hitachi Microcomputer Systems の略)を指定する。即ち、--target=h8300-hmsと指定すれば良い。

もうひとつ必須のオプションとして、完成したファイルのインストール場所を指定する --prefix がある。デフォルトでは /usr/local/ だが、ターゲット CPU が増えてくると訳が分からなくなってしまうので、私は /usr/local/h83 を指定した。

次に示すように、コンパイルオプションとして -g -O2 がデフォルトで指定されるようになっている。-g はデバッグ用、-O2 は最適化用。-O2 はインライン展開のためにも必要だが、-g オプションは開発プログラムをデバッグする訳ではないので不必要だ。デバッグ情報を付加すると実行ファイルサイズは約4倍にもなる。そこで make 時に強制的に CFLAGS="-O2" と指定することでファイルをスリム化する。

binutils/build/Makefile
     
CFLAGS = -g -O2

それでは、configure を実行しよう。

     
/usr/src/binutils/build $ ../src/configure --target=h8300-hms --prefix=/hitachi/h83

build ディレクトリー内には Makefile を始めとして必要なものが用意されているはずだ。後は make だが、その前に幾つか細かな修正を行っておこう。

デフォルトの状態ではインストールする実行ファイル名の先頭にターゲット名が強制的に付加されてしまう。 h8300-hms-ar, h8300-hms-as, h8300-hms-objdump と行った具合。これではタイピングが大変なのでもっと短縮化してしまおう。build/binutils/Makefile, build/gas/Makefile, build/ld/Makefile の3つを以下のように修正すればOK。

binutils/Makefile, gas/Makefile, ld/Makefile
     
# transform = s,^,h8300-hms-,; transform = s,^,h83-,;

この他、ビルド・トップディレクトリの Makefile も以下のように修正した。このように細かなチューニングを施すためには configure が自動作成した Makefile を修正する方法が良い。

build/Makefile
     
prefix = /usr/local/h83 exec_prefix = $(prefix) ... tooldir = $(exec_prefix)/h83 build_tooldir = $(exec_prefix)/h83 program_transform_name = -e s,^,h83-,

それでは、いよいよ make だ。CFLAGS の指定を忘れないように。無事コンパイル・インストールが終了すれば全部で17個のクロス開発プログラムが出来上がっているはずである。次は大御所 gcc の作成だが、その前に出来上がった binutils へのパスを通しておく必要がある。gcc パッケージ作成にこれらのツールが必要だからである。構築が完了した暁には、起動スクリプトにこのパス設定を書き込んでおく事も忘れないように。

     
/usr/src/binutils/build $ make CFLAGS="-O2" all /usr/src/binutils/build $ su /usr/src/binutils/build # make install /usr/src/binutils/build # exit /usr/src/binutils/build $ ls /usr/local/h83/bin h83-addr2line h83-c++filt h83-ld h83-objdump h83-size h83-strip h83-ar h83-coffdump h83-nm h83-ranlib h83-srconv h83-sysdump h83-as h83-gasp h83-objcopy h83-readelf h83-strings /hitachi/src/binutils/build $ export PATH=$PATH:/usr/local/h83/bin

日立 H8 プロセッサーのGNU クロス開発では COFF (Common Object File Format)フォーマットが一般的なようだ。このフォーマットに関する仕様書を以前から探していたのだが、本日とうとう発見。なんと、COFF は Windows NT で使われているらしい。

検索をかけると "Microsoft Portable Executable and Common Object File Format Specification" という文書が MSDN にあったらしいのだが、残念なことに現在このファイルは MSDN に登録されていない。しかし、検索を続けて貴重な PDF ファイルを見つけだした。良かった良かった、宝物を見つけた気分である。

2001-08-03 Fri 24:32

悪戦苦闘して、やっと binutils/gcc/newlib のCVS最新版でクロス環境を構築することに成功した。昨日書いた内容は一部間違いがある。週末の間に情報を整理してまとめよう。クロスコンパイルのピットフォールは configure option と、構築の順番にあった。

これらについて系統だって論じた文書がなかったので、ゴールにたどり着くまで苦労した。私が漁った資料の中で --with-headers に言及しているものは一つもなかったが、なぜだ?gcc-3.0 でH8/300Hのクロス環境を構築している人はまだ少ないのだろうか(snapshot ではダメで、CVS版でやっとコンパイルが通った)?

時間はかかったが、クロス環境構築のノウハウは身に付いたので良かったとしよう。

gdb

なんと gdb はH8/300H をシミュレートできるらしい!これは早速 gdb もインストールしなければと、例によって CVS を探すが見あたらない。仕方がないので、最新版 gdb-5.0CodeFactory から取り寄せる。

本日 PIC 関連の書籍を買い込む。PIC も面白そうだ。

H8マイコンの本も見つけたので、即購入。日立トレーニングセンターの講師の人達が書いている。半分まで読んだが、技術者特有の「固い」内容になっている。もう少し、読者の知的好奇心をくすぐるような内容にならないものだろうか。H8 レジスターのセンスのないネーミングにも正直ウンザリさせられる。「CPU は動けばよかろう、文書は書けばよかろう」といったところか。日本の技術者はもっと言葉の使い方、文書の読みやすさ、明快さを勉強した方が良い。先日紹介したスェーデンのAXIS Communicationsが公開している文書群と日立のそれを読み比べてみると面白い。前者は実に明快な技術英語で記述されており、文書管理も徹底している。もちろん会社規模の違いもあろうが、文書に対する取り組み方の違いは明らかだ。「平易な言葉で正確に説明する」ことが、今の日本ではおろそかにされている。悲しいことに、多くの人達はこの事実に気づいてすらいないのだ。

それにしても暑い。香港のお粥と野菜炒め、マンゴープリンが懐かしい・・・。