GCC交叉编译器(用于ARM micro)抱怨';不支持的浮点ABI';在不存在FP指令的函数中

GCC交叉编译器(用于ARM micro)抱怨';不支持的浮点ABI';在不存在FP指令的函数中,c,gcc,arm,microcontroller,C,Gcc,Arm,Microcontroller,我按照标准程序从意法半导体公司获得了新的Nucleo-F767ZI板并开始运行。程序如下: 步骤1 我从AC6下载了SW4STM32 IDE。这是一个基于Eclipse的IDE,用于编程来自STMicroelectronics的STM32微控制器系列 步骤2 我从意法半导体公司下载了最新的CubeMX软件。CubeMX是一个基于java的工具,您可以在其中为微控制器配置一些基本设置:时钟速度、实时操作系统、外围设备等等。之后,CubeMX会弹出一个文件夹,里面有一堆c源文件。这基本上是你的项目开

我按照标准程序从意法半导体公司获得了新的Nucleo-F767ZI板并开始运行。程序如下:

步骤1

我从AC6下载了SW4STM32 IDE。这是一个基于Eclipse的IDE,用于编程来自STMicroelectronics的STM32微控制器系列

步骤2

我从意法半导体公司下载了最新的CubeMX软件。CubeMX是一个基于java的工具,您可以在其中为微控制器配置一些基本设置:时钟速度、实时操作系统、外围设备等等。之后,CubeMX会弹出一个文件夹,里面有一堆c源文件。这基本上是你的项目开始

步骤3

我打开SW4STM32 IDE并导入CubeMX刚刚生成的项目。我不更改或添加任何代码。我只需单击build按钮,希望该项目将编译成一个可执行的.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     }
我从编译器得到的错误消息是:

第173行:抱歉,未实现:Thumb-1硬浮动VFP ABI

现在有几个原因使我无法理解此特定错误消息:

>第1期

第一个问题是关于错误的位置。第173行是开口曲括号所在的行。究竟为什么错误消息会引用该行

>第二期

其次,我不明白为什么错误消息提到我的微控制器上的硬件浮点单元。在
ucPortCountLeadingZeros(..)
函数中,我看不到任何浮点指令

>第三期

我已经在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指令集版本是什么呢。拇指一还是拇指二

请帮助我找出为什么这个从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个选项:<代码> MCC GCC编译器< /> >、代码> MCGCC链接器< /代码>和<代码> MCC GCC汇编程序< /代码>。单击第一个,然后选择
杂项

>您应该看到
其他标志
行。将以下选项添加到该行:
-mcpu=cortex-m7


2。将选项添加到汇编程序中

>在相同的属性窗口中,选择MCU GCC Assembler
General

>您应该看到
汇编程序标志
行。将选项
-mcpu=cortex-m7
添加到该行


3。将选项添加到链接器中

>再次在属性窗口中,选择MCU GCC链接器

>您应该看到
命令行模式
行,其中包含以下文本:

    ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
>将选项
-mcpu=cortex-m7
添加到该行


完成所有这些之后,编译器、汇编程序和链接器都知道您要为Cortex-M7体系结构构建。CubeMX在默认情况下没有将其放在生成项目的配置文件中,这仍然让我有点困扰。但至少,我们现在知道了解决办法


非常感谢@Notlikethat、@Jean-Louis Bonnafe和@rjp给我带来了这个解决方案,并给出了有用的注释:-)

正如问题下面的注释所指出的,CubeMX生成的项目没有为编译器指定
-mcpu
选项。因此,应该手动将此选项添加到编译器、链接器和汇编程序:

    -mcpu=cortex-m7
如果您这样做,它就可以顺利构建

将该选项添加到编译器、链接器和汇编程序中有点棘手。我会详细解释怎么做


1。将选项添加到编译器中

>右键单击Eclipse左侧窗口中的项目文件夹。单击弹出窗口中的
Properties

>在属性窗口中,选择左侧的
C/C++Build
Settings

现在你应该看到窗口中间有3个选项:<代码> MCC GCC编译器< /> >、代码> MCGCC链接器< /代码>和<代码> MCC GCC汇编程序< /代码>。单击第一个,然后选择
杂项

>您应该看到
其他标志
行。将以下选项添加到该行:
-mcpu=cortex-m7


2。将选项添加到汇编程序中

>在相同的属性中,windo