我已经按照标准程序从STMicroelectronics获得了新的nuclear-F767ZI板并开始运行。程序如下:
步骤1
我从AC6下载了SW4STM32 IDE。这是一个基于Eclipse的IDE,用于从STMicroelectronics编程STM32微控制器系列。
步骤2
我从STMicroelectronics下载了最新的CubeMX软件。CubeMX是一个基于java的工具,您可以在其中为微控制器配置一些基本设置:时钟速度、实时操作系统、外设。。。。之后,CubeMX会弹出一个文件夹,其中包含一堆c源文件。这基本上是你的项目开始。
步骤3
我打开SW4STM32 IDE并导入CubeMX刚刚生成的项目。我不更改或添加任何代码。我只需单击build按钮,希望该项目将编译为可执行的.bin文件(也可能是.elf文件)。这就是问题所在。
错误
编译器在FreeRTOS文件中发现(或认为他发现)以下函数中的错误:
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期
其次,我不明白为什么错误信息提到我的微控制器上的硬件浮点单元。我在
portmacro.h
函数中看不到任何浮点指令。>>第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
所以,实际选择的是什么拇指指令集版本。拇指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
如果你这样做了,它就不会有麻烦了。
向编译器、链接器和汇编器添加选项有点棘手。我会详细解释怎么做。
一。向编译器添加选项
>右键单击Eclipse左侧窗口中的项目文件夹。在弹出窗口中单击
Properties
。>在属性窗口中,选择左侧的
C/C++ Build
Settings
。>现在您应该在窗口中间看到3个选项:
MCU GCC Compiler
、MCU GCC Linker
和MCU GCC Assembler
。单击第一个,然后选择Miscellaneous
。>您应该看到
other flags
行。在该行中添加以下选项:-mcpu=cortex-m7
。2。向汇编程序添加选项
>在相同的属性窗口中,选择
MCU GCC Assembler
General
。>您应该看到
Assembler flags
行。将选项-mcpu=cortex-m7
添加到该行。三。将选项添加到链接器
>再次在属性窗口中,选择
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给我带来了这个解决方案,并给出了有用的评论:-)
关于c - GCC交叉编译器(用于ARM micro)在没有FP指令的函数上提示“不支持的浮点ABI”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39348909/