# Problems using FPU and GCC on STM32F3

Question asked by Pabouctsidis.Alex on Oct 16, 2013
Latest reply on Oct 16, 2013 by Pabouctsidis.Alex
Hello,

I'm currently working on a motor application where i need to perform some simple math but at a high rate (20khz). Unfortunately, for some reason the computation time is too long, and it is unable to keep up with the update rate.

I measured the number of cycles for a simple line such as:

`Angle = (float)(Count)*COUNT2ANGLE + THETA_ZERO;`

Where  COUNT2ANGLE and THETA_ZERO are floating point constants (using defines). This line requires 200 cycles which is just way too long. Here is the disassembly of the line of code:

`208             Angle = (float)(Count)*COUNT2ANGLE + THETA_ZERO;`
`08000d96:   uxth r2, r0`
`08000d98:   vmov s15, r2`
`08000d9c:   vcvt.f32.u32 s0, s15`
`08000da0:   vmov r0, s0`
`08000da4:   bl 0x80004a4 <``__extendsfdf2``>`
`08000da8:   add r3, pc, #60 ; (adr r3, 0x8000de8 <``TIM1_UP_TIM16_IRQHandler``+120>)`
`08000daa:   ldrd r2, r3, [r3]`
`08000dae:   bl 0x800054c <``__muldf3``>`
`08000db2:   add r3, pc, #60 ; (adr r3, 0x8000df0 <``TIM1_UP_TIM16_IRQHandler``+128>)`
`08000db4:   ldrd r2, r3, [r3]`
`08000db8:   bl 0x80001e8 <``__aeabi_dadd``>`
`08000dbc:   bl 0x80009c0 <``__truncdfsf2``>`

What i don't understand is why are there calls to __extendsfdf2 fd , etc. which are floating point emulation functions? its seems the compiler is mixing soft and hard floating point instructions.

Im using Atollic (GCC) with the the following compiling options:

`-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -std=gnu90 -DSTM32F30X -DUSE_STDPERIPH_DRIVER -I../src -I..\Libraries\CMSIS\Include -I..\Libraries\CMSIS\Device\ST\STM32F30x\Include -I..\Libraries\STM32F30x_StdPeriph_Driver\inc -I"C:\cvs_projects\Roboteq FOC\Firmware\Brushless_FOC\FreeRTOS 7.5.2\inc" -I"C:\cvs_projects\Roboteq FOC\Firmware\Brushless_FOC\inc" -I"C:\cvs_projects\Roboteq FOC\Firmware\Brushless_FOC\Drivers\inc" -O3 -ffunction-sections -fdata-sections -g -Wall`

Anyone know if there indeed something wrong, and if so, how to fix it?

Thanks,
Alex