GCC 交叉编译器(用于 ARM micro)在不存在 FP 指令的函数中抱怨 'non supported floating point ABI'

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 的工具,您可以在其中为您的微控制器配置一些基本设置:时钟速度、实时-os、外围设备……。之后,CubeMX 吐出一个文件夹,里面有一堆 c 源文件。这基本上就是您要开始的项目。

第 3 步

我打开 SW4STM32 IDE 并导入 CubeMX 刚刚生成的项目。我不更改或添加任何代码。我只是单击构建按钮,希望该项目将编译为可执行的 .bin 文件(也可能是 .elf 文件)。这就是问题所在。

错误

编译器发现(或认为他发现)FreeRTOS文件中的以下函数有错误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     }

我从编译器得到的错误信息是:

line 173 : sorry, unimplemented: Thumb-1 hard-float VFP ABI

现在有几个原因导致我不理解这个特定的错误消息:

>> 第一期

第一个问题是关于错误的位置。第 173 行是左花括号所在的行。为什么错误消息会引用该行?

>>第2期

其次,我不明白为什么错误消息会提到我的微控制器上的硬件浮点单元。我在 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 左侧 window 中的项目文件夹。在弹出窗口中点击 Properties window。

> 在属性 window, select C/C++ Build > Settings 左边.

> 现在您应该在 window 中间看到 3 个选项:MCU GCC CompilerMCU GCC LinkerMCU GCC Assembler。点击第一个,select Miscellaneous.

> 您应该会看到 other flags 行。将以下选项添加到该行:-mcpu=cortex-m7.


2。将选项添加到汇编器

> 在相同属性 window, select MCU GCC Assembler > General.

> 您应该会看到 Assembler flags 行。将选项 -mcpu=cortex-m7 添加到该行。


3。将选项添加到链接器

> 再次在属性中 window, select 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 以支持新的 board/chip。 IAR workbench V7.50不支持F767ZI,V7.60支持。 SW4STM32 更新:"Help" >> "Check for updates..." 然后重启 Eclipse;