前言
果然不动就没问题,一动问题还挺多。。。
FreeRTOS的FPU问题
FPU是一部分MCU自带的硬件浮点运算功能,开启硬件浮点后,运算速度可以加速。本人在做的是运动控制类,时常需要和浮点数打交道,在之前使用的STM32G0系列MCU,属于Cortex-M0+,它并不是带有FPU,因此在移植FreeRTOS、DSP库(软件)的时候,并没有遇到很多问题,更多的是直接依赖stm32cubeMX的自带的东西直接使用。但是在我将MCU更改为STM32F429之后,发现它是带FPU的,在freeRTOS的port.c的文件中也有操作FPU的。因此在没有任何更改直接换MCU的情况下,会有这样的报错:
C:\Users\ADMINI~1\AppData\Local\Temp\ccFdJEoV.s:330: Error: selected processor does not support `vstmdbeq r0!,{s16-s31}' in Thumb mode
C:\Users\ADMINI~1\AppData\Local\Temp\ccFdJEoV.s:332: Error: instruction not allowed in IT block -- `stmdb r0!,{r4-r11,r14}'
C:\Users\ADMINI~1\AppData\Local\Temp\ccFdJEoV.s:352: Error: selected processor does not support `vldmiaeq r0!,{s16-s31}' in Thumb mode
C:\Users\ADMINI~1\AppData\Local\Temp\ccFdJEoV.s:354: Error: instruction not allowed in IT block -- `msr psp,r0'
*** [.pio\build\SGRBL_F429\src\stm32-platformio-freertos\portable\GCC\ARM_CM4F\port.o] Error 1
毫无疑问,这是配置有问题,很巧的是,我见过这个报错,如果自己曾经写过makefile,并且有过普通从没有FPU的makefile转到带FPU的makefile的过程的话,应该都会遇到这样的问题,其实这也不难解决,简单的,我不自己写,我用stm32cubeMX先生成一个来看看,有什么是需要注意的: makefile里面,对比一下就知道,多了这部分操作浮点的,当然我们也知道platformIO本身也是使用gcc的,几乎可以说就是一个升级版的makefile。OK,底子摸懂了,就开始表演了 毫无疑问,我直接添加这句话 结果当然是毫无疑问,出问题了 经过我多番寻找,结果发现是PIO的一个bug,所以解决方法也给上:
- 1、先创建一个update_link_flags.py
- 2、在update_link_flags.py里面写上这些内容:
# Custom settings, as referred to as "extra_script" in platformio.ini
#
# See http:
from SCons.Script import DefaultEnvironment
env = DefaultEnvironment()
env.Append(
LINKFLAGS=[
"-mthumb",
"-mfloat-abi=hard",
"-mfpu=fpv4-sp-d16",
"-mcpu=cortex-m4"
]
)
我的是这样的: 这样的话,你可以很愉快地进行编译了。
|