2010年6月30日水曜日

SH-2A(SH72620) 開発用 GNU GCC 環境整備中

今回は、GNU GCCによる環境整備の途中経過をメモ的に記述します。
7/1追記

 付属SH-2A基板(CQ出版Interface誌)で、SHマイコンデビューを果たしたと思いきや、HEWのライセンス切れ(試供)で、約半数のテストプログラムのビルドが不可となりました。
 ◎ビルド不可となったプログラム 
  ・ビデオディスプレイコントローラを使ったプログラム、特にフォントを組み込んだプログラム
  ・ファイルシステム(FAT)を組み込んだプログラム
 ◎HEWの制限(256KB)内でビルド可能なプログラム。
  ・簡易オシロスコープほか、V850、ARM7、Cortex-M3で組んだプログラムをSH用に修正したプログラム。
 結局、SH72620の特色を十分に活かそうとしたプログラムが制限にかかってしまったと言う感じでしょうか。

 以前、「GCC対応シリアル・ダウンローダ(TinyMON)」でGNU GCCによるビルドを行っているので、ビルド不可となったプログラムをGCCでビルドしてみました。
 なお、GNU GCCの環境は、KPITから入手したものと、Interface誌Webサイトから入手したものを試しました。特に、大きな違いは無いようです。(組み込まれているパッケージの数はKPITの方が多いようです、現時点で、ビルドエラーの発生状況は同じです。)

1.開発環境について(ビルド時のエラー)
  CMT割り込みのハンドリングが比較的理解しやすいと思い、I誌7月号3章「メモリ・カードとFATファイル・システムの実装」のサンプルコードcq_sh7262_gccを雛形に、HEWの制限に引っ掛かったプログラムプロジェクトをGCC対応をおこないました。
 ◎発生したビルドエラー その1
  ・asmfunc.s: Assembler messages:
   asmfunc.s:425: Error: misaligned data
   asmfunc.s:412: Error: offset to unaligned destination
   make: *** [asmfunc.o] Error 1
    asmfunc.sのSet interrupt mask level のコードを削除(もう少し検証)
 ◎発生したビルドエラー その2(その1での修正後)
  ・undefined reference to `end'
    過去に、このエラーで悩んだ記憶があるような。。。
    リンクスクリプトファイル Tsh72620_ram.ld を修正。
  ・undefined reference to `__fpscr_values'
  ・undefined reference to `log10'
  ・undefined reference to `pow'
    GNU GCCの開発環境に、mpfr、gmpパッケージを追加する必要があると思われる。
   ==>mpfr、gmpパッケージのインストール成功後も解決できず。7/1現在

2.開発環境について(mpfr、gmpパッケージの追加)
 I誌7月号6章「SH-2A対応GCCによるクロス開発環境の構築と使い方」のMPFRライブラリ、GMPライブラリのインストールを参考に、同パッケージのインストールを行いました。
 しかし、mpfrパッケージのインストールは失敗しました。
 (昨年はARMで成功していたが今回失敗)
 ●対処  7/1追記
  ・両パッケージのインストール先を /usr/local/sh-tools にする。
    Interface誌提供のGNU GCC環境は /usr/local/sh-tools
  ・gmpパッケージを先にインストールする。
    ①./configure --prefix=/usr/local/sh-tools
    ②make / make check / make install
  ・mpfrパッケージをgmpライブラリ、インクルードファイル指定でインストールする。
    ①/configure --prefix=/usr/local/sh-tools --with-gmp-include=/usr/local/sh-tools/include --with-gmp-lib=/usr/local/sh-tools/lib
    ②make / make check / make install


3.GNU GCCにより作成したプログラムについて。
 前述のプログラムについて、数値演算関数、浮動小数点関連のコードを削除し、とりあえずビルドを通しました。
 そのプログラムの動作は以下の通りでした。
 1)割り込みは不調
   CMTおよびMTU2による割り込み処理を試しましたが、いづれも不調でした。ただし、一部のプログラムについては、割り込みによるLEDの数回の点滅を確認できましたが、割り込みを使いこなすにはほど遠い状況です。
 2)空のforループの回りが遅い。
   Wait用に使用した、空のforループ HEWで1秒であったものがGCCでは4秒弱かかりました。結構気になります。
 3)割り込み処理なし、main()内のwhile(1)ループで処理をこなすプログラムは安定動作。
   (高機能のマイコンを使う意味がなさそう。)

以下に今後の課題をまとめます。
○GNU GCCの開発環境に、mpfr、gmpパッケージを追加
 =>成功 7/1
○割り込み処理の安定動作
○処理速度の改善、オプティマイズの検討

9 件のコメント:

  1. 同じところで詰まったようですね。

    asmfunc.s:425: Error: misaligned data
    は、その上の行に、
    .align 0x4
    でアライメントを補正すると通りました。古いgccだとエラーにならなかったのですが、、、
     参考になれば。

    返信削除
  2.    asmfunc.s:425: Error: misaligned data

    同じところで詰まったので、コメント

    .align 0x4
    を2行上(ラベルの直前)に追加すれば通ります。

    また、その後リンカで、 udivsi3_i4i がundefined になる件については、 -lgcc-Os-4-200 でリンクできるはずなですが、まだ通っていません。(別のではリンクできたのだが)

    返信削除
  3. Tenさんコメントありがとうございます。

     asmfunc.sの件
    私は、SH-2A基板特設ページ「SD/MMCカード対応ブート・ローダ」のasmfunc.sで凌いでいます。

     udivsi3_i4i がundefined の件
    Makefileをいじっていたら、なんとなく通りました。リンクオプション -lgcc-Os-4-200 は、私にとって未知のオプションです。(なんとなく・・・お恥ずかしいかぎりです。)

    現在、公私ともに多忙で、有用なコメントに対し、十分な対応できずお詫び、いたします。
    なお、本件、顛末について、コメントいただければ幸いです。

    返信削除
  4. その後の状況です。 -lgcc-Os-4-200 は、SH2A用の関数ライブラリで、udivsi3_i4i がインライン展開されずに、ライブラリを必要としてしまうからですね。udivsi3_i4i でググれば出てきます。

    LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.4.0/m2
    LIBS = -lgcc -lgcc-Os-4-200
    $(LD) $(LDFLAGS) -o $@ $^ $(LIBS)

    で通りましたが、実行したところ、main()のあとのdelay()で止まっています。
    どうもタイマー割り込みが動いていないようで、現在解析中、、、

    返信削除
  5. Tenさんコメントありがとうございます。

    こちらは、現在、I誌7月号の3章の「メモリ・カードとFAT...」を試しています。(いろいと手詰まりで、原点に戻ってGCCによる開発を見直しています。)

    はじめ私も、delay()で止まっていました。

    delay()は、CMT0のタイマ割り込みを使っており、どうも私のGNU GCC環境ではSH-2Aの割り込み動作が不安定で、現在たまたま、delay()が機能しているようです。

    Makefileはオプティマイズオプションを -O0 に、コンパイルオプションを -m2a に変更したぐらいです。

    *** Makefile ***

    TARGET = fftest
    CSRC = main.c scif.c ff.c mmc.c monitor.c option/cc932.c SH7262_Timer.c
    ASRC = asmfunc.s
    OPTIMIZE = -O0
    DEFS =
    LIBDIR = /usr/local/sh-tools/lib/gcc/sh-elf/4.5.0/m2a
    DEBUG = dwarf-2
    LDSCRIPT = sh72620_ram.ld

    CC = /usr/local/sh-tools/bin/sh-elf-gcc
    OBJCOPY = /usr/local/sh-tools/bin/sh-elf-objcopy
    OBJDUMP = /usr/local/sh-tools/bin/sh-elf-objdump
    SIZE = /usr/local/sh-tools/bin/sh-elf-size

    ASFLAGS = -Wa,-adhlns=$(<:.s=.lst),-gstabs
    ALL_ASFLAGS = -I. -x assembler-with-cpp $(ASFLAGS)
    CFLAGS = -Wall -g$(DEBUG) -m2a $(OPTIMIZE) $(DEFS)
    LDFLAGS = -Wl,-Map,$(TARGET).map,--cref,--gc-sections -T$(LDSCRIPT) -L $(LIBDIR)
    OBJ = $(CSRC:.c=.o) $(ASRC:.s=.o)


    all: $(TARGET).elf lst text size

    $(TARGET).elf: $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

    ・・・・
    *** Makefile END ***

    (SH7262_Timer.cは自作ソース、delay()で止まっていたとき、一時、代替関数として使用、現在一部残したため組み込んでいます。)

    返信削除
  6. その後の情報をUpdateします。

     編集さんに聞いてみたところ、HEWのBootLoaderはレジスタバンクがONになってて、gccのほうはなってない、とのことなので、そのへんをいじる必要がありそうです。

     私はBoot時にダンプモニタが起動するVersionをもらってて、そこからバイナリロードでBootしてるのですが、別のサンプルでCMT0が動いているので、そこにcq_sh7262_gccのCソースをくっつけたら、動いてます。

    返信削除
  7. Tenさん、レジスタバンクONの情報ありがとうございます。
    現在、私は、CMT0の割り込みは何とか機能していますが、MTU2の割り込みで詰まっています。(gccに切り替えた当初から)
    頂いた、コメントは問題解決の一助になりそうで、私なりに、レジスタバンクの設定を見直した上で、MTU2の割り込みに再挑戦したいと思います。

    返信削除
  8. I誌付属のSH-2Aを開発したいと思い、Cygwinをインストールして特設ページにあったビルド済みGCCおよび各種ツール一式を/usr/localにコピーしました。

    同じく配布されているソース一式
    cq_gnu_resources20100424.tar.gz
    にあった newlib_sample をコンパイルしても、
    floatやdoubleなど浮動小数点がちゃんと
    扱えていないようです。

    同じような状況はありませんでしたか?

    返信削除
  9. ぽんた さん コメントありがとうございます。
    SH-2Aのアプリケーション開発でGCCを使う場合、浮動小数点がうまく扱えないようでした。さらに、複数タイマーによる割り込み処理もうまく扱えなかったり、処理能力が充分活用できていないようで、趣味でマイコンをいじっている私としては、GCCによる開発は諦めていました。
     開発環境としてGCCは、完成度が低いと思いました。
    (ただ、私が、GCCのオプション指定をミスしているだけかもしれませんが。)
     やはり、SHはHEWを使うしかないとの感を持っています。
     ルネサスもHEWをザイリンクス、アルテラの開発環境のように、を無償開放してくれることを秘かに願っています。

     どなたから、GCCについてご教示いただけたらとも思っていいます。

    返信削除