0

私はチップをプログラムするためにコンパイラ(ARM EABI用のSourcery Codebenchlite)を使用Keil uVisionしています。gccSTM32F4 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]
4

1 に答える 1

1

STM32F4 では、最初に FPU を有効にする必要があります。そうしないと、CPU が HardFault_Handler または BusFault_Handler にジャンプします (どちらかはわかりません)。

C/C++ では、浮動小数点命令を使用する前ならどこでも実行できます (おそらく main() の先頭?)。CMSIS ライブラリを使用し、core_m4.h が含まれていると仮定します (おそらく stm32f4xx.h を介して):

void cortexm4f_enable_fpu() {
    /* set CP10 and CP11 Full Access */
    SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));
}

別の方法は、スタートアップ ファイル内のアセンブラー コードです。

/*enable fpu begin*/
ldr     r0, =0xe000ed88           /*; enable cp10,cp11 */
ldr     r1,[r0]
ldr     r2, =0xf00000
orr     r1,r1,r2
str     r1,[r0]
/*enable fpu end*/

(インターネットのどこかでコードを見つけましたが、場所はわかりません。自分で使用しましたが、動作します)。

多分あなたの問題はそこにありますか?

于 2012-05-24T22:46:31.880 に答える