FRK-FM3 (2) Keil µVision3 + GCC の準備 (1)2012年03月01日 22時24分16秒

Keil µVision3 Select Device MB9BF618T
さっそく準備を始めよう。
① keil の最新版 MDK-ARM V4.23 を手に入れる。
解凍して必要な物を手に入れるためだ。
必要なのは
Keil\ARM\INC の中の全て
Keil\ARM\CMSIS の中の全て
Keil\ARM\Startup の中の全て
Keil\UV4\UV4.cdb 
必要ないものもあるが細かな作業を省くため

②念のため現在インストールしてある環境の上記ディレクトリとファイルのバックアップを取っておく。
MDK-ARM V4.23 をそのまま使う場合はこのような手続きは必要ない。なぜこのような事をやるのかというと、 µVision4 が使いにくいからだ。

③①のディレクトリとファイルを現在使っている環境にコピーする。
ただし、私のように µVision3 を使っている場合は UV4.cdb を UV3.cdb にリネームしなければならない。ちなみに UV4.cdb は device databases file の事でコピーしたディレクトリは、この device database に関係するものだ。

④確認のため富士通のサンプルをコンパイルしてみよう。
うまくいかなければどこかに間違いがあるはずだ。


ここまでは問題なく進むだろう。手間がかかるのはこれからだ。


⑤startup を作成する。これは富士通のサンプルを修正して使うことにしよう。ファイル名も同じ startup_mb9bf61x.s でいいだろう。

 


⑥リンカースクリプト、ファイル名は ldscript_rom_gnu.ld にしておこう。

 


今日のところはここまでにしておく。
もちろん、gcc での確認はまだ行っていない。

FRK-FM3 (2) Keil µVision3 + GCC の準備 (2)2012年03月04日 19時34分43秒

MB9BF618T Template
さて、project を作成してコンパイルしてみよう。

プロジェクト名は mb9bf61xt_template オリジナルのままでよいだろう。
いつものようにデバイスを選択して(MB9BF618T)プロジェクトにファイルを追加する。
追加するファイルは
startup_mb9bf61x.s
main.c
system_mb9bf61x.c
次に Options for Target の設定、先ずは出力ディレクトリを指定する。
Options for Target Output


続いて CCタブ、注意する点は Include Paths に
C:/Keil/ARM/CMSIS/Include/
を追加する事、 µVision4 では必要ないが µVision3 には必要だ。
Options for Target CC


同様にアセンブラでも CMSIS ディレクトリを Include Paths に含める。
Options for Target Assembler


最後はリンカーの設定
Options for Target Linker


そしてコンパイル。
あれ、エラーが出てリンクできない。
Build target 'MB9BF618T_Release'
compiling system_mb9bf61x.c...
compiling main.c...
../source/main.c(44): warning: return type of 'main' is not 'int'
assembling startup_mb9bf61x.s...
linking...
c:/program files/raisonance/ride/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.5.1/../../../../arm-none-eabi/lib/thumb2\libc.a(lib_a-init.o): In function `__libc_init_array':
init.c:(.text+0x38): undefined reference to `_init'
collect2: ld returned 1 exit status
Target not created
それではと 以前コンパイル動作確認済みのプロジェクト(LPC1114用)をコンパイルしてみる。
同じエラーだ。
はて...

なぜ??

環境:Keil µVision3 + GCC

FRK-FM3 (2) Keil µVision3 + GCC の準備 (3)2012年03月24日 09時36分58秒

私の記憶によれば startup.s からライブラリを呼び出し、ライブラリの中でスタックポインタの設定、RAMの初期化などを行い、そこから main() を呼び出す。という手順だったはずだ。

ところが __libc_init_array() から _init() を呼び出したが見つからないというエラーで困っているわけだ。このあたりの詳細は知らないので別の方法を考える事にする。
しかし、以前はコンパイルが通っていたのになぜこんな事になってしまったの?

別の方法とは、 startup.s の中で RAM の初期化を行い、直接 main を呼び出すやり方。

いまいちすっきりしないがここはこれで逃げておこう。
もしかするとダミーの _init() 追加でもいけるのか?

環境:Keil µVision3 + GCC