2024-09-12 04:05 AM
Hi guys
I made a project with CubeMX for a STM32F334. This project built fine already multiplet times.
Now, I get suddenly this error message:
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
As I said, the project was built fine most times, and in the SystemInit function in system_stm32f3xx.c, there is the fpu present check. I do not see any reason why this message comes up.
As I looked for an explanation, I found someone whith this problem, and it seemed to be about wrong including order. If this is a reason: How can I ensure the right order?
I already regenerated the code by CubeMX multiple times. If I accidently removed an include file or did other things wrong, I assumed that this will fix the problem, but it does not. Does anyone have any other ideas how to solve?
Best regards
Solved! Go to Solution.
2024-09-13 04:54 AM
I don't know how would including a header file (stm32f3xx.h) would lead to a complaint on missing library, there should be no such relationship. That file btw. is the standard CMSIS-mandated device header (more precisely a header which includes it), i.e. the header which provides you symbols like GPIOA, USART1, etc.
But instead of including that file, you can alternatively just simply add
#define __FPU_PRESENT 1U
before including arm_math.h
JW
2024-09-12 04:22 AM - edited 2024-09-12 04:22 AM
Check the compiler options in project settings? Is floating point selected there?
STM32F3 does not have a FPU so FPU instructions should not be generated.
2024-09-12 04:50 AM
It would likely be a mismatch in -cpu, -arch or --fpu command line options, where by it thinks its build for a cm3 vs cm4, or a soft fp
The Linker can also complain if objects or libraries mismatch.
2024-09-12 05:08 AM
Hi guys
Thanks for replying.
I'm quietly sure that my F334 has a fpu. Even though it was a long time ago, but I used it already, and in the current project I'm working with arm_math.h and it's float32_t types, and it built fine yesterday and today morning.
The error message in my first post contains a link to a file "Drivers/CMSIS/include/core_cm4.h". I think, as the F334 bases on a M4 core, this should be fine (shouldn't it?).
The compiler settings does also not looking wrong to me, but to be hornest I have no idea what really would right or wrong, so I better attach a screenshot of them.
2024-09-12 05:58 AM - edited 2024-09-12 06:04 AM
Sorry, my bad. It has FPU, per the data sheet.
Your project path has spaces. Better avoid this.
2024-09-12 06:20 AM
Show the command line used to compile and the complete output of compilation (copypaste text, don't screenshot).
JW
2024-09-12 07:04 AM
Here is the whole console output after a build run:
15:57:26 **** Incremental Build of configuration Debug for project SPV ****
make -j32 all
arm-none-eabi-gcc "../Core/Src/trs.c" -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DARM_MATH_CM4 -DSTM32F334x8 -DUSE_FULL_LL_DRIVER -DHSE_VALUE=8000000 -DHSE_STARTUP_TIMEOUT=100 -DLSE_STARTUP_TIMEOUT=5000 -DLSE_VALUE=32768 -DEXTERNAL_CLOCK_VALUE=8000000 -DHSI_VALUE=8000000 -DLSI_VALUE=40000 -DVDD_VALUE=3300 -DPREFETCH_ENABLE=1 -c -I../Core/Inc -I../Drivers/CMSIS/DSP/Include -I../Drivers/STM32F3xx_HAL_Driver/Inc -I../Drivers/CMSIS/Device/ST/STM32F3xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/trs.d" -MT"Core/Src/trs.o" --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -o "Core/Src/trs.o"
In file included from ../Drivers/CMSIS/DSP/Include/arm_math.h:322,
from ../Core/Inc/trs.h:12,
from ../Core/Src/trs.c:10:
../Drivers/CMSIS/Include/core_cm4.h:105:8: error: #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
105 | #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
| ^~~~~
make: *** [Core/Src/subdir.mk:49: Core/Src/trs.o] Error 1
"make -j32 all" terminated with exit code 2. Build might be incomplete.
15:57:26 Build Failed. 2 errors, 0 warnings. (took 280ms)
2024-09-12 07:35 AM
#error "Compiler generates FPU instructions for a device without an FPU (check _FPU_PRESENT)"
That #error directive will undoubtedly be within some #if checks.
So go to line 105 in core_cm4.h and see what it's checking - then check how your project has those things configured
2024-09-12 10:08 AM
Well, here is the content from core_cm4.h, from line 100 until line 110:
#elif defined ( __GNUC__ )
#if defined (__VFP_FP__) && !defined(__SOFTFP__)
#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)
#define __FPU_USED 1U
#else
#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
#define __FPU_USED 0U
#endif
#else
#define __FPU_USED 0U
#endif
I have absolutely no idea how that was changed accidently. I did work in src and inc directories only.
But nevertheless, where and how can I check these options? Soft floating point, ok...but what does VFP_EP mean?
2024-09-12 10:11 AM
In trs.h, before #include "arm_math.h" insert #include "stm32f3xx.h"
---
> So go to line 105 in core_cm4.h and see what it's checking
It's checking presence of _FPU_PRESENT symbol, exactly as the wording of the error says
JW