で、Ryuz氏の例外処理の実装(今までの流れから見るとARMベースか?)が公開 されるまでは寝て待ってるという選択もあるが、それはあまりに情けないので、 暇にまかせてしみじみとHOS V4のITRON APIをチェックしていくことにしたら どうかと思ったのだった。
さて、どうチェックしていくか。全てのサービスコールについてサンプルでも 作らなければならないかと思っていたら、さすが"標準"を規定するITRON、検 定仕様書が存在するとの情報をRyuz氏からいただいた。
http://www.itron.gr.jp/SPEC/mitron4-j.html#ITRON4-TESTからPDFファイルが持ってこられる。ウゲッ、テキストがキャプチャ出来ん… プレーンテキストかHTMLであればありがたかったのだが…。
で、これを読んでみると、別にCのソースコードが載っていて、「〜というコー ドを実行して、〜という結果を得られれば合格」という形にはなっていなかっ た。一例を挙げるとこんな風である。
テスト手順の例(ITRON4.0検定標準書より) |
あう〜。一応、気持ちは分からないでもないけど、ここから実際のコードを書 いていかねばならんのね。
Ryuzさんが「…体力的に…」とおっしゃるのも無理はない。こんなのが山ほど あるんだから。
"標準"って、やはりコストのかかるものなのだなぁ…。
でもま、暇に任せてやる分には問題無いか。
そういう感じで検定標準書をボチボチなぞってみようかと思い立ったのだが、 折角なのでそのソースは極力、"標準の"ライブラリコール(なんて言っても主 にprintfだけだが)で書きたくなった。自前のscif出力ルーチンにそれらしい 皮を被せるのでも構わないのだが、書式なんかを考え始めると非常に欝な気分 になってしまう。newlibを入れる日が来たようだ。
newlibは、ANSI Cライブラリ、算術ライブラリが含まれたものである。こいつ を導入すれば、printf族やstr族、その他各種算術関数が使えるようになる。
そこでgoogle.comでnewlib ftpをキーワードに検索した所、とあるディレクト リにヒットしたので、そこから
newlib-1.10.0.tar.gz (3647395bytes/MD5 = 4fb57dfbe987826f4ef56a7c5ca571ba) |
をゲットしてきた。ヒエェ〜!3.5MBだよ!
後はおなじみの作業だ。
まずはゲットしてきたアーカイブを展開。元が元だけにかなりデカイ。
frodo% tar xzf newlib-1.10.0.tar.gz |
お次はディレクトリを掘ってconfigure。
frodo% mkdir sh-hitachi-elf frodo% cd sh-hitachi-elf frodo% ../newlib-1.10.0/configure --prefix=/usr/local --target=sh-hitachi-elf Configuring for a i386-unknown-freebsd4.3 host. *** This configuration is not supported in the following subdirectories: target-libgloss (Any other directories should still work fine.) Created "Makefile" in /usr/home/m-arai/work/gnu/sh-hitachi-elf Configuring texinfo... No configuration information in texinfo Configuring etc... creating cache ../config.cache checking for a BSD compatible install... /usr/bin/install -c updating cache ../config.cache creating ./config.status creating Makefile |
で、make。勿論、makeはFreeBSD標準のmakeではなく、port/packageから入れ たgmakeだ。
frodo% gmake gmake[1]: Entering directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc' gmake[1]: Nothing to be done for `all'. gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc' Configuring in sh-hitachi-elf/newlib … sh-hitachi-elf-ranlib libc.a ln libc.a libg.a >/dev/null 2>/dev/null || cp libc.a libg.a rm -rf tmp rm -f crt0.o ln libc/crt0.o crt0.o >/dev/null 2>/dev/null \ || cp libc/crt0.o crt0.o gmake[2]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib' gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib' |
つつがなく出来たので、install。
frodo% su Password: frodo# gmake install /bin/sh ../newlib-1.10.0/mkinstalldirs /usr/local /usr/local gmake[1]: Entering directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc' gmake[1]: Nothing to be done for `install'. gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/etc' … mkdir /usr/local/sh-hitachi-elf/include/machine mkdir /usr/local/sh-hitachi-elf/include/sys gmake[3]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib' gmake[2]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib' gmake[1]: Leaving directory `/usr/home/m-arai/work/gnu/sh-hitachi-elf/sh-hitachi-elf/newlib' |
どこに手を入れるかというと、そこはズバリ newlib-1.10.0/newlib/libc/sys/sh/syscalls.cである。中を読めば分かるが、
… int _read (int file, char *ptr, int len) { return __trap34 (SYS_read, file, ptr, len); } … |
trapa #34に実装されたシステムコールを呼び出すものに他ならない。この内 の_readと_writeをひったくり、その他の無関係な奴は適当に0とか-1を返すだ けのものにしてやる。
さらに、ヒープを伸ばして領域を取るシステムコール_sbrk()に関しても、ヒー プとスタックの衝突を検出してabortする部分を殺す。そうしないと、スタッ クを.dataに移すHOSとしては、いつもabortになってしまうからだ。 そういった辺りをいい加減にやったのが、
syscalls.c.htmlである。極めていい加減。
実際の入出力に関してのコードをlibc内に入れてしまうのは気が向かなかった ので、ユーザプログラムの中において
/* 指定バイト読み込む */ __read( char *ptr, int len); /* 指定バイト書き込む */ __write( char *ptr, int len); |
という感じで書けばOKという風にした。