调试器在具有浮点参数的数学函数内停止

时间:2012-05-14 12:36:27

标签: gcc arm stm32 fpu keil

我正在使用Keil uVisiongcc编译器(针对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]

1 个答案:

答案 0 :(得分: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*/

(我在互联网的某个地方找到了代码,不知道在哪里。我自己使用它,它有效。)

也许你的问题就在那里?