Was thinking about this, because it' only a half bridge the centre aligned PWM doesn't help and 8.8kHz actually gives accoustic noise at 8.8kHz not 17.8kHz.
Thought about hard coding the library location but really didn't like the idea. Not sure the fix I've found quite does the job though; this is what you see in the disassembly window for the GetTotalVoltage function when using libm: Not as conclusive as it could still be using the vsqrt call inside the call to sqrtf but that and the slower than expected execution (19.535us compared to 15us for fixed point) made me wonder.
Found a couple of posts suggesting that math errno can prevent the fpu being used so added the compiler flag -fno-math-errno but it didn't seem to make any difference.
Ended up binning libm and libc and instead using an inlineable function with a direct assembler call to the command. This is now the disassembler view of the same function: Fairly clear that that is using the fpu! execution time for PwmGeneration::Run() also dropped from 19.535us to 16.795us
Not ideal as I now need to add a little bit of conditional compilation so that it will also run in the simulator but I was getting thoroughly fed up of trying to find the compiler/linker options to get libm to do the same (sure it's possible, I just don't know the magic combination of flags).
Not too bad at all, ignoring the fixed point to floating point stuff, libopencm3 hides most of the changes. Most of it is just changing reloads to suit the new clock frequencies. Did have to replace the old rtc with timer5 and a few changes to suit the new flash memory structure. You'd already done a lot of this on your libopeninv port. Most of my time was spent taking out all the legacy code which it no longer made sense to keep in and the rest restructuring the way interrupts/DMA work for triggering resolver/current sampling and the main control loop execution.