Skip to main content
alexpabouct9
Associate III
October 16, 2013
Question

Problems using FPU and GCC on STM32F3

  • October 16, 2013
  • 2 replies
  • 1291 views
Posted on October 16, 2013 at 20:18

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 andTHETA_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.fu32 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
    This topic has been closed for replies.

    2 replies

    Tesla DeLorean
    Guru
    October 16, 2013
    Posted on October 16, 2013 at 20:29

    Where  COUNT2ANGLE and THETA_ZERO are floating point constants (using defines).

     

    But how are they defined, Perhaps as doubles, and not as floats? ie 1.23f

    The FPU only helps if the math is done totally with floats, and the fairly basic arithmetic supported by the FPU.

    Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
    alexpabouct9
    Associate III
    October 16, 2013
    Posted on October 16, 2013 at 22:59

    They were defined as doubles, correcting them as floats did the trick.

    Thanks!

    Alex