Отладчик останавливается внутри математических функций, которые имеют аргументы с плавающей запятой.

Я использую 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]

person soonhooi    schedule 14.05.2012    source источник
comment
У вас есть проблема, но вы не говорите, в чем она заключается?   -  person ams    schedule 14.05.2012
comment
Отредактировал вопрос. Извините за неясный вопрос, так как я новичок.   -  person soonhooi    schedule 14.05.2012
comment
можете предоставить разборку проблемного места?   -  person old_timer    schedule 15.05.2012
comment
Привет, dwelch, я добавил разборку. Спасибо за вашу помощь.   -  person soonhooi    schedule 15.05.2012
comment
кроме того, если я заменю sqrtf() на atan2f(), ошибки не будет.   -  person soonhooi    schedule 15.05.2012


Ответы (1)


На STM32F4 вам сначала нужно включить FPU, иначе ЦП перейдет в 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*/

(Я нашел код где-то в Интернете, не знаю, где. Я сам использовал его, он работает).

Может быть, ваша проблема находится там?

person Nils Hesse    schedule 24.05.2012