GCC交叉编译器(针对ARM micro)在没有FP指令的函数中抱怨'不支持的浮点ABI'

时间:2016-09-06 12:19:57

标签: c gcc arm microcontroller

我按照标准程序从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中找到(或认为他发现)以下函数中的错误:

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 hard-float VFP ABI

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

>>问题1

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

>>问题2

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

>>问题3

我在Eclipse项目中打开了GCC编译器设置。只是看看默认设置。我什么都没改变。这是两个截图:

enter image description here

enter image description here

第一个屏幕截图显示选择了以下选项:

    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指令集版本。 Thumb I还是Thumb 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

2 个答案:

答案 0 :(得分:2)

如下面的问题中的注释中所述,CubeMX生成的项目未指定编译器的-mcpu选项。因此,应该手动将此选项添加到编译器,链接器和汇编器中:

    -mcpu=cortex-m7

如果你这样做,它会毫无困难地构建。

将选项添加到编译器,链接器和汇编器有点棘手。我将详细解释如何做到这一点。

<强> 1。将选项添加到编译器

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

&GT;在属性窗口中,选择C/C++ Build&gt;左边是Settings

&GT;现在,您应该在窗口中间看到3个选项:MCU GCC CompilerMCU GCC LinkerMCU GCC Assembler。点击第一个,然后选择Miscellaneous

&GT;您应该看到other flags行。将以下选项添加到该行:-mcpu=cortex-m7

<强> 2。将选项添加到汇编程序

&GT;在同一属性窗口中,选择MCU GCC Assembler&gt; General

&GT;您应该看到Assembler flags行。将选项-mcpu=cortex-m7添加到该行。

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

&GT;再次在属性窗口中,选择MCU GCC Linker

&GT;您应该看到Command line pattern行,其中包含以下文字:

    ${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

&GT;将选项-mcpu=cortex-m7添加到该行。

完成所有这些后,编译器,汇编器和链接器都知道您要为Cortex-M7架构构建。令人困扰的是,CubeMX默认情况下并没有将它放在生成项目的配置文件中。但至少,我们现在知道解决方法..

非常感谢@Notlikethat,@ Jean-Louis Bonnaffe和@rjp为我带来了有用评论的解决方案: - )

答案 1 :(得分:1)

我已经遇到过类似的问题。必须更新IDE以支持新的板/芯片。 IAR工作台V7.50不支持F767ZI,但V7.60支持。 SW4STM32更新:&#34;帮助&#34; &GT;&GT; &#34;检查更新......&#34;然后重启Eclipse;