OS自作入門 -Advent03-

OS自作入門 -Advent03-

クロスコンパイラ作ってなかった

そういやホストコンパイルに必要なもの入れただけでクロス用のコンパイラ達作っていなかった。

ホストコンパイラでクロスコンパイラをコンパイルする。

という形式だったのをすっかり忘れていた。準備しよう。

  1. binutilsのダウンロード
    http://ftp.gnu.org/gnu/binutils/
  2. binutilsをH8用にコンパイル(インストール先を指定)
    あんまシステム汚したくなかったので作業用のディレクトリにbuildする。

     cd binutils-2.29
     ./configure --target=h8300-elf --disable-nls --prefix=$HOME/os-advent2017/tools
     make
     make install
  3. gccもダウンロード
    http://ftp.gnu.org/gnu/gcc/
  4. gccをH8用にコンパイル(インストール先を指定)

    cd gcc-7.2.0
    ./configure --target=h8300-elf --disable-nls --prefix=$HOME/os-advent2017/tools
    ./configure \
     --target=h8300-elf \
     --disable-nls \
     --disable-threads \
     --disable-shared \
     --enable-languages=c \
     --prefix=$HOME/os-advent2017/tools
    make
    make install

    ./configureでエラーを吐くな。

    configure: error: Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+.

    GMP, MPFR, MPCというのが必要らしい。
    http://ftp.gnu.org/gnu/gmp/
    http://ftp.gnu.org/gnu/mpfr/
    http://ftp.gnu.org/gnu/mpc/
    ここからダウンロード

    GMPのコンパイル

     cd gmp-6.1.2
     ./configure --prefix=$HOME/os-advent2017/tools/gmp
     make
     make check
     make install

    MPFRのコンパイル

     cd mpfr-3.1.6
     ./configure --prefix=$HOME/os-advent2017/tools/mpfr \
       --with-gmp=$HOME/os-advent2017/tools/gmp
     make
     make check
     make install

    MPCのコンパイル

     cd mpc-1.0.3
     ./configure --prefix=$HOME/os-advent2017/tools/mpc \
       --with-gmp=$HOME/os-advent2017/tools/gmp \
       --with-mpfr=$HOME/os-advent2017/tools/mpfr
     make
     make check
     make install

    再度トライ!

     cd gcc-7.2.0
     ./configure \
       --target=h8300-elf \
       --disable-nls \
       --disable-threads \
       --disable-shared \
       --enable-languages=c \
       --with-gmp=$HOME/os-advent2017/tools/gmp \
       --with-mpfr=$HOME/os-advent2017/tools/mpfr \
       --with-mpc=$HOME/os-advent2017/tools/mpc \
       --prefix=$HOME/os-advent2017/tools
     make
     make install

    まだ怒られるな。

     Makefile:179: ../.././gcc/libgcc.mvars: No such file or directory
     make[2]: *** No rule to make target `../.././gcc/libgcc.mvars'.  Stop.
     make[1]: *** [all-target-libgcc] Error 2
     make: *** [all] Error 2

    この辺りを調べると
    http://www.linuxforums.org/forum/applications/172812-solved-gcc-make-error-missing-libgcc-mvars.html
    http://d.hatena.ne.jp/satfy/20101226

    なるほど。separate build directoryでやれということらしい。

     rm -rf gcc-7.2.0 # 一旦掃除
     tar xvzf gcc-7.2.0.tar.gz # 再度展開
     mkdir build # separate build directory
     cd build
     ../gcc-7.2.0/configure \
       --target=h8300-elf \
       --disable-nls \
       --disable-threads \
       --disable-shared \
       --enable-languages=c \
       --with-gmp=$HOME/os-advent2017/tools/gmp \
       --with-mpfr=$HOME/os-advent2017/tools/mpfr \
       --with-mpc=$HOME/os-advent2017/tools/mpc \
       --prefix=$HOME/os-advent2017/tools
     make
     make install

    libsspでエラーが出る。(スクショ撮り忘れたけどこんな感じの)

     ../../../libssp/ssp.c:78:30: error: 'O_RDONLY' undeclared (first use in this function)
       fd = open ("/dev/urandom", O_RDONLY);
                                  ^

    http://tokis.cocolog-nifty.com/blog/2014/05/kozosgcc-490w-1.html
    これによると必要なさそうだからskip。

     ../gcc-7.2.0/configure \
       --target=h8300-elf \
       --disable-nls \
       --disable-threads \
       --disable-shared \
       --disable-libssp \ # 追加
       --enable-languages=c \
       --with-gmp=$HOME/os-advent2017/tools/gmp \
       --with-mpfr=$HOME/os-advent2017/tools/mpfr \
       --with-mpc=$HOME/os-advent2017/tools/mpc \
       --prefix=$HOME/os-advent2017/tools

    できた!tools/bin/h8300-elf-gccの存在を確認!

先日の続きを

かなりここまでで疲弊したのだがまだ全然H8に触っていないぞー。ということでちょっと頑張る。
Makefileを作ってビルドしてROMに書く。が流れ。

Makefile作成

本に習ってそのまま書く。結構ボリュームがある。

ファームウェアをビルド!

本の通りにディレクトリ構造を作って

ls
# Makefile defines.h ld.scr lib.c lib.h main.c serial.c serial.h startup.s vector.c
make install

いくつかタイポがあったので修正してコンパイル成功!

ls
# Makefile defines.h kzload  kzload.elf ld.scr lib.c lib.h lib.o main.c  main.o serial.c serial.h serial.o startup.o startup.s vector.c vector.o

kzload : 実行形式ファイル
main.o : オブジェクトファイル

が出力されている!

h8writeで書き込めるようにフォーマットを変換

make image
ls
# Makefile   kzload     kzload.mot lib.c      lib.o      main.o     serial.h   startup.o  vector.c
# defines.h  kzload.elf ld.scr     lib.h      main.c     serial.c   serial.o   startup.s  vector.o

kzload.motがいるな。
これを書き込めばいいはずだ。

ハードウェアの準備

ここにきてようやくH8(マイコン)の出番だ。

  • USBシリアル・アダプタ
  • シリアルストレートケーブル
  • 電源アダプタ
  • H8/3069F

デバイスファイルは

ls /dev/tty*
# crw-rw-rw-  1 root         wheel    2,   0 12  3 12:00 /dev/tty
# crw-rw-rw-  1 root         wheel   19,   0 11 22 23:19 /dev/tty.Bluetooth-Incoming-Port
# crw-rw-rw-  1 root         wheel   19,   2 12  3 13:36 /dev/tty.usbserial-FT0BTH3I
# crw-rw-rw-  1 root         wheel    4,   0 11 22 23:19 /dev/ttyp0

/dev/tty.usbserial-FT0BTH3Iかな。日付も電源入れた時っぽいし。
ということで少しMakefileを書き直す

H8WRITE = ../../tools/h8write/h8write => ../../tools/h8write/kz_h8write
H8WRITE_SERDEV = /dev/cuad0 => /dev/tty.usbserial-FT0BTH3I

よーしこれで準備は整ったはず。

書き込む & 読み込む

まずは配線周り。

PC - USB-Serial変換ケーブル - Serialケーブル -> H8
電源 - 電源アダプタ -> H8
こんな感じ。

imageをwriteするには

make write

上手くいったみたい。

H8のモードを切り替えてリセット!
シリアル接続を以下のコマンドで実行

cu -l /dev/tty.usbserial-FT0BTH3I -s 9600  

これでリセットボタンを押すとHelloWorldが!

よーし上手くいったぞー。
step1が一番大変とか何かで読んだけどクリア!