2010年7月11日日曜日

SH-2A GNU GCC 4.5.0のインストール

CQ出版Interface誌付属SH-2A基盤にについて、色々と試行錯誤を繰り返してきました。
 HEWのライセンス切れで256KByteの制限が課せられ、TFTカラー液晶表示でのフォント表示、ファイルシステム(FAT)を利用したプログラムの開発が頓挫してしまいました。
 そこで、昨年同様GNU GCCでの開発に切り替えようと悪あがきを続けています。
 過去に述べたように、Interface誌Webサイト(GCC 4.4.0)、KPIT Webサイト(GCC 4.5.0)から入手したGNU GCCの開発環境でなかなか思い通りの動作が得られず独自にGNU GCCの環境の構築に挑戦しました。

[概要]
○パッケージ 
  GCC     4.5.0
  binutils  2.20.1(失敗)=> 2.19.1
  gmp     5.0.1
  mpfr     3.0.0
  mpc     0.8.2(GCC4.5.0から必須パッケージ)
  newlib   1.18.0
○インストール後の動作
  現時点で、Interface、KPIT 提供のGCC環境でのビルドと同じ動作。
  今まで発生したビルドエラーは、Makefileの記述ミスに起因したものでした。
○割り込み
  SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考にすると割り込み動作が初めて確認できました。 


※これ以降の記述は、Interface誌Webサイト等で公開されているGNU GCC開発環境を使えば不要です。当初 Makefile等の不備でGNU開発環境の構築を始めたのですが、結果的に不要な苦労をしたようです。(結構時間をとられてしまいました。)

1.インストール
 1)Cygwin 1.7.5 のインストール
  ・Archive Unzip
  ・Devel すべてインストール
  ・Libs すべてインストール
   今回GNUの一連のインストールでは ビルド時にプログラム”XXX”が無い、ライブラリ”libXXX”が無いといったビルドエラーが多発しました。手っ取り早く、CygwinのDevel、Libsのパッケージをすべてインストールすることでこの種のビルドエラーは回避できました。
   

 2)binutilsのインストール
  (1) 2.20.1では tc-arm.c のコンパイルエラー
   (メモ)binutils-2.20-2.20.1-patch ファイルの適用
     binutilsのインストール失敗に対応しようとし、パッチファイルを適用しようとしたが失敗。どうも、このパッチファイルは、binutils-2.20をbinutils-2.20.1にバージョンアップを行うものと思われる。
     (パッチの当て方 binutils-2.20.tar.gz を展開したディレクトリで「patch -p0 -d . < binutils-2.20-2.20.1-patch」を実行 )
  (2) 2.19.1をインストール
    ・mkdir build_binutils
    ・cd build_binutils
    ・../binutils-2.19.1/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
    ・make
    ・make check
    ・make install
  (3)CygwinのDevelの binutils をアンインストール
 3)gmp、mpfrのインストール 過去の記述を参照
 4)mpcのインストール
  ・mkdir  build_mpc
  ・cd build_mpc
  ・../mpc-0.8.2/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 5)GCCのインストール
  ・mkdir build_gcc
  ・cd build_gcc
  ・../gcc-4.5.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
  ・make
    (メモ)Cygwinのbinutillsパッケージでmakeすると「cannot compute suffix of object files」のエラー ==> 2)のbinutilsインストールで成功
  ・make check
     「autogen: Command not found」のエラー
    (メモ)autogen-5.10.2を入手しインストールを試みると、Configureで「Cannot find libguile」のエラー発生(CygwinのLibsはインストールはデフォルト(このときはすべてではなかった)=> 1)Cygwinのインストールに反映)
  ・make install(make chekuエラーは無視)
 6)newlibのインストール
  ・mkdir build_newlib
  ・cd build_newlib
  ・../newlib-1.18.0/configure --target=sh-elf --prefix=/usr/local/sh-tools --with-gmp=/usr/local/sh-tools --with-mpfr=/usr/local/sh-tools --with-mpc=/usr/local/sh-tools
  ・make 
  ・make check
  ・make install
 7)GCCのインストール その2
  ・cd build_gcc
  ・make all
  ・make install

※GNUの各パッケージのインストールは、ARM7TDMIとSH-2Aを並行して行いました。パッケージのビルドでtarget=arm-elf/target=sh-elfの差異がわからなかったので、各パッケージのインストール先はarm-tools/sh-toolsにしました。
また、各パッケージのインストール作業はビルドエラーを頻発しながら、繰り返しインストール作業を重ねました。

2.サンプルプログラム 動作確認
 1)gccのサンプルプログラム
   「第3章 メモリ・カードとFATファイル・システムの実装」の gcc用サンプル・プログラムを使用
 2)サンプルプログラムのビルド
  (1)asmfunc.sのエラー
    SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」をダウンロードし、その asmfunc.s を参考に修正する。
   ・asmfunc.sの修正
    「メモリ・カード...」と「SD/MMCカード...」差異を調べSetImask()の後半に
      .global _set_sp
      _set_sp:
        MOV R4, R15
        RTS
        NOP
      を追加。
    (「メモリ・カード...」のasmfunc.sではコンパイルエラーが発生。)
  (2)main.cの修正
   ・割り込みハンドラー関数 Isr_CMI0() はLEDの点滅のみの動作に修正
   ・delay_ms()、SetCCR1(x)、IoInit()、 main ()以外の関数は削除
   ・main()は、
     int main (void)
     {
       IoInit();   /* 内蔵周辺モジュールの初期化 */

       /* 起動メッセージ */
       delay_ms(10);
       while(1) {}
     }
     に削り込みました。
  (3)Makefileの修正
   ・TARGET = cmt0_test
   ・CSRC = main.c
     ファイルシステム関連のソースファイルを削りました。
   ・LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
     ライブラリ参照を m2 => m2a に変更
   ・CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
     コンパイルオプション -m2 => -m2aに変更

※m2では割り込みは動作せず、m2aに変更して、割り込み動作を確認できました。
(偶然、m2aにしたタイミングで、割り込みが機能しただけかも知れません。)

※今回構築したGNU GCCの開発環境ですが、ビルド時(make check)のエラーを無視しています。作成したプログラムの動作が確認出来た状況です。
 感想として、GNU GCCの開発環境の構築は私にとって、かなり困難になってきたように思います。
GNUの各パッケージについて、リリース毎にインストール手順の説明があったらと思いました。(私が、その情報に辿り着けなかっただけかも知れません。)

※やはり、SHの開発はHEWを使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。

0 件のコメント:

コメントを投稿