Renesas Synergy™

FAQ 1008249 :数学ライブラリ関数(tanf、atanf)が使用できないのですが?

プログラム中に、以下のような記述をしているのですが、返ってくる値が0になります。

-------------------------
    float result;

    result = tanf(1);
    result = atanf(0.2);
-------------------------

ライブラリは、リンカ・オプションで、数学ライブラリ関数を使用するように 設定しているのですが、うまく動作しません。
"#include " もプログラム中に記述しましたが、動作しませんでした。

リンカ・オプション設定ダイアログで、ライブラリのオプションは以下のように設定しています。

-lm -lc -lr c:\nectools32\lib850\r32\rompcrt.o

 

回答

上記のライブラリを使用する際には、.sdataセクションに初期値ありの変数が使用されます。

リンク・マップを確認すると、以下のように.sdataセクションが配置されています。

 

サイズファイル名
0x00000038 sinxf.o(c:\nectools32\lib850\r32\libm.a)
0x00000048 atanxf.o(c:\nectools32\lib850\r32\libm.a)
0x000000c6 com3f.o(c:\nectools32\lib850\r32\libc.a)


上記のセクションの変数のアドレスに初期値がない場合、ライブラリは正常に動作しません。

リンカ出力のa.outをダウンロードしている場合は、初期値のデータはRAMの変数のアドレスに ダウンロードされます。
その後、RAMクリア処理などで初期値のクリアしている場合、ライブラリは正常動作しなくなります。

また、ROM化処理(romp850.exe)をしている場合、初期値のデータはROMにパッキングされています。
この値は、_rcopy関数でRAMの変数のアドレスに初期値をコピーします。
この_rcopy関数がない場合は、初期値がない状態になるので、ライブラリは正常に動作しません。
RAMクリア処理は、_rcopy関数の前に入れてください。

以上のように、初期値が正常かどうかの確認をしてください。

適用製品

V850用コンパイラパッケージ [CA850]
他にご質問がございましたら、リクエストを送信してください