私はチップをプログラムするためにコンパイラ(ARM EABI用のSourcery Codebenchlite)を使用Keil uVision
しています。gcc
STM32F4 cortex M4
私が設定したコンパイラ制御文字列は次のとおりです。
-march=armv7e-m -mfpu=fpv4-sp-d16 -mfloat-abi=softfp -std=gnu99 -fsingle-precision-constant
デバッガーがいくつかの数学関数 ( など) に遭遇すると、デバッガーはasinf()
停止atan2f()
します。
これらの関数の引数も単精度であることを確認しました。
浮動小数点を使用するためのコンパイラ ディレクティブが欠落していることが原因だと思いますが、VFP
特定できませんでした。
見逃したものはありますか?
私が行った例の逆アセンブリコード:
デバッガーは atan2f(0.3,0.4) を評価できますが、atan2f(a,b) を評価すると 0x0803B9CA で停止します。変数ではなく、数値が機能する理由がわかりませんでした。
377: float a = 0.3;
0x0803B9BA 4B1E LDR r3,[pc,#120] ; @0x0803BA34
0x0803B9BC 63BB STR r3,[r7,#0x38]
378: float b = 0.4;
379:
0x0803B9BE 4B1E LDR r3,[pc,#120] ; @0x0803BA38
0x0803B9C0 637B STR r3,[r7,#0x34]
380: float c = atan2f(0.3,0.4);
0x0803B9C2 4B1E LDR r3,[pc,#120] ; @0x0803BA3C
0x0803B9C4 633B STR r3,[r7,#0x30]
381: float d = atan2f(a,b);
382:
0x0803B9C6 6BB8 LDR r0,[r7,#0x38]
0x0803B9C8 6B79 LDR r1,[r7,#0x34]
0x0803B9CA F004F993 BL.W atan2f (0x0803FCF4)
0x0803B9CE 62F8 STR r0,[r7,#0x2C]