AnsweredAssumed Answered

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

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?