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 Compiler
、MCU GCC Linker
和 MCU 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;
我已按照标准程序从 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 Compiler
、MCU GCC Linker
和 MCU 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;