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を使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。
2010年7月11日日曜日
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿