0

我正在使用Keil uVision编译gcc器(ARM EABI 的 Sourcery Codebenchlite )对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]
4

1 回答 1

1

在 STM32F4 上,您首先需要启用 FPU - 否则 CPU 将跳转到 HardFault_Handler 或 BusFault_Handler(我不知道是哪一个)。

在使用浮点指令之前(可能在 main() 的开头?),您可以在 C/C++ 中的任何地方执行此操作。假设您使用 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 回答