Я использую Keil uVision
с компилятором gcc
(Sourcery Codebenchlite для ARM EABI) для программирования чипа 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), но останавливается на 0x0803B9CA, когда он оценивает atan2f(a,b). Не знал, почему работает число, но не переменные.
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]