H8マイコンでLinux (放置中止)
- 2011/07/03
- カテゴリー:電子工作
- タグ:H8マイコンでLinux
買ってから2年程度放置していた秋月電子のH8マイコンを久々に引っ張り出しました。
とりあえず今のところは、IDEインターフェースを作って、CFカードからLinuxをブートさせようとしています。IDEインターフェースの回路は、H8マイコンと同時期に買った 『はじめる組み込みLinux』 という本からそのままもってきました。
どうせならCPLDを使い、SDRAMを積んでメモリ空間をほぼフルに使えるようにしたり、怪しいI/Fをたくさん搭載したいですね。
さて、Linuxのビルド環境の構築ですが、ちょうど手元に、Ubuntu11.04-32bit版をインストールしたVMware仮想PCがあったので、これをホストとして使うことにします。
下ごしらえ
- aptitude(apt-get) するもの
libmpfr-dev
(g++-4.1 libgmp3-dev libgmpxx4ldbl libstdc++6-4.1-devも依存関係で一緒に入ります)
libmpc-dev - ソースをダウンロードしてくるもの
binutils-2.21
gcc-4.5.3
newlib-1.19.0
そしてビルド・・・
・binutils-2.21
$ mkdir _build
$ cd _build
$ ../configure --target=h8300-elf --prefix=/usr/local/h8300 --with-newlib
$ make 2>&1 | tee make_log
$ sudo make install
・gcc-4.5.3
$ mkdir _build
$ cd _build
$ ../configure --target=h8300-elf --prefix=/usr/local/h8300 --enable-languages=c --enable-shared --disable-nls --disable-threads --disable-werror --with-newlib --with-headers=/usr/local/src/newlib-1.19.0/newlib/libc/include
$ make 2>&1 | tee make_log
$ sudo make install
・newlib-1.19.0
$ mkdir _build
$ cd _build
$ ../configure --target=h8300-elf --prefix=/usr/local/h8300
$ make 2>&1 | tee make_log
$ sudo make install
これでひとまず完了。
そういえばgccのコンパイルで、初めは"--enable-languages=c,c++"としていたのですが、エラーが出てしまいました。gccのバージョンを変えても、その他のオプションを変えても、解消の兆しが見えません・・・
/usr/local/src/gcc-4.5.3/_build/./gcc/xgcc -shared-libgcc -B/usr/local/src/gcc-4.5.3/_build/./gcc -nostdinc++ -L/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/src -L/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/src/.libs -nostdinc -B/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/newlib/ -isystem /usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/newlib/targ-include -isystem /usr/local/src/gcc-4.5.3/newlib/libc/include -B/usr/local/h8300/h8300-elf/bin/ -B/usr/local/h8300/h8300-elf/lib/ -isystem /usr/local/h8300/h8300-elf/include -isystem /usr/local/h8300/h8300-elf/sys-include -mh -mn -mint32 -x c++-header -g -mh -mn -mint32 -I/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/h8300-elf -I/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include -I/usr/local/src/gcc-4.5.3/libstdc++-v3/libsupc++ -O2 -g -std=gnu++0x /usr/local/src/gcc-4.5.3/libstdc++-v3/include/precompiled/stdc++.h \
-o h8300-elf/bits/stdc++.h.gch/O2ggnu++0x.gch
In file included from /usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/random:54:0,
from /usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/bits/stl_algo.h:66,
from /usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/algorithm:63,
from /usr/local/src/gcc-4.5.3/libstdc++-v3/include/precompiled/stdc++.h:64:
/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/bits/random.tcc: In member function 'void std::seed_seq::generate(_RandomAccessIterator, _RandomAccessIterator)':
/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/bits/random.tcc:2724:47: error: no matching function for call to 'max(int&, const size_t&)'
In file included from /usr/local/src/gcc-4.5.3/libstdc++-v3/include/precompiled/stdc++.h:65:0:
/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/bitset: In member function 'void std::bitset<_Nb>::_M_copy_from_ptr(const _CharT*, size_t, size_t, size_t, _CharT, _CharT)':
/usr/local/src/gcc-4.5.3/_build/h8300-elf/h8300h/normal/int32/libstdc++-v3/include/bitset:1328:66: error: no matching function for call to 'min(size_t&, int&)'
make[8]: *** [h8300-elf/bits/stdc++.h.gch/O2ggnu++0x.gch] エラー 1
調べてみると、'min(size_t&, int&)' については下記のような解決方法があるようです。patchを当てると確かにエラーがでなくなりました。
http://old.nabble.com/Failed-to-make-h8300-toolchain.-td24088154.html
'max(int&, const size_t&)' のほうは、これといった情報を見つけられませんでした。でも同じ原因のような気がします。ramdom.tccの多分このあたりが怪しいとは思うのですが・・・
764 template<typename _RandomNumberEngine, size_t __k>
765 typename shuffle_order_engine<_RandomNumberEngine, __k>::result_type
766 shuffle_order_engine<_RandomNumberEngine, __k>::
767 operator()()
768 {
769 size_t __j = __k * ((_M_y - _M_b.min())
770 / (_M_b.max() - _M_b.min() + 1.0L));
771 _M_y = _M_v[__j];
772 _M_v[__j] = _M_b();
773
774 return _M_y;
775 }
...
2716 const size_t __s = _M_v.size();
C++でプログラミングをすることが目的ではないので、C++のビルドは今回は諦めることにしました。