繁体   English   中英

GCC交叉编译器(用于ARM micro)在没有FP指令的函数上抱怨“不支持的浮点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的工具,您可以在其中为微控制器配置一些基本设置:时钟速度,实时操作系统,外设...。 之后,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 CompilerMCU GCC LinkerMCU 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM