ラベル GNU の投稿を表示しています。 すべての投稿を表示
ラベル GNU の投稿を表示しています。 すべての投稿を表示

2012年3月13日火曜日

GNU GCC 開発環境整備 再び (for ARM Cortex-M3)

CQ出版 Interface誌 恒例の付属基板 本年(2012年)は 富士通「FM3マイコン」のようです。このマイコンはARM Cortex-M3マイコンで、今は亡きDesign Wave誌 2008年5月号付属の基板CQ-STARMと同じコアです。
  そこでほぼ4年前の基板CQ-STARMを引っ張り出し、電源ON、するとその当時組んだプログラムが動きだしました。「お久しぶり」といった感じでした。
  この基板に搭載されたMCUはSTM32F103で
   動作クロック72MHz、RAM 20KB、フラッシュROM 128KB 
 本年の「FM3マイコン基板」に搭載されるMCUはMB9BF618T(予定)で、
   動作クロック144MHz、RAM 128KB、フラッシュROM 1MB
 かなりのスペックです。 今年は本腰を入れていろいろ遊びたいと思います。

  さて、STM32基板ですが、若干物足りないスペック、開発環境はIARのWorkbench(使用制限)、追加部品の水晶発振子の入手性 等で、その当時、動作確認程度の開発にとどめていました。
 そのような扱いのSTM32基板、稼働したプログラムのプログラムソースをビルドすると、案の定、ビルドエラーが発生しました。他のARM基板(LPC2388、LM3S8962)での開発でGNU GCCの開発環境(GCC ver.3.4. => ver.4.3 )を組み直したのが原因だと思われます。
   今年のFM3基板の準備として、GNU GCCの開発環境の組み直しを行いました。   

 1.GNU GCC 開発環境について
  ◎GCCは、ARM対応版を整備する。
    ARM7TDMI、Cortex-M3、、、、各MCUコア共通
  ◎コードセットはThumb
    GNU GCC はThumb-2に非対応 GCC Vre4.6.3のインストールで Thumb-2のコードセットがインストールされることを秘かに期待していたのですが残念、、、、Thumb-2は2003年の発表で、そろそろGNU GCCでThumb-2の対応があっても良いのではと思います。
    Interface編集部、ARM社、富士通、、、、どこでも良いから、GNU GCCのThumb-2対応版をリリースしてほしいものです。  

  ◎FPU (Floating Poing Unit; 浮動小数点演算ユニット)無しで整備する。
    GNU GCCでビルドすると。「…m-elf/4.6.3/thumb/lib**.a(_******.o) uses hardware FP, whereas main uses software FP」のビルドエラー発生 安直にコンパイルオプション -mhard-float を付加、これはCortex-M3ではNG。
    そこで、binutils、gcc、newlibでconfigureオプション --with-float=soft を指定して再インストールしました。    

2.GNU GCC(Vre4.6.3) 開発環境整備 手順
  1)Cygwinのインストール
     gccに加え、binutils、(libiconv)等のパッケージをインストールする。
     ※出来るだけGNU GCCの開発環境(Cygwin上で動くソフトウエアを開発する環境)を整えてしまう。
  2)gccビルド準備( 1)の補足 )
    gccビルド用に以下のパッケージをインストールする。
   ①gmpのインストール
   ②mpfrのインストール
   ③mpcのインストール
   ④libiconvのインストール
    ※今回はCygwinのインストールでは組み込まず、ここでインストール
  3)gccビルド
   ここでビルドするgccは、Cygwin上で稼働し、ARM MCUで動くソフトウエアを出力する。
   ①binutilsのインストール
    binutils ver.2.22ではインストール失敗(初回)、ver.2.21.1で成功
    一旦GNU GCCをインストール後再度 ver.2.22をインストールで成功
   ②gccのインストール
   ③newlibのインストール
        newlib ver.1.20.0ではインストール失敗(初回)、ver.1.18.0で成功
    その後、ver.1.19.0をインストール 成功
    その後、ver.1.20.0をインストール 成功
   ③gccのインストール
     configureでオプション --with-newlib を追加して再インストール         

※ST32F103 LCD出力プログラム


メモ
 ※configureオプション --with-float=
    --with-float=soft 浮動小数点演算をライブラリを使って実行
    --with-float=hard 浮動小数点演算をFPUを使って実行
 ※Cortex-M3では Thumb の一部の命令がサポートされていない。コンパイル オプション -mcpu=cortex-m3 指定がこの問題に対応してくれると良いのですが。後々手こずることになりそうです。

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を使うべきとの感が強くなりました。こうなると、出来るだけコンパクトなプログラムを作成するかが今後のテーマになりそうです。

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
○割り込み処理の安定動作
○処理速度の改善、オプティマイズの検討

2010年2月9日火曜日

LM3S8962 Evaluation Kit プログラム作成 3 (GNU gcc)


 Texas Instruments(LUMINARY MICRO)社  Cortex-M3 MCU LM3S8962 マクロプロセッサ評価ボード EKI-LM3S8962 を、あいも変わらずいじっています。

 今回、評価ボードのOLED(グラフィクディスプレイ128 x 96)の表示を試しました。
1.表示データの解析
 1)ディスプレイ関数 RIT128x96x4ImageDraw(rit128x96x4.c)のデモプログラムでの使用を調べた。
  デモプログラム: FreeRTOSデモ
   =>bitmap.hのpucBasicBitmap(FreeRTOSのロゴ表示)3201バイトのイメージデータがあり、4ビット1画素が確認された。(16階調のグレースケール)
2.表示データの作成
 1)ペイントブラシ等で作成されたビットマップを表示データに変換することを考える。
  ①テストパターン(24ビット ビットマップ)をペイントブラシで作成し、データを調べた。
  ②od -cx bitmap.bmp 等でファイルのダンプを行った 
    =>テストパターンのデータで、バイトの反転があった。(白地に黒点)
    表示データは 0xFFFF 0xFFFF 0x00FF 0x0000 0xFFFF であったが、本来、0xFFFF 0xFFFF 0xFF00 0x0000 0xFFFF であるべき。リトルエンディアン的なバイト反転が起こっているのでしょうか?
    C言語で、ビットマップファイルをバイナリで開け、各画素のRGB要素の平均をとって16階調の数値データとし、テキストファイルに落とすことを考えていたのですが、このバイト反転、ファイルヘッダーの呼び飛ばしなどを考えると、面倒に思い、C言語による変換プログラムの作成は見送りました。
 2)Visual C++ 2008 による変換プログラムの作成
  前述の理由の他、画像ファイルの制限を外すことを考えるとVC++を使うのが良いと判断しました、プログラムの要点は、
    ①Bitmapクラスを画像ファイル割当てで初期化する。(ビットマップ、JPEG、GIF等の画像ファイルが一様に扱える)
    ②pictureBoxクラスのImageプロパティに ①のBitmapクラスを設定する。(表示用)
    ③ ①のBitmapクラスのGetPixelメソッドを使って画像の各画素を取得する(Colorクラス)。
    ④各画素のRGB要素の平均を求める。(この時点で256階調のグレースケール)
    ⑤求めた平均を1/16する。(OLEDで使える16階調のグレースケールになります。)
    ⑥この値をテキストファイルに出力する。一応Hex表示形式
 3)デモプログラムへの組み込み。
    デモプログラムに RIT128x96x4ImageDraw 関数を追加し、2)で作成したグレースケールデータ(出力テキストファイル)をイメージデータとして使いました。
   
 ※Visual C++ 2008 メモ
  久々のVC++で、戸惑った点
 ・二次元配列が使えなかった。
  データWK用に private: unsigned char imgdtT[128][96];を使おうとしたのですが。
    ....のメンバとして定義できません。混合型はサポートされていません。のエラー発生、Arrayクラスを使用するようです。
  宣言は    private:array< unsigned char, 2 >^ imgdtT;  
  初期化は   imgdtT= gcnew array< unsigned char, 2 >( 128,96);
  代入は    imgdtT[i,j] = iBrite /16; 
  参照は    iGray16 = imgdtT[i,j]; 
(一部訂正 3/9 初期化は の array が表示しきれていなかった。実は、<Unsigned....が隠れてしまっていた。)
3.OLED(グラフィクディスプレイ128 x 96)の表示
 鉄道模型(Nゲージ)の表示は128x50(4ビット)ドットで行っています。今まで128x64(1ビット)ドットのグラフィックLCDを主に扱ってきたので、このOLEDの表示はあまり期待していませんでした。しかし16階調(4ビット)のグレースケール表示ができることで表現力が格段に上がることは以外でした。
 HondaのHPより、バイクの画像をパクリ、16階調のグレースケールに変換し表示させました。結構きれいな表示でした。この解像度では表示しきれない細部まで見えるような錯覚を覚えました。

--------------------------------------------------------------------
--------------------------------------------------------------------
 試行錯誤を始めて、3ヶ月、暇を見つけてはの趣味の範囲では、超えられない壁が幾つかでてきました。

1.IARサンプルプログラムのGNU GCCへのコンバート
 ・Ethernetの割り込みがハンドリング出来ない。
   DHCPからのIPアドレスの割当が受けられない状況 
2.FreeRTOS上の開発環境(GNU GCC)の整備
 1)FreeRTOSからVre.6.0.2をダウンロードして試しました。
  ・IAR用のデモプロジェクト(CORTEX_LM3Sxxxx_IAR_Keil)を試す。(IARの環境)
    =>デモプログラムの動作を確認・・・容易に確認
  ・Eclipse用のデモプロジェクト(CORTEX_LM3Sxxxx_Eclipse)を参考にGNU GCCの開発環境を整える。
    =>FreeRTOSのデバイスドライバ等のライブラリ(libdriver.a、libgr.a)は、arm-elf-系の開発環境では利用できません。
     =>CODESOURCERYよりSoucery G++ Liteをインストールする。arm-none-eabi-系の開発環境が整い、ライブラリ(libdriver.a、libgr.a)の使用が可能になります。
      =>main.cのvSetupHighFrequencyTimer()のCallで止まってしまいます。タイマ関連のレジストリの設定で止まってしまうようです。


2009年12月19日土曜日

LM3S8962 Evaluation Kit プログラム作成 2 (GNU gcc)

Texas Instruments(LUMINARY MICRO)社  Cortex-M3 MCU LM3S8962 マクロプロセッサ評価ボード EKI-LM3S8962 を、暇をみつけていじっています。
現在、引き続き、IAR Embedded Workbench のサンプルプログラムを、GNU gcc で作りなおしています。

1.Luminary Micro, Inc.サンプルプログラム。
 ・「sd_card」 SDカードのサンプルプログラム
 ・「enet_lwip」Ethernet接続のサンプルプログラム
 ・「qs_ek-lm3s8962」この評価ボードにインストールされていた、ゲームプログラム
 このうち、「sd_card」は、所定の動作を確認できました。
「enet_lwip」、「qs_ek-lm3s8962」については、Ethernetの割り込みの動作が不全で、今のところ、Ethernet、割り込みおよび、システム系の初期化関数等を点検しています。
 特に、これらのサンプルソースにある"#ifdef"文の挙動をチェックしています。

2.Luminary Micro, Inc.サンプルソースの手直し。
 1)cpu.s の編集
   arm-elf-as による、アセンブラコンパイルでエラーが起こる。エラーメッセージは、コメント行が不正と判断されている。
   このソースファイルについては、#include "../asmdefs.h" と C言語ライクなコメントに違和感を感じています。
   (対応するコンパイルオプションがあるのでしょうか?)
   ひとまず。
   ①全コメント行を削除。
   ② asmdefs.h の内容で、cpu.s を書き換える。
     セクション << The defines required for GCC.>> の #define文の内容で 書き換える。
    例  #define __EXPORT__ .globl   (asmdefs.h)
        __EXPORT__ CPUcpsid を .globl CPUcpsid に書き換える。


-------------cpu.s-書き換え前-(コメント削除済み)------------------
#include "../asmdefs.h"
__LIBRARY__ __lib_cpu
__TEXT_NOROOT__

__EXPORT__ CPUcpsid
__THUMB_LABEL__
CPUcpsid __LABEL__
mrs r0, PRIMASK
cpsid i
bx lr

__EXPORT__ CPUcpsie
__THUMB_LABEL__
CPUcpsie __LABEL__
mrs r0, PRIMASK
cpsie i
bx lr

__EXPORT__ CPUwfi
__THUMB_LABEL__
CPUwfi __LABEL__
wfi
bx lr

__END__

-------------cpu.s-書き換え後-------------------
.syntax unified
.thumb

@ __lib_cpu
.text

.globl CPUcpsid
.thumb_func
CPUcpsid :
mrs r0, PRIMASK
cpsid i
bx lr

.globl CPUcpsie
.thumb_func
CPUcpsie :
mrs r0, PRIMASK
cpsie i
bx lr

.globl CPUwfi
.thumb_func
CPUwfi :
wfi
bx lr

.end

-------------cpu.s end----------------

2009年12月9日水曜日

LM3S8962 Evaluation Kit プログラム作成 (GNU gcc)


Texas Instruments(LUMINARY MICRO)社  Cortex-M3 MCU LM3S8962 マクロプロセッサ評価ボード EKI-LM3S8962 について、キットに付随するサンプルプログラムをGNU gccでビルドし直しました。

1.サンプルプログラムの取り込み。
 1)IAR Embedded Workbenchでサンプルワークスペースを開く。
  ①IAR Embedded Workbenchを立ち上げる。
  ②Example applications
  ③Lumirary/Stellaris/boads/dk-lm3s8962を選択
 2)サンプルプログラムソースをコピー。
  ①開いている。ワークスペースのうち、とりあえず「driverlib」「blinky」「hello」「graphics」「uart_echo」のライブラリ、プログラムの File Propertisi... を調べる。 
   C:\Users\UserID**\Documents\IAR Embedded Workbench\arm\Luminary\Stellaris\src     C:\Users\UserID**\Documents\IAR Embedded Workbench\arm\Luminary\Stellaris\boards\ek-lm3s8962\graphics
  ②プログラムソースをGNU gcc開発フォルダにコピーする。
  「hello」の場合
    IAR サンプル ソース ......\Stellaris\boards\ek-lm3s8962\hello\helloc.c を
    GNU gcc 開発フォルダ(例) c:\Embedded\ARM_CortexM3\TI\Project\hello にコピー
  ③ライブラリソースをGNU gcc開発フォルダにコピーする。
   ・IAR ライブラリ ヘッダ 
    (共通ヘッダ)
     ......\Stellaris\asmdefs.h hw_adc.h hw_can.h hw_comp.h ......
    (driverlib.a用)
     ......\Stellaris\inc\lm3s8962.h
     ......\Stellaris\src\adc.h can.h comp.h ......
    (utilslib.a用)
     ......\Stellaris\utils\cmdline.h diag.h diagprintf.h ......
    (glib.a用)
     ......\Stellaris\glib\canvas.h checkbox.h container.h ......
    その他
     ......\Stellaris\glib\third_party以下のヘッダを適宜に。
   ・IAR ライブラリ ソース
    (driverlib.a用)
     ......\Stellaris\src\adc.c can.c comp.c ......
    (utilslib.a用)
     ......\Stellaris\utils\cmdline.h diag.h diagprintf.h ......
    (glib.a用)
     ......\Stellaris\glib\canvas.c checkbox.c container.c ......
    その他
     ......\Stellaris\glib\third_party以下のソースを適宜に。

   ・GNU gccライブラリ構成フォルダにコピー
    (共通ヘッダ)
     c:\Embedded\ARM_CortexM3\TI\Library\inc
    (driverlib.a)
     c:\Embedded\ARM_CortexM3\TI\Library\drivelib\inc
     c:\Embedded\ARM_CortexM3\TI\Library\drivelib\src
    (utilslib.a)
     c:\Embedded\ARM_CortexM3\TI\Library\utilslib\inc
     c:\Embedded\ARM_CortexM3\TI\Library\utilslib\src
    (glib.a)
     c:\Embedded\ARM_CortexM3\TI\Library\glib\inc
     c:\Embedded\ARM_CortexM3\TI\Library\glib\src
    その他 機能別に適宜にコピーする。

2.GNU gcc プログラム開発用環境構築 ライブラリ作成
 1)Makefile作成 「drivelib」「glib」「utilslib」...
  ・開発環境は、数値(浮動小数点)演算プロセッサなし(ソフト数値演算)を選択。
  ・コンパイルオプション -mthumb -O0 -v (とりあえず)
 2)メイク実行

3.各サンプルプログラムプロジェクト(ワークスペース)の整備
 1)スタートアッププログラムソース(startup.S)、メモリ定義ファイルの(memory.def)、メイクファイル(Makefile)の入手し、各サンプルプログラムプロジェクトフォルダに置き、適宜に修正する。

  ・CQ出版Interface誌2008年11月号の記事「Thumb-2対応GCCクロス開発環境の構築」関連のソース等を同サイトからダウンロードする。
  ・ダウンロードファイル gcc_sample_20080830.tar.zip を展開
  ・展開したフォルダ gcc_sample_20080830.tar に Cygwin でアクセスする。
  ・Cygwin で コマンド 「tar -jxvf gcc_sample_20080830.tar.bz2」を実行してサンプルソース等を展開する。
  ・gcc_sample_20080830.tar/gcc_sample/cortex-m3 が今回利用するサンプルソースのフォルダです。
 2)startup.sの修正。
-----------startup.s------------------------- 
.text

.extern main
.extern _sdata_loadaddr
.extern _sp_base
.extern SysTick_Handler << コメント化
.extern XXX_handler << 割り込みハンドラー関数を宣言

# Top of Stack
.long _sp_base
# Reset Handler
.long _startup+1
.org 0x0C << コメント化
# HardFault
.long BreakPoint_Handler + 1 << コメント化
.org 0x3C << コメント化
# SysTick Handler
.long SysTick_Handler + 1 << コメント化
# USART1
.org 0xD4 << コメント化
.long USART_handler + 1 << コメント化

# 割り込み設定
.org 0xXX << 割り込み位置を指定
.long XXX_handler + 1 << 割り込みハンドラー関数を指定。(thumbモードなので+1)

.org 0xEC
.global _startup
_startup:
LDR r1, =_sdata_loadaddr
LDR r2, =_sdata
LDR r3, =_edata
__copy_loop:
LDRB r4, [r1]
STRB r4, [r2, #0]
ADD r1, r1, #1
ADD r2, r2, #1
CMP r3, r2
BGT __copy_loop

LDR R0, =main
LDR R1, =0x1
ORR R0, R1
BX R0
-----------startup.s---end------------------- 
  ※割り込み位置 例UART0の場合
    UART0の Interrupt Vector Number: 21
    ==> 21 X 4 = 84
    ==> 0x54

 3)memory.defの修正。
memory_thumb.def を memory.defに
-----------memory.def------------------------ 
SECTIONS
{
.start 0x08000000 : { <<.start 0x00000000 に修正
_stext = .;
startup_thumb.o(.text)
_etext = .;
}

.text : {
_stext = .;
*(.text)
_etext = .;
}

.rdata : {
_srdata = .;
*(.rodata)
*(.rodata.str1.4)
_erdata = .;
}

.data 0x20000000: AT (LOADADDR(.rdata)+SIZEOF(.rdata)) {
_sdata_loadaddr = LOADADDR(.rdata)+SIZEOF(.rdata);
_sdata = .;
*(.data)
*(.zdata)
_edata = .;
}
.bss : { << 削除
_sbss = .; << 削除
*(.bss) << 削除
*(.comment) << 削除
_ebss = .; << 削除
} << 削除

_end = .;
. = ALIGN(0x4);
. += 0x200;
_sp_base = .;
}
-----------memory.def------------------------ 

 4)Malkefileの修正。
Malkefileは 適宜に修正 
   Lumirary MicroR Flash Progremmer用のバイナリファイルのために
$(OBJCPY) -O binary gcc_sample_thumb gcc_sample_thumb.bin を使用する。
  コンパイルオプションは
$(AS) -mcpu=cortex-m3 -mthumb --defsym THUMB=1 startup.s -o startup_thumb.o
$(CC) -mcpu=cortex-m3 -mthumb -c $< -o gcc_sample_thumb.o
   を参考にする。

4.各サンプルプログラムプロジェクトのビルドおよび実行
 1)「blinky」
   ・LED1の点滅を確認
 2)「hello」
   ・表示メッセージを変更
   ・表示位置を変更
   ・表示明度を変更
 3)「graphics」
   ・テロップ表示を変更
"This Aplication Developed by GNU gcc !" 写真はこのテロップの一部が表示された状態。
 4)「uart_echo」
   ・PC ターミナルソフトからのキー入力を返す(エコーバック)を確認
   ・PC ターミナルソフトからのキー入力を表示するように変更

5.デモプログラムの復旧 ※2010.1.29追記
 この評価キットのデモプログラム(ゲーム)の復旧は以下の手順で行う。
 1)以下のデモプログラムの存在を確認 (ドライブCの場合)
  C:\StellarisWare\boards\ek-lm3s8962\qs_ek-lm3s8962\gcc\qs_ek-lm3s8962.bin
  *存在しない場合Luminary MicorのHPより、EK-LM3S8962 Firmware Development Packegeをダウンロード、インストール実行
 2)Luminary MicorR Flash Programmerで上記のファイルを評価キットに書き込む。
  ①Configratoinタグ
    Quick Setで「LM3S8962 Ethernet and CAN Evaluation Boad」を選択
  ②Programタグ
    Select .bin fileで 上記ファイル「qs_ek-lm3s8962.bin」を選択
  ③Program実行
     

※IAR Embedded Workbenchによる開発 から GNU gccによる開発へ移行できなかった機能。
・cspy.cの持つ関数(Diag系関数)
※最初、生成したバイナリファイルXXX.binが500MB超えのファイルになった、確かにメモリマップを忠実にレイアウトすると、RAM領域0x20000000で512MB以上が確保されてしまう。始めは、仕方ないと思っていましたが、Flash Progremmerが受け付けないので色々試しているうちに、10KB前後のサイズになった。所定の機能が実現できたのでこれで良しと判断、結果オーライの感があり、少々不満。

2009年12月3日木曜日

GNU GCC 開発環境整備(For ARM7TDMI and Cortex-M3)

以前、ARM LPC2388 (CQ出版Interface誌付録基板) 用にGNU GCCの開発環境を整備しました。
今回、複数のタイプのARMプロセッサのアプリケーション開発に対応するため、再度開発環境を整備し直しました。
主な留意点は、
・浮動小数点演算コプロセッサ搭載、非搭載とMPUを2つに区分して、開発環境を整えます。

1.浮動小数点演算コプロセッサ非搭載(-msoft-float / -mfloat-abi=soft)
  ①インストール先ディレクトリ作成
   ・cd /usr/local
   ・mkdir arm-tools-sfp
  ②各パッケージの解凍(c:\DownLoad\GNUに各サイトよりダウンロード済み)
   ・tar jxvf /cygdrive/c/DownLoad/GNU/binutils-2.20.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gmp-4.3.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/mpfr-2.4.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gcc-4.4.2.tar.bz2
   ・tar zxvf /cygdrive/c/DownLoad/GNU/newlib-1.17.0.tar.gz
 1)binutilsパッケージのインストール
  ①cd binutils-2.20
  ②./configure --target=arm-elf --prefix=/usr/local/arm-tools-sfp ・・OK
  ③make  ・・失敗  2.19でOK
  ④make install ・・2.19でOK

 ※binutils-2.20の場合 ③のmakeでエラー ・・・インストール失敗
 
gcc -DHAVE_CONFIG_H -I. -I. -I. -I../bfd -I./config -I./../include -I./.. -I./.
./bfd -DLOCALEDIR="\"/usr/local/arm-tools-sfp/share/locale\"" -W -Wall -Wstrict
-prototypes -Wmissing-prototypes -Werror -g -O2 -MT tc-arm.o -MD -MP -MF .deps/t
c-arm.Tpo -c -o tc-arm.o `test -f 'config/tc-arm.c' || echo './'`config/tc-arm.c

config/tc-arm.c: In function `make_mapping_symbol':
config/tc-arm.c:2488: warning: empty body in an if-statement
make[4]: *** [tc-arm.o] Error 1
make[4]: Leaving directory `/usr/local/binutils-2.20/gas'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/usr/local/binutils-2.20/gas'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/usr/local/binutils-2.20/gas'
make[1]: *** [all-gas] Error 2
make[1]: Leaving directory `/usr/local/binutils-2.20'
make: *** [all] Error 2

 *まあ、よくわからないので、前回と同じbinutils-2.19で試す。
こちらは成功。
 *全てのパッケージのインストール後に再度binutils-2.20のインストールを試すが、やはりmakeで失敗した。

 2)gmpパッケージのインストール
  ①cd ../gmp-4.3.1
  ②./configure --prefix=/usr/local/arm-tools-sfp ・・OK
  ③make ・・OK
  ④make check ・・OK
  ⑤make install ・・OK

 3)mpfrパッケージのインストール
  ①cd ../mpfr-2.4.1
  ②./configure --prefix=/usr/local/arm-tools-sfp --with-gmp=/usr/local/arm-tools-sfp ・・OK
  ③make・・OK
  ④make check・・OK
  ⑤make install・・OK

 4)gccパッケージのインストール
  ①cd ..
  ②mkdir BuildGcc
  ③cd BuildGcc
  ④../gcc-4.4.2/configure --target=arm-elf --with-float=soft --with-gmp=/usr/local/arm-tools-sfp --with-newlib --with-mpfr=/usr/local/arm-tools-sfp --prefix=/usr/local/arm-tools-sfp --enable-interwork --enable-multilib --enable-languages=c --disable-libssp ・・・OK
  ⑤make ・・・OK
  ⑥make install ・・・OK

  *ここで/usr/local/arm-tools-sfp/binのディレクトリにパスを通す。
  (newlibパッケージのインストール makeでの失敗対応)
  ・cd     ユーザーホームディレクトリへ移動
  ・.bash_profileを編集し、/usr/local/arm-tools-sfp/binのディレクトリにパスを通す。
   ( PATH=/usr/local/arm-tools-sfp/bin:${PATH} を追加)
  ・Cygwinを一旦終わらせ、再稼動させる。

 5)newlibパッケージのインストール
  ①cd /usr/local/newlib*
  ②./configure --target=arm-elf --with-float=soft --prefix=/usr/local/arm-tools-sfp ・・・OK
  ③make・・・失敗
  ④make install
 
  ※③のmakeでエラー ・・・インストール失敗
  
touch stmp-targ-include
Making all in libc
make[4]: Entering directory `/usr/local/newlib-1.17.0/arm-elf/newlib/libc'
Making all in argz
make[5]: Entering directory `/usr/local/newlib-1.17.0/arm-elf/newlib/libc/argz'
arm-elf-cc -B/usr/local/newlib-1.17.0/arm-elf/newlib/ -isystem /usr/local/newli
-1.17.0/arm-elf/newlib/targ-include -isystem /usr/local/newlib-1.17.0/newlib/li
c/include -B/usr/local/newlib-1.17.0/arm-elf/libgloss/arm -L/usr/local/newlib-1
17.0/arm-elf/libgloss/libnosys -L/usr/local/newlib-1.17.0/libgloss/arm -DPACKAG
_NAME=\"newlib\" -DPACKAGE_TARNAME=\"newlib\" -DPACKAGE_VERSION=\"1.17.0\" -DPA
KAGE_STRING=\"newlib\ 1.17.0\" -DPACKAGE_BUGREPORT=\"\" -I. -I../../../.././ne
lib/libc/argz -O2 -DARM_RDI_MONITOR -fno-builtin -g -O2 -c -o lib_a-dumm
.o `test -f 'dummy.c' || echo '../../../.././newlib/libc/argz/'`dummy.c
/bin/sh: arm-elf-cc: command not found
make[5]: *** [lib_a-dummy.o] Error 127
make[5]: Leaving directory `/usr/local/newlib-1.17.0/arm-elf/newlib/libc/argz'
make[4]: *** [all-recursive] Error 1
make[4]: Leaving directory `/usr/local/newlib-1.17.0/arm-elf/newlib/libc'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/usr/local/newlib-1.17.0/arm-elf/newlib'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/usr/local/newlib-1.17.0/arm-elf/newlib'
make[1]: *** [all-target-newlib] Error 2
make[1]: Leaving directory `/usr/local/newlib-1.17.0'
make: *** [all] Error 2

  *確かに arm-elf-cc は存在しなかった。
  *再度gccのインストール(上書き) make all も実行 ・・・同じエラー
  */usr/local/arm-tools-sfp/binのディレクトリにパスを通すと成功。


 6)gccパッケージの補足インストール
  ①cd ../BuildGcc
  ②make
  ③make install

 7)その他 
  ①cd     ユーザーホームディレクトリへ移動
  ②.bash_profileを編集し、 PATH=/usr/local/arm-tools-sfp/bin:${PATH} を削除
  ③Cygwinを一旦終わらせ、再稼動させる。
  

2.浮動小数点演算コプロセッサ搭載(-mhard-float / -mfloat-abi=hard)
  ①インストール先ディレクトリ作成
   ・cd /usr/local
   ・mkdir arm-tools-hfp
  ②各パッケージの解凍
   ・tar jxvf /cygdrive/c/DownLoad/GNU/binutils-2.20.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gmp-4.3.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/mpfr-2.4.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gcc-4.4.2.tar.bz2
   ・tar zxvf /cygdrive/c/DownLoad/GNU/newlib-1.17.0.tar.gz
 1)binutilsパッケージのインストール
  ①cd binutils-2.19
  ②./configure --target=arm-elf --prefix=/usr/local/arm-tools-hfp ・・OK
  ③make  ・・OK
  ④make install ・・OK

 2)gmpパッケージのインストール
  ①cd ../gmp-4.3.1
  ②./configure --prefix=/usr/local/arm-tools-hfp ・・OK
  ③make ・・OK
  ④make check ・・OK
  ⑤make install ・・OK

 3)mpfrパッケージのインストール
  ①cd ../mpfr-2.4.1
  ②./configure --prefix=/usr/local/arm-tools-hfp --with-gmp=/usr/local/arm-tools-hfp ・・OK
  ③make・・OK
  ④make check・・OK
  ⑤make install・・OK

 4)gccパッケージのインストール
  ①cd ..
  ②mkdir BuildGcc
  ③cd BuildGcc
  ④../gcc-4.4.2/configure --target=arm-elf --with-float=hard --with-gmp=/usr/local/arm-tools-hfp --with-newlib --with-mpfr=/usr/local/arm-tools-hfp --prefix=/usr/local/arm-tools-hfp --enable-interwork --enable-multilib --enable-languages=c --disable-libssp ・・・OK
  ⑤make ・・・OK
  ⑥make install ・・・OK

  *ここで/usr/local/arm-tools-hfp/binのディレクトリにパスを通す。
  ・cd     ユーザーホームディレクトリへ移動
  ・.bash_profileを編集し、/usr/local/arm-tools-hfp/binのディレクトリにパスを通す。
   ( PATH=/usr/local/arm-tools-hfp/bin:${PATH} を追加)
  ・Cygwinを一旦終わらせ、再稼動させる。

 5)newlibパッケージのインストール
  ①cd /usr/local/newlib*
  ②./configure --target=arm-elf --with-float=hard --prefix=/usr/local/arm-tools-hfp ・・・OK
  ③make・・・OK
  ④make install・・・OK
 

 6)gccパッケージの補足インストール
  ①cd ../BuildGcc
  ②make
  ③make install

 7)その他 
  ①cd     ユーザーホームディレクトリへ移動
  ②.bash_profileを編集し、 PATH=/usr/local/arm-tools-hfp/bin:${PATH} を削除


3.2つの開発環境について 比較。
 1)コンパイラー等開発ツール
 ◎/usr/local/arm-tools-sfp/bin、/usr/local/arm-tools-hfp/binの主要ツール
 ・arm-elf-gcc.exe( 519708Byte)
 ・arm-elf-as.exe (2757595Byte)
 ・arm-elf-ar.exe (1804448Byte)
 ・arm-elf-objcopy.exe(2303260Byte)
についてバイナリサイズは2つの環境とも同じでした。浮動小数点演算コプロセッサー使用、非使用で各ツール自体に異なることはないと推測。
 2)ライブラリ
 ◎/usr/local/arm-tools-sfp/arm-elf/lib、/usr/local/arm-tools-hfp/arm-elf/libの主要ライブラリ
 ・libc.a(soft:3174978Byte hard:3169002Byte)
 ・libg.a(soft:3174978Byte hard:3169002Byte)
 ・libm.a(soft:953244Byte hard:876948Byte)
 ◎そのほかのライブラリ
 ・libgcc.a (soft:363326Byte hard:357882Byte)
 ・libgcov.a (soft:30906Byte hard:30906Byte) ・・・同じ
 についてライブラリサイズは若干、浮動小数点演算コプロセッサ使用のほうが小さい。

2009年7月9日木曜日

LPC2388 GNU GCC 浮動小数点の扱い

CQ出版、Interface誌 付録基板 LPC2388 を あいも変わらず、暇をみてはいじっています。
 以前に組み込んだプログラムの一つに不具合があり、これを調べていて、その原因が浮動小数点(float、double)の扱いにあることが判りました。

 今のところ、まだ解決の目途は立っていません。

1.コンパイルオプション -mhard-float について。
 LPC2388を触り始めたころ、浮動小数点の扱いで、-mhard-float  をコンパイルオプションに加えるようになった。
 どうもこのコンパイルオプションが問題と思われるようになった。
 1)コンパイルオプション -mhard-float なしで、問題のプログラムを Make する。
   標準Cライブラリ(libc.a、libm.a、、)の関数を使用しているサブルーチン、関数、では、依然、不具合は解消されず。しかし、標準Cライブラリ(libc.a、libm.a、、)の関数を使用しないサブルーチンでは不具合は解消していた。
 2)コンパイルオプション -msoft-float を加えて、問題のプログラムを Make する。
   Make時、リンクでエラーが起こる。(標準Cライブラリが不適合)

2.msoft-float 環境のgcc開発環境について、
  標準Cライブラリを msoft-float で構成すれば、問題解決と思い。gcc開発環境の再インストールを行った。
 (gccのインストールで、configure の オプションに --with-float=soft を加えた。)
 1.2)のMakeエラーは解消、でも不具合は残った。


3.ARM7TDMI-Sの浮動小数点対応について。
 Interface 2009/5 P58 の 「機能を拡張するコプロセッサ」の節 表2 コプロセッサ番号 CP11、CP12 で 倍精度/単精度浮動小数点 の記載があり、LPC2388が浮動小数点処理機能をハードで実現すると思われ、コンパイルオプション -mhard-float  は妥当と思われた。
 しかし ARM7TDMI-S Revision r4p3 Technical Reference Manual の 4.1.1 「Coprocessor abailability」では、CP14 Debug controller と CP15 System contorol だけの記載  やはり コンパイルオプション -msoft-float が正解なのか。。。


※ もともと、gccの開発環境は、同じCQ出版 DW誌の STM32F103(Cortex-M3)の開発環境です。
 LPC2388で使う場合、CPUのアーキテクチャの差異を考慮して、gccの再インストールしなければならないと思います。

 今回、-msoft-float 対応 で gccのインストールのみ、configure の オプションに --with-float=soft を加えたが、newlibについては行わなかった。(makeが通ったのでかまわなかったと判断)
 次は、newlibの再インストールでも行おうと思います。(指定可能かどうか不明ながら)。。

 現時点では コンパイルオプション -mhard-float  の適否は不明。(-msoft-floatが正解と言い切る自信無し。)


ひまを見てボチボチと、、、、

 >>追加検証 
  gccとnewlibのインストール configureオプションに --with-float=soft を追加。 + コンパイルオプション -msoft-float の make。
   浮動小数点でこけていた箇所が通るようになった。 一応動作確認。(7/10)

2009年6月25日木曜日

LPC2388 GCCによる開発 メモ 中間まとめ

未だ、CQ出版 Interface誌 LPC2388付録基板のベースシステムの構築が出来ていません。


1.IRQによる割り込み処理のハンドリング。
 1)実装するIRQ

  ベースシステムのIRQ例外処理のはとりあえず。
  ・システムの稼動チェック(ハートビート)用に TIMER0の割り込み。 
  ・LCD(SG12864ASLB-GB-R01)のリフレッシュ用に TIMER1の割り込み。
  ・Key入力用(タクトスイッチのON/OFFスキャン用)に TIMER3の割り込み。
  ・システム汎用にTIMER2の割り込み。
  ・シリアル通信受信用のUART1の割り込み。
  を、使用します。

 2)IRQのハンドリング(手法1)  >> 今のところ不調
    I誌のgcc用のサンプルを利用
  (1)IRQハンドリング関数は CPU_IRQInterrupt(void)を使用 
     gcc_sample.cで定義/宣言され、startup.sでIRQ割り込みとして呼び出される。   
  (2)IRQハンドリング関数で VICIRQStatus による分岐で各IRQ割り込み処理を実行する。

   /* CPU割り込み処理 */
    void CPU_IRQInterrupt(void)
    {
     switch(VICIRQStatus)
     {
       case INT_IRQ_TIMER0:
        // for Timer0 IQR Interrupt
        TIMER0_IRQInterrupt(); // システム監視 ハートビート
        /* タイマ割り込みクリア */
        TIMER_InterruptReset(&TIMER_0);
        break;
       case INT_IRQ_TIMER1:
        // for Timer1 IQR Interrupt
         Lcd_IRQ_Handler();   // LCDリフレッシュ
        /* タイマ割り込みクリア */
        TIMER_InterruptReset(&TIMER_1);
        break;
       case INT_IRQ_TIMER2:
       ----------------------------

 3)IRQのハンドリング(手法2)
  (1)ハンドリング関数は CPU_IRQInterrupt(void)を使用 (手法1と同じ)
  (2)それぞれのIRQ例外処理関数のアドレスを VICVectAdd4,VICVectAdd5,,,にセットする。
  (3)IRQハンドリング関数で VICVectAddr にセットされた関数のアドレスを使用して、各タイマー、UARTのIRQ例外処理を実行する。
   ※IRQ例外処理側 (関数ポインタの扱い)
      void (*pfunc)(); // 関数ポインタ宣言
      pfunc = VICVectAddr; // 関数のアドレスを代入
      (*pfunc)(); // IRQ例外処理関数のCall
      VICVectAddr = 0x00000000; //IRQアドレスクリア(※訂正)
   ※IRQ設定側
      extern void Sys_IRQInterrupt( void ); //IRQ例外処理関数(TIMER0)
       /* ↑ 同一ソースファイル内で定義されていれば不要 */
      --------------
      VICVectAddr4 = (u32)Sys_IRQInterrupt; // IRQ例外処理関数のアドレスをセット


2.ARMモード/Thumbモードについての注意事項
 1)ARMモードでの標準ライブラリ(libc.a, libm.a等)の指定
    LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0
 2)Thumbモードでの標準ライブラリ(libc.a, libm.a等)の指定
    LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.4.0/thumb
   ※一部でもARMモードのモジュールがあると、標準ライブラリを組み込む場合、リンク時にinterworkのワーニングが出、動作が怪しくなる。
   ※gccパッケージのインストールでconfigureオプション--enable-interworkを指定しているのにワーニングが出るのが不可解。


3.リンクスクリプトファイル
  FreeRTOSのサイトから次のソースをダウンロード
  FreeRTOSV5.2.0/デモ/[ARM7_LPC2368_Eclipse]/RTOSDemoの lpc2368.ld を修正し利用。
 1)ramサイズを64Kに変更   
 2)usbramを16Kに変更


※※※※訂正※※※※
  手法2の動作確認 不調 >> 最初の1歩に戻り再検証
  ①再度 CQ出版 I誌から再び、gcc_sample を 入手
     ● 5/13 gcc用サンプル・プログラム アップデート(gcc_sample.zip)
  ②gcc_sample.zipを解凍、gcc_sampleをビルド
  ③基板上のLEDの点滅を確認 [手法1の IRQで呼び出される関数でLEDを点滅]
  ④gcc_sample.cを手法2で出来るように修正

**修正箇所**

a. define

  /* 割り込みコントローラ(VIC) */
  #define VIC_BASE_ADDR 0xFFFFF000
  #define VICVectAddr4 (*(volatile unsigned long *)(VIC_BASE_ADDR + 0x110))
  #define VICVectAddr (*(volatile unsigned long *)(VIC_BASE_ADDR + 0xF00))

b.IRQハンドラー関数

  /* TIMER0 割り込み処理 */
  void TM0_IRQInterrupt(void)
  {
    if( toggle == 0 ) {
      toggle = 1;
      *FGPIO_FIO1PIN =0x00000000; /* P1[18,19] '0' -> LED ON */
    } else {
      toggle = 0;
      *FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
    }
    *TIMER_T0IR =1;  /* タイマ割り込みクリア */
  }

  /* CPU割り込み処理 */
  void CPU_IRQInterrupt(void)
  {
    void (*pFunc)();
    pFunc = (void*)VICVectAddr;
    (*pFunc)();

    VICVectAddr = 0x00000000; // VICVectAddr のクリア ※1 追加
  }

c.Main関数
     検証用にポート1の19ピンに繋がるLEDの点滅を加える。

/* タイマ割り込みLED点灯制御プログラム */
  int main(void)
  {
    *SYS_SCS = *SYS_SCS | 1; /* FGPIO Select */

    /* LED点灯制御設定 */
    *FGPIO_FIO1DIR =0x000C0000; /* P1[18,19] OutPut */
    *FGPIO_FIO1MASK=0x00000000; /* P1[18] Non Mask */
    *FGPIO_FIO1PIN =0x000C0000; /* P1[18,19] '1' -> LED OFF */
    ----------
    *TIMER_T0MR0 = 1000000;      /* 供給クロック周波数=1秒 */
    *TIMER_T0MCR = 0x00000003;    /* Match時にTCクリア&割り込み */

    VICVectAddr4 =(unsigned long )TM0_IRQInterrupt;
    *TIMER_T0TCR = 1;         /* タイマスタート*/
toggle = 0;
    ----------
**動作検証**
 結局不調       
 TIMER0 割り込み処理 TM0_IRQInterrupt(void) の最初の割り込みの実行は確認
 でもそれっきり。

**さらにもがく**
    VICVectAddr = 0x00000000;(※1)をIRQハンドリング関数(IRQInterrupt)に追加

※※動作検証※※
  ようやく成功。





2009年5月25日月曜日

FreeRTOSV5.2.0(LPC23xx)を解析する。

CQ出版 Interface誌 2009.5付録基板 LPC2388を何とか使えるようにしたいと思い、悪あがきを続ける。

1.GNU GCCによる開発環境の整備
 ・バージョン4.3.0 4.4.0 いづれも LED点滅など簡単なプログラムは可能
 ・複数割り込み等、少々込み入ったプログラムは、一定時間稼動後ハングする。

2.FreeRTOSによる開発プロトタイプの構築
 ・http://www.freertos.orgにアクセスし、ダウンロードサイト(http://sourceforge.net)からFreeRTOSV5.2.0.zipをダウンロードする。
 ・zipファイルを展開し、ARM7_LPC2368_Eclipse,Common,SourceのフォルダをCopyし、プロトタイプの構築を試みる。
 ・ARM7_LPC2368_Eclipse/RTOSDemoのフォルダでバージョン 4.4.0 でmakeを実行
 ・configPINSEL2_VALUEの未定義エラーが起こる、FreeRTOSConfig.h の #define confinPINSEL2_VALUEのコメントをはずす。
 ・再度ビルド、 no memory region specified for loadable section `.eh_frame' が起こる。
 ・適当に、lpc2368.ld(リンカスクリプト)を修正
    ※追記内容
     .eh_frame_hdr : ALIGN (4)
     {
     KEEP (*(.eh_frame_hdr))
     } >ethram          <<(ramをethramに変更)
     .eh_frame : ALIGN (4)
     {
     KEEP (*(.eh_frame))
     } >ethram          <<(ramをethramに変更)

     (ramでは「RTOSDemo.elf section .eh_frame will not fit in region ram」ビルドエ- で ethramに変更 これも適当)

 ・再度ビルド実行 成功 ただし、「does not support interworking」のワーニング表示
 ・このディレクトリをCopyしRTOS開発環境のプロトタイプとする。
    ARM7_LPC2368_Eclipse >> ARM7_LPC2388_Prototype
RTOSDemo >> RTOS_Prototype
    lpc2368.ld >> lpc2388.ld ファイル名変更
    Makefileの内容も併せて変更 lpc2368 を lpc2388 に変更
    ビルドを試す。 >OK

3.FreeRTOSによる開発プロトタイプの構築 その2
 プロトタイプへの修正内容
  ・LCD関連の無効化(将来 SG12864に対応)
  ・TCP/IPプロセスの無効化
  ・LEDを 基板LED1 Port1 Pin18に変更
 1)FreeRTOSの分析
  ・main.cの分析

4.自作関数の組み込み
 1)LEDコントロールの組み込み
 2)LCD(グラフィック)コントロールの組み込み。
  不具合
  ・memset,strcpy,strncpy,strlen,strcatでハングする。
  ・memset等の関数を自作する。LPC_memset等 とする。
    >>一応 動作OK
 *memset,strcpy等の標準関数は今後必須としたいので、>>
  ・コンパイルオプション検討(自作関数用 LPC23Lib.a )
    COMPILE_OPTS = -O1 -mcpu=arm7tdmi-s -fomit-frame-pointer -mthumb-interwork
       を
    COMPILE_OPTS = -mthumb -O0 -v -mhard-float に変更。
    (-mcpu=arm7tdmi-s で エラー Error: selected processor does not support requested special purpose register -- `mrs r3,CPSR'... )
    でようやくOK

5.デバッグ用にLOGのLCD出力
  FreeRTOSの関数 xTaskCreate() 正常に実行される。
   〃       vTaskStartScheduler() ほどほどに動作。
    ・タイマー0の割り込みで実行される関数を portISR.c (ARMモードでコンパイル)から自作関数(thumbモードでコンパイル)に置き換えると、VICVectAddr4に設定されるアドレスが1バイトずれる。> 仕方なく、portISR.c にコードを書き込む。(原因不明)
    ・このタイマー割り込み関数は、最初の割り込み時に実行される。しかし、それ以降の割り込みは確認出来ず。

6.泥沼。
  1)thumbモードをARMモードにしたり、thumbモードに戻したり。(Makefileをいろいろイジル)
  2)etc.

7.現時点でのLPC2388の壁
 1)割り込み関連の扱い VICVectAddrX, VICVectCntrlX,,,etc.
 2)命令系がARMモードとThumbモードの2ある事。
    参考にするサンプルコード(プロジェクト)が両方使っているケースが多い。
 3)startup.s , boot.s 等のスタートアップ用のアセンブラコードが難解。
 4)リンクスクリプトファイルも難解。
 5)とにかくタイマー0の割り込みが安定的に動かない。。。。。
 6)GNU GCC の地雷 >> 単に変数を追加するだけで動作が異なる。









    





 

2009年5月14日木曜日

GNUによる開発環境の整備(for ARM7TDMI)

組み込み用の開発環境として、GNUによる開発環境の整備を試行します。
問題はWindowsVISTA 64bit、失敗覚悟で行います。

1.linux環境の構築(Cygwinのインストール)
 1)"http://www.cygwin.com"にアクセス
 2)「Install or update now!」のアイコンをクリック ダウンロードで「実行」
    [Cygwin Setup]インストーラが立ち上がる。
 3)「Choose A Dounload Source」で Install from Internet を選択
 4)「Select Root Install Directory」は デフォルト"C:\cygwin"のまま設定
 5)「Select Local Packege Directory」は 適当にディレクトリ"C:\DownLoad\Cygwin"を設定
 6)「Select Your Internet Connection」で Direct Connection を選択
 7)「Select Download Site」で 適当にダウンロードサイトを選択
 8)「Select Packeges」先頭の"All"の横の"Default"はそのまま。
   ①パッケージの追加
    再度[Cygwin Setup]インストーラが立ち上げ以下のパッケージを追加する。
     ・"Archive" zip等のファイルの圧縮/解凍
     ・"Devel"  gcc、make等の開発ツール
     ・"Editors" vi等のエディター
     ・"Net"/"inetutils" telnet等のネットワークツール

--アンインストールの場合  
( ⑧「Select Packeges」で 先頭の"All"の横の"Default"をクリックして"Uninstall"に変更する。)
     

2.GNU開発環境のインストール
 1)GNU関連パッケージの入手
  ①"http:://www.gnu.org"にアクセス
  ②[DownLoad]をクリック
  ③「How to get GNU software」の[・Download it from the web or via FTP:we....]をクリック
  ④「GNU mirror list」の[Asia/Japan ftp://ftp.ring.gr.jp/pub/GNU]をクリック
  ⑤gccパッケージの入手
   ・[gcc]をクリック
   ・[gcc-4.4.0]をクリック(最新版にトライ)をクリック
      ※IE8.0では不調 [Apr 22 09:39 gcc-4.4.0]の表示
   ・[gcc-4.4.0.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑥binutilsパッケージの入手( ④のFTPサイトより。)
   ・[binutils]をクリック
   ・[binutils-2.19.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑦gmpパッケージの入手( ④のFTPサイトより。)
   ・[gmp]をクリック
   ・[gmp-4.3.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑧mpfrパッケージの入手
   ・"http://www.mpfr.org/”にアクセス
   ・[Latest release: download]をクリック
   ・[mpfr-2.4.1.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑨Insightパッケージの入手
   ・"ftp://sourceware.org/pub/insight/releases/”にアクセス
   ・[insight-6.8.tar.bz2]をクリック
   ・c:\Download\GNUに保存
  ⑩newlibパッケージの入手
   ・"ftp://sourceware.org/pub/newlib”にアクセス
   ・[ newlib-1.17.0.tar.gz]をクリック
   ・c:\Download\GNUに保存

 2)インストール (Cygwinでの作業)
  ①インストール先ディレクトリ作成
   ・cd /usr/local
   ・mkdir arm-tools
  ②各パッケージの解凍
   ・tar jxvf /cygdrive/c/DownLoad/GNU/binutils-2.19.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gmp-4.3.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/mpfr-2.4.1.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/gcc-4.4.0.tar.bz2
   ・tar jxvf /cygdrive/c/DownLoad/GNU/insight-6.8.tar.bz2
   ・tar zxvf /cygdrive/c/DownLoad/GNU/newlib-1.17.0.tar.gz
(arm-tools以下をバックアップ)
  ③binutilsパッケージのインストール
   ・cd binutils*
   ・./configure --target=arm-elf --prefix=/usr/local/arm-tools
   ・make
   ・make install
  ④gmpパッケージのインストール
   ・cd ../gmp*
   ・./configure --prefix=/usr/local/arm-tools
   ・make
   ・make check
   ・make install

  ⑤mpfrパッケージのインストール
   ・cd ../mpfr*
   ・./configure --prefix=/usr/local/arm-tools --with-gmp=/usr/local/arm-tools
   ・make
   ・make check
   ・make install

  ⑥gccパッケージのインストール
   ・cd ../
   ・mkdir BuildGcc
   ・cd BuildGcc
   ・../gcc-4.4.0/configure --target=arm-elf --with-gmp=/usr/local/arm-tools --with-mpfr=/usr/local/arm-tools --prefix=/usr/local/arm-tools --enable-interwork --enable-multilib --enable-languages=c --disable-libssp
    (--with-newlib を追加 */* 下記参照)
    (--with-float=soft を追加 7/10 )
   ・make
   ・make install

   (/usr/local/arm-tools/binにPATHを通す。 <== newlibインストール失敗対応 12/4 )

  ⑦newlibパッケージのインストール
   ・cd ../newlib*
   ・./configure --target=arm-elf --prefix=/usr/local/arm-tools
    (--with-float=soft を追加 7/10 )
   ・make
   -- インストールの中断(エラーによる)

     エラー発生
       内容
         lib_a-dummy.oのコンパイル時
/bin/sh: arm-elf-cc: command not found

     エラー解析
      a.現在GNU開発環境があるPCでnewlibのconfigureを実行、出力Makefileを今回のMakefileと比較(diff)
       > CC_FOR_TARGET=$(STAGE_CC_WRAPPER) arm-elf-gcc $(FLAGS_FOR_TARGET) 
       < CC_FOR_TARGET=$(STAGE_CC_WRAPPER) arm-elf-cc $(FLAGS_FOR_TARGET) <=今回
       なぜ arm-elf-cc になったのか?
      b.config.logを確認
       591行目 CC_FOR_TARGET があった。
      c.configureの確認
       8539行以降にCC_FOR_TARGETの設定が記述

対処
      a.深く考えなく、GCCのバージョン を 4.3.3 に入れ替える。
             ==>変わらなかった。
      b.GCCのインストール 各オプションを変える。
             ==>検討中 ==> 解決
次のオプションでgccの configure を実行 (--with-newlib を追加)
     ../gcc-4.4.0/configure --target=arm-elf --with-gmp=/usr/local/arm-tools
         --with-mpfr=/usr/local/armtools --prefix=/usr/local/arm-tools
         --enable-interwork --enable-multilib --enable-languages=c
         --disable-libssp --with-newlib
       で gccとnewlibのインストール作業をやり直した。

※newlibでの再ビルドは make clean では不十分、newlib-1.17.0.tar.gz の解凍からやり直したほうが良さそう。

   --インストールの続き
   ・make install

  ⑥gccパッケージの補足インストール
   ・cd ../BuildGcc*
   ・make all
   ・make install

3.GNU検証
 1)newlibインストール失敗(未解決)での検証
   ① TIMERでLEDを点滅プログラム
             ==> 成功
 ② LCD表示プログラム
     ・リンクで、-lc オプションがエラー  llibc がリンクできず。

その他
 1)NXP LPC2388用 ダウンローダー 「Flash Magic」のインストール
   ①"http://www.flashmagictool.com/"にアクセス
   ②Download FlashMagic.exe (ページ右側)をクリック
   ③インストールプログラムを実行
 2)CP2102_USB ドライバのインストール
   ①LPC2388基盤をUSB接続
   ②ドライバインストールを促されるので、インターネットでドライバを検索する方法でインストールを行う。