ARMの数値演算ライブラリ 解決編か? [ARM&Cortex-M3]
例の数値演算ライブラリを呼ぶと暴走してしまう問題ですが、ちょっとだけ解決を見たようです。
まずCodeSourceryから提供されているツールチェインのデフォルトライブラリの位置は、インストールディレクトリ以下のlib\gcc\arm-none-eabi\4.3.3以下にあるライブラリをランタイムルーティンとして使用している様です。
また標準ライブラリ等はインストールディレクトリ以下のarm-none-eabi\libに有るものを使用しています。
ところでこれらディレクトリには、更にその下にCPUコアのバージョン毎のライブラリが用意されており、実際に使用するのは自分で使用するコアに対応したこっちのライブラリを使うようです。
つまりCortex M3で使用する時はthumb2以下の内容物を先程のライブラリが納められているディレクトリにコピーして使う事になります。
※リンカーオプションでコア別のディレクトリを直接指定できるかもしれません。
ここで注意しなければならないのは、ライブラリに気を取られて何とか.aのみコピーしただけでは駄目で、lib\gcc\arm-none-eabi\4.3.3の場合はcrti.oとcrtbegin.oもコピーの対象です。
この2つをコピーしなかったお蔭で随分と悩む結果になってしまったのです。これはxoさんに指摘された事ですね。
※しかしなんで今までちゃんと起動して動いていたんだ?。
※このオブジェクトファイルが呼ばれている事は、mapファイルをよく眺めていないと全く気付けませんでした。何だろうな?、makefileの中にもこのオブジェクトの記述が一切無いのですが、gccって自動的にcrtをリンクする機能が有るのかな?。
ちなみにコンパイルオプションはコンパイラマニュアルの記述に則って以下の様にしました。
写真は三角関数を使って座標を決め、中心から放射状に線を引いてみたところです。
浮動小数点をint型に直す際の切り捨て誤差の影響なのか、なんだかフラクタル画像の様になってしまいました。
今回の対応で浮動小数点は使えるようにはなったのですが、標準入出力がまだ上手く行っていません。
低水準入出力関数は用意できているのですが、ファイル(FILE)の管理領域の初期化を行わないと標準入出力は使えない筈なんだけれど、ぐぐってもなかなか答えを見つける事ができませんです。
ルネサスのHEWの場合はマニュアルに親切丁寧な解説が付いていて容易に標準入出力を構築できたんですけれど、gccは私にとっては敷居が高いなぁ、やれやれ。
まずCodeSourceryから提供されているツールチェインのデフォルトライブラリの位置は、インストールディレクトリ以下のlib\gcc\arm-none-eabi\4.3.3以下にあるライブラリをランタイムルーティンとして使用している様です。
また標準ライブラリ等はインストールディレクトリ以下のarm-none-eabi\libに有るものを使用しています。
ところでこれらディレクトリには、更にその下にCPUコアのバージョン毎のライブラリが用意されており、実際に使用するのは自分で使用するコアに対応したこっちのライブラリを使うようです。
つまりCortex M3で使用する時はthumb2以下の内容物を先程のライブラリが納められているディレクトリにコピーして使う事になります。
※リンカーオプションでコア別のディレクトリを直接指定できるかもしれません。
ここで注意しなければならないのは、ライブラリに気を取られて何とか.aのみコピーしただけでは駄目で、lib\gcc\arm-none-eabi\4.3.3の場合はcrti.oとcrtbegin.oもコピーの対象です。
この2つをコピーしなかったお蔭で随分と悩む結果になってしまったのです。これはxoさんに指摘された事ですね。
※しかしなんで今までちゃんと起動して動いていたんだ?。
※このオブジェクトファイルが呼ばれている事は、mapファイルをよく眺めていないと全く気付けませんでした。何だろうな?、makefileの中にもこのオブジェクトの記述が一切無いのですが、gccって自動的にcrtをリンクする機能が有るのかな?。
ちなみにコンパイルオプションはコンパイラマニュアルの記述に則って以下の様にしました。
COMPILE_OPTS = -mthumb -march=armv7 -mfix-cortex-m3-ldrd -Wall -g -O0
写真は三角関数を使って座標を決め、中心から放射状に線を引いてみたところです。
#include <math.h> int angle,cos_x,sin_y; BG_Set( 0, X_MAX_PIXEL, 0, Y_MAX_PIXEL, WHITE ); for( angle = 0; angle < 360; angle++ ) { cos_x = 100.0 * cos( angle * M_TWOPI / 360); sin_y = 100.0 * sin( angle * M_TWOPI / 360); DrawTiltLine( 240, 136, cos_x + 240, sin_y + 136, BLACK ); }
浮動小数点をint型に直す際の切り捨て誤差の影響なのか、なんだかフラクタル画像の様になってしまいました。
今回の対応で浮動小数点は使えるようにはなったのですが、標準入出力がまだ上手く行っていません。
低水準入出力関数は用意できているのですが、ファイル(FILE)の管理領域の初期化を行わないと標準入出力は使えない筈なんだけれど、ぐぐってもなかなか答えを見つける事ができませんです。
ルネサスのHEWの場合はマニュアルに親切丁寧な解説が付いていて容易に標準入出力を構築できたんですけれど、gccは私にとっては敷居が高いなぁ、やれやれ。
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05
- メディア: 単行本
2009-10-03 03:39
nice!(0)
コメント(3)
トラックバック(0)
FILE構造体は、ブートしたときに
How many files (0-15)?
に適切な値を入れると初期化されて使えるようになると思います。
いや、冗談じゃなく、静的にFILE構造体を確保しているところはありませんか?
by noritan (2009-10-03 08:37)
扱うファイル数はユーザーが決めるのでしょうから、FILE構造体の領域確保自体もユーザーが行うような気もするけれど、あるいはデフォルト値が決まっていて標準ライブラリ自体が確保しているのかな?。
ARIESみたいに画面やタッチパッドまで付いていると、やはり標準入出力を使って抽象化したいと思えますよね。
by hamayan (2009-10-03 09:48)
crti.o 等をコピーしてしまうと、Cortex-M3 以外を扱うときなど面倒ですし、CodeSourcery G++ Lite のインストールディレクトリ内をいじると、アンインストールやアップグレード時にも面倒なことになります。
gccを使ってリンクするとき -Bprefix オプションを使うと、そのプレフィクスのディレクトリからcrt.o等をリンクしてくれました。
by xo (2009-11-06 10:43)