[英]GCC cross compiler (for ARM micro) complains about 'non supported floating point ABI' at a function where no FP instruction is present
我已经按照标准程序从STMicroelectronics安装并运行了我的新Nucleo-F767ZI板。 步骤如下:
第1步
我从AC6下载了SW4STM32 IDE 。 这是基于Eclipse的IDE,用于对STMicroelectronics的STM32微控制器系列进行编程。
第2步
我从意法半导体(STMicroelectronics)下载了最新的CubeMX软件。 CubeMX是基于Java的工具,您可以在其中为微控制器配置一些基本设置:时钟速度,实时操作系统,外设...。 之后,CubeMX弹出一个文件夹,其中包含一堆c源文件。 这基本上就是您要开始的项目。
步骤3
我打开SW4STM32 IDE,并导入CubeMX刚刚生成的项目。 我不更改或添加任何代码。 我只是单击构建按钮,希望项目将编译为可执行的.bin文件(也许还有.elf文件)。 这是出问题的地方。
错误
编译器在FreeRTOS文件portmacro.h
发现(或认为他发现)以下函数中的portmacro.h
:
171 /* Generic helper function. */
172 __attribute__( ( always_inline ) ) static inline uint8_t ucPortCountLeadingZeros( uint32_t ulBitmap )
173 {
174 uint8_t ucReturn;
175
176 __asm volatile ( "clz %0, %1" : "=r" ( ucReturn ) : "r" ( ulBitmap ) );
177 return ucReturn;
178 }
我从编译器得到的错误消息是:
第173行:抱歉,未实现:Thumb-1硬浮动VFP ABI
现在,有几种原因导致我不理解此特定错误消息:
>>第1期
第一个问题是关于错误的位置。 线173是开口花括号位于的线。 为什么错误消息会引用该行?
>>第2期
其次,我不明白为什么错误消息中提到了我的微控制器上的硬件浮点单元。 我在ucPortCountLeadingZeros(..)
函数ucPortCountLeadingZeros(..)
不到任何浮点指令。
>>第3期
我已经在Eclipse项目中打开了GCC编译器设置。 只是看一下默认设置。 我什么都没改变。 这是两个屏幕截图:
第一个屏幕截图显示选择了以下选项:
Instruction set : Thumb II
第二张屏幕截图显示了GCC提供了以下选项:
-mfloat-abi=hard # Inform GCC that this micro has a hardware floating point unit
-mfpu=fpv5-d16 # The hardware floating point unit is double precision
-mthumb # ARM Thumb instruction set
因此,实际上选择了哪种Thumb指令集版本。 拇指I或拇指II?
请帮助我找出为什么CubeMX生成的项目无法编译。 我非常感谢您提供的任何提示和提示。
编辑:
传递给GCC编译器的完整选项集(如第二个屏幕截图所示)如下:
-mthumb
-mfloat-abi=hard
-mfpu=fpv5-d16
-D__weak="__attribute__((weak))"
-D__packed="__attribute__((__packed__))"
-DUSE_HAL_DRIVER
-DSTM32F767xx
-I../Inc
-I../Drivers/STM32F7xx_HAL_Driver/Inc
-I../Drivers/STM32F7xx_HAL_Driver/Inc/Legacy
-I../Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM7/r0p1
-I../Middlewares/Third_Party/FreeRTOS/Source/include
-I../Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS
-I../Drivers/CMSIS/Include
-I../Drivers/CMSIS/Device/ST/STM32F7xx/Include
-Os
-g3
-Wall
-fmessage-length=0
-ffunction-sections
-c
-fmessage-length=0
正如在问题下方的注释中所指出的那样,CubeMX生成的项目没有为编译器指定-mcpu
选项。 因此,应该手动将此选项添加到编译器,链接器和汇编器中:
-mcpu=cortex-m7
如果这样做,它会毫无问题地建立。
将选项添加到编译器,链接器和汇编器有点棘手。 我将详细说明如何执行此操作。
1.将选项添加到编译器
>右键单击Eclipse左窗口中的项目文件夹。 在弹出窗口中单击Properties
。
>在属性窗口中,选择左侧的C/C++ Build
> Settings
。
>现在,您应该在窗口中间看到3个选项: MCU GCC Compiler
, MCU GCC Linker
和MCU GCC Assembler
。 点击第一个,然后选择Miscellaneous
。
>您应该看到other flags
行。 将以下选项添加到该行: -mcpu=cortex-m7
。
2.将选项添加到汇编器
>在同一属性窗口中,选择MCU GCC Assembler
> General
。
>您应该看到Assembler flags
行。 将选项-mcpu=cortex-m7
到该行。
3.将选项添加到链接器
>再次在属性窗口中,选择MCU GCC Linker
。
>您应该看到Command line pattern
行,其中包含以下文本:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
>在该行中添加选项-mcpu=cortex-m7
。
完成所有这些之后,编译器,汇编器和链接器都知道您要针对Cortex-M7架构进行构建。 仍然令我有些困扰的是,CubeMX并未默认将其放在生成的项目的配置文件中。 但是至少,我们现在知道解决方法。
非常感谢@ Notlikethat,@ Jean-Louis Bonnaffe和@rjp,他们通过有用的评论将我带到了此解决方案中:-)
我已经面临类似的问题。 IDE必须进行更新以支持新的电路板/芯片。 IAR工作台V7.50不支持F767ZI,但V7.60支持。 SW4STM32更新:“帮助” >>“检查更新...”,然后重新启动Eclipse;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.