09年2月19日
開発環境を整える

あれから10日空きました(^^;
eCos/RedBootの修正を再実施しようと思ったけれど、ここで頑張るのはあまり意味が無いという結論に達したため、公開されているバイナリパッケージをDLして使用する事にしました。
で、自分で作成した4MB用eCos/Redbootとuclinuxを構築して、焼きこみ&起動完了。
一通りuclinuxが作動することが分かったので、次はデバッグ環境に取り組むことにしました。

まず、本に記載されているinsiightを使って見る。
デバッグ付きでビルドしたeCos/Redboot用アプリを起動。が、「libtermcap.so.2」が無いと怒られる。
いろいろ、調べて見ると 「ldso」と「libc5」と「termcap-compat」をインストールすれば使えるらしい。
aptitudeでパッケージを探すと、どれもそれらしいものが存在しない。
webで調べてとりあえず「ldso」は「ld.so.preload-manager」をaptitudeでインストール。「libc5」は「libc6」がすでにインストール済みだったので、何もせずに放置。「termcap-compat」はdebianのサイトからパッケージ「Termcap-compat_1.1.0.deb」をDLしてインストール。
で再度、insightを起動。画面が表示される。結局2つインストールしたどちらが効いたのかは不明だけれど「Termcap-compat_1.1.0.deb」のような気がする。

09年2月9日
AKI H8/3069NETボードで遊ぶ の続き

tftpd-hpaがこけてから、Debianの再インストールを実施。
前回はパーテーションを分けてインストールしていたけれど、今回はすべて同じパーテーションにインストール。
ブラウザ等等もインストールし、gccも構築。
前はデスクトップをKDEにしていたけれど、Eclipseを使うし、どうも標準の流れがGNOMEっぽいので、今回はGNOMEメイン。
いろいろ使い勝手がKDEと異なるので戸惑いながらも何とか初期設定的なものは完了。
早速tftpとnfsを設定。tftpは前回hpaで上手くいかなかったので今回はtftpdを使用。nfsはインストール時のパッケージ選択ですでにインストールされていたので、tftpdのみaptitudeで取得。
設定はHPで方法を調べて実施。設定が完了したので、tftpdでカーネルをDLして起動…動かない。
調べて見るとeCos/RedBootのバグ?でelfファイルのloadが上手く言ってない様子。
バグのあるソースを修正して、eCos/RedBootを4MBRam設定で再構築する必要があるとのこと。
なんだかめんどくさそうなので、後回しにして先にEclipseをインストールすることに。
本家からEclipseCDTのパッケージをDL、解凍して起動させると、JVMの1.5以上が必要と怒られる。
しょうがないのでSUNからJavaSEをDLしてインストール、というよりDLした実行ファイルを実行。
許諾契約っぽいものを読んでyesを実行するとそのまま解凍。
インストールされたかな!?と思ってEclipseを実行するとやっぱりJVMが無いと怒られる。
現在のシステムを調べると、どうやら「/etc/alternatives/java」のリンク先を変更する必要があるっぽいことがわかったので、DLしてきたJVMの「java」ファイルへリンク先を変更して、eclipseを起動、おっ動いた〜♪ でも英語…。
どうやら日本語パッチがあるようなので、早速DLしてREADMEを読む。DLした日本語化キットのpluginとfeaturesフォルダ内のファイルを、インストールしたeclipseの同盟フォルダへコピーすれば良い様子。早速実施して、eclipseを再起動させたところバッチリ日本語〜♪
さて、次は戻ってeCos/RedBootを何とかせねば。

09年2月5日
AKI H8/3069NETボードで遊ぶ の続き

Eclipsでソフト開発をする予定ですが、
その前にAKI H8-3069NETボードが手に入ったので、組み立てることに。

前にuclinuxを動かしたときは、カーネルの起動と同時にメモリーが足りなくなっていたのでとりあえず増設。
4MBになったところで、動作テスト。
eCosは4MB対応版をFlashへ書き込み。
uclinuxのカーネルはnfsでマウントするため、hostの設定を開始。
ちょうどウチには常時稼動マシンとして玄箱があるので、玄箱のdebianへnfsとtftpサーバーをインストール&設定。
tftpは「tftp-hpa」、nfsはnfs-kernel-serverが使いたかったんだけれど、linuxのkernelが対応していないって
起こられてしまったので 「unfs3」で実施して見ることに。
あっちこっち、設定して完了。
H8/3069NETからtftpでカーネルをload OK
で、ブートコマンドを入れてブートしたものの…、nfsのマウントに失敗…。 error 13
しょうがないのでhostを変更、通常のパソコンに nfsとtftpdをインストール。
aptitudeでインストールしたところtftpd-hpaが調子悪く…。
aptitude で remove も reinstall もできなくなった=どうにもならないのでHOSTのdebianを再インストールすることに。
というわけで、今日はココまで。
tftpd-hpaのせいでだいぶ後戻りだ…ぅぅぅ。


09年2月2日
AKI H8/3069NETボードで遊ぶ の続き

昨日コンパイル完成したh8300-elf-gccが正常に動くかテスト。
ダウンロード済みのeCos/RedBootに対して、ecosconfig実施後 make。
あれ、昨日gccをコンパイルする際に出た、アセンブラコードの認識不良によるエラーメッセージと似たような結果が表示されるぞ…。
で、検索をする。
どうもbinutilの--prefix指定先と、gccの--prefix指定先が違うことが原因の様子。
Makefileをいじるなんて強引なことをしたのがいけなかったのかな…。

改めて「--prefix」指定先を「/usr/local/bin/h8300-elf/」に統一して実施。
順番にmake、コンパイル完了。
で、再度eCos/RedBootをmake、やったバッチリmakeできた◎
そんなわけで記念の記録
$ h8300-elf-gcc -v
/usr/local/bin/h8300-elf/bin/../lib/gcc-lib/h8300-elf/3.1.1/specs から spec を読み込み中
コンフィグオプション: ../gcc-3.1.1/configure --target=h8300-elf --prefix=/usr/local/bin/h8300-elf/ --enable-languages=c,c++
スレッドモデル: single
gcc バージョン 3.1.1


ちなみにインストールされたh8300-elf-gccへのパスは--prefixを指定すると通っていないので「.bash_profile」へのexport記述追加が必要でした。

私的gcc構築のポイントおさらい。

1.「obstack.h」の変更
2.「decl.c」の変更
3.「--prefix」は同じ場所を指定
4.インストールパス(私の場合「/usr/local/bin/h8300-elf/bin/」)へのパスを通す
   .bash_profileへ「export PATH=$PATH:/usr/local/bin/h8300-elf/bin/」の追加

基本手順は「eCos/RedBoot for H8/300」ページの佐藤氏の手順です。

ようやくgccが完成したので次は開発環境をどうにかしたいな。
何時までもkwriteを単体で使うのは大変そうなので。
とりあえずeclipse CDT での開発にチャレンジしようかと。
ためしにaptitudeでeclipseをインストールしたら、バージョンが3.2で、CDTのインストール方法が良く分からず。
日本語パッチも3.3と3.4用はあるのだけれど、3.2用が見つからない。
サイトから直接eclipseをDLしてインストールするほうがよさそうだ。

あと、Windows環境でのgcc構築も可能かチェックしてみている途中です 。
Windowsにcygwinをインストール。
gcc構築用にbinutilとgccの各ソースを配置して、同じ方法でconfigure
しようとおもったら、cmpが無いと怒られる。
調べて見たら、別途cmpをdiffutilとしてDLしてインストールする必要があるとのこと。
ソースをDLしてconfigure、ってcmpが欲しいから構築しようとしているのにcmpが無いと怒られた…。
とりあえず無視して、makeって、makeもインストールされてないらしい。。。
調べて見るとcygwinインストール時にmakeもインストールされるように選択する必要があるとのこと。
gccも入っていなかったので、両方まとめてインストールしてからmake。
とりあえずcmpは完成。
あとは順番にbinutilをmake、install。
と、ここで時間がなくなったので今日はココまで。


09年2月1日
AKI H8/3069NETボードで遊ぶ

せっかくいろいろいじりだしたので日記の意味で記録を残すことに。
どこまで続くか分かりませんが。

はじめる組み込みLinux」 を去年購入したので、ぼちぼちいじり始める。
とりあえず、本に載っていた内容を順番に進め、eCos/RedBootを書き込み。
問題なく動作する。
続けてuclinuxを試す。
本にしたがってTFTPを立ち上げ、構築したカーネルを呼び出してみる。
NFSの呼び出しに失敗して、カーネルパニック…。
NFSの設定を見直したところ、一部間違っていたところがあったので直して再起動。
uclinuxがとりあえず起動。起動中からメモリーが足りないと表示されたけれど、まぁ気にしない気にしない。
↑ココまでは1月中に実施。

ここまで順調に進んだので、次はeCos/RedBootを自分で構築したいと思い出し、本を参考に実施。
redbootの構築にはuclinux用のgccは使用できないらしい。
どうせなので、gccも自分で構築して見るかと思い、ネットをあさる。
eCos/RedbootのH8/300移植のプロジェクトHP「eCos/RedBoot for H8/300」に掲載されている
佐藤氏の手順にしたがって準備する。
とりあえず、必要なものは
 ・binutils-2.12.1.tar.gz
 ・gcc-3.1.1.tar.gz
ってことなので、webをあさって入手。
記載されている公式の手順に従って、構築を始める。
binutilsはconfigure→make→make install は特に問題なし。

続けてgcc
こちらもそのまま実施。
DLしたパッケージを解凍して、公式HPからDLしたパッチを当てて、configure→make
あれれ、Errorが出てしまう…。

エラーは
read-rtl.c: In function ‘read_rtx’
read-rtl.c:662: error: invalid lvalue in increment

なんだか左辺のインクリメントがおかしいらしい。
エラーの発生元を探る。どうやら「obstack.h」内が原因の様子。
どうすれば良いか分からないけれど、適当にいじってみる。
とはいえ、linux自体はじめたのが去年の12月。どうすれば良いかまったく分からず途方にくれる。
そもそも #define宣言の書き方自体が見慣れた書き方じゃない…。
ナゾだと思いつつ、いろいろいじり倒して見る。
void**をchar**に変更するなどなど、繰り返しつつmake。上手く行かない。
半分あきらめモードになりながらソースを眺めていると、どうやら#ifで別の部分が実行されている様子
たどっていくと見慣れた#define宣言が。とはいえやっぱりどうしたものか…。
その後も色々いじった結果、好転せず。あきらめモード…。

でも、あきらめきれずHPを検索。
すると、修正方法っぽいことが記載されているブログを発見。
どうやら引っかかっていた部分を修正するdiffファイルの断片っぽい。
ためしにその内容を適用して見る。おっ進んだ!!

変更したのは「obstack.h」
# define obstack_ptr_grow(OBSTACK,datum) \
__extension__ \
({ struct obstack *__o = (OBSTACK); \
if (__o->next_free + sizeof (void *) > __o->chunk_limit) \
_obstack_newchunk (__o, sizeof (void *)); \
*((void **)__o->next_free)++ = (datum); \
(void) 0; })
のところ

どうやら ++ = となっているのがよろしくないらしい。
=の適用を先に実施して、++は次の行で +=として実施すればOKになった。
*((void **)__o->next_free)++ = (datum); \
*((void **)__o->next_free) = (datum); \
__o->next_free += sizeof(void *);; \
でもやっぱりその後固まる…。また似たようなエラー。

エラーの内容は
decl.c: In function ‘push_binding_level’:
decl.c:518: error: invalid lvalue in assignment
decl.c: In function ‘pop_binding_level’:
decl.c:574: error: invalid lvalue in assignment
decl.c: In function ‘suspend_binding_level’:
decl.c:589: error: invalid lvalue in assignment
decl.c:611: error: invalid lvalue in assignment
decl.c: In function ‘resume_binding_level’:
decl.c:624: error: invalid lvalue in assignment
decl.c: In function ‘pushdecl_with_scope’:
decl.c:4303: error: invalid lvalue in assignment
decl.c:4305: error: invalid lvalue in assignment
decl.c: In function ‘cxx_init_decl_processing’:
decl.c:6532: error: invalid lvalue in assignment
decl.c: In function ‘grokdeclarator’:
decl.c:10111: error: invalid lvalue in assignment
decl.c:10114: error: invalid lvalue in assignment
decl.c: In function ‘start_function’:
decl.c:13751: error: invalid lvalue in assignment

左辺への適用ができないらしい。なんかさっきも同じようなことがでたなぁ、と思いつつソースを見る。
さっきと様子が違う。さすがに同じようには修正できないっぽい。
しょうがないので、修正方法を再び探すと、さっき見つけた修正箇所が記載されていたブログの同じところ。
というか、適用しなかった残りのdiff修正箇所が該当することが判明。
同じように修正したら無事に通過〜♪

変更したのは「decl.c」
#define current_binding_level \
(cfun && cp_function_chain->bindings \
? cp_function_chain->bindings \
: scope_chain->bindings)
#define current_binding_level \
(*(cfun && cp_function_chain->bindings \
? &cp_function_chain->bindings \
: &scope_chain->bindings))

結構進むようになったなぁと思っていたら、また止まる。
エラーの内容は
lib1funcs.asm:1: Error: no such instruction: `libgcc routines for the Hitachi H8/300 CPU.'
lib1funcs.asm:2: Error: no such instruction: `contributed by Steve Chamberlain<sac@cygnus.com>'
lib1funcs.asm:110: Error: invalid character '.' in mnemonic
lib1funcs.asm:111: Error: no such instruction: `bne .L2'
lib1funcs.asm:112: Error: invalid character '.' in mnemonic
lib1funcs.asm:113: Error: no such instruction: `bne .L2'
lib1funcs.asm:114: Error: invalid character '.' in mnemonic
lib1funcs.asm:115: Error: no such instruction: `rts'
lib1funcs.asm:117: Error: invalid character '.' in mnemonic
lib1funcs.asm:118: Error: no such instruction: `bgt .L4'
lib1funcs.asm:119: Error: no such instruction: `bne .L3'
lib1funcs.asm:120: Error: invalid character '.' in mnemonic
lib1funcs.asm:121: Error: no such instruction: `bls .L3'
lib1funcs.asm:123: Error: invalid character '.' in mnemonic
lib1funcs.asm:124: Error: no such instruction: `rts'
lib1funcs.asm:126: Error: invalid character '.' in mnemonic
lib1funcs.asm:128: Error: no such instruction: `rts'

いろいろwebで調べたところ、どうも先にインストールしたbinutilsが上手く適用されていないため
アセンブラで記述されてるソースコードを上手く処理できないのが原因の様子。
binutilsをインストールするときに「--prefix」でインストール場所を指定したのがまずかったっぽい!?

いろいろ考えた結果
1.とりあえず「h8300-elf-gcc」は「はじめる組み込みLinux」に掲載されていた内容から入手しているので
  なくても大丈夫といえば大丈夫。
2.--prefixを指定せずにbinutilをインストールすると上記で取得したgccに悪影響が出たらやだなぁってことで
  あきらめることに。

で、とりあえず作業終了ということでパソコンをシャットダウン。
小一時時間ほどたって、 改めてこのページを書くために、エラーメッセージの詳細が欲しく、makeを実施。
あれ!?makeが通ったぞ?

おかしいなと思い、 Makefileの内容をチェック
あ、「--prefix」を指定してなかった。
で指定して見る。
あ、同じエラーが出た。
ということはMakefileをどうにかすれば良いのか。

で探して見ると
tooldir = $(exec_prefix)/h8300-elf
build_tooldir = $(exec_prefix)/h8300-elf

うわー、すごくそれっぽい
なのでココをちょっと変更

#先にインストールしたbinutilsの--prefixフォルダ名
tool = /usr/local/bin/binutils-2.12

#tooldir = $(exec_prefix)/h8300-elf
#build_tooldir = $(exec_prefix)/h8300-elf
tooldir = $(tool)/h8300-elf
build_tooldir = $(tool)/h8300-elf

この状態で、再度make
おっ、ばっちりだ〜♪

あとは、作ったgccでeCos/RedBootをmakeして、AKI H8/3069NETボードへインストールして実験だ。

余談:
ココまでいろいろいじっていいて、ふと思った。
昔この状態でリリースされていて、問題なく動いていたということは、このソースをコンパイルしているhostのgcc
が新しくなっているため、コンパイルエラーが出ている!?
ためしに、最新のgccのソースコードをあさって見る。
修正した「obstack.h」 の該当の場所を見て見ると。
ありゃ、記述内容が全然違う…。 で結局解決せず。


次へ

TOPへ戻る