我正在使用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]
答案 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*/
(我在互联网的某个地方找到了代码,不知道在哪里。我自己使用它,它有效。)
也许你的问题就在那里?