作者:Stephen Du
免责声明: 本文为个人学习笔记及总结,仅代表个人观点,尽可能保证内容准确性。
所有文字均是自己码出来的,所有图片均为自己勾画(除部分来源于原始标准)。
复制/转发请注明来源/作者。
欢迎添加微信交流学习。
大部分情况下,S32DS里面官方默认提供了移植并集成好的FreeRTOS工程,所以不会碰到什么问题。但有些时候我们需要自己去集成。最近在S32DS里面集成MCAL以及FreeRTOS的时候就碰到了一个编译错误,错误信息如下:
新手看到错误信息可能又有点慌,尤其是错误提示信息:
selected processor does not support...
误以为芯片型号选错了,但其实完全不相干。我们可以通过错误提示信息里面的汇编信息来定位解决。通过ARM官方文档可以查询到vstm
或者vldm
都与浮点数(floating-point)有关。所以根本原因是你工程里面Float ABI设置有问题。
在S32DS工程熟悉里面: C/C++ Build -> Settings -> Target Processor -> Float ABI。一共有四个选项可供设置,如下图所示:
这里必须打开浮点单元,也就是说你只能选中最后两个:Library with FP (softfp)或者 FP instructions (hard)就不会报错,如果你选中了Library (soft)就会报前面的错误。
按理说选择Library (soft)针对普通的浮点计算,比如你定义了float类型的数据,编译器会自动使用库,也不应该发生错误。于是我查找了一下错误信息里面提到的那几个命令,原来是在port.c文件里面的xPortPendSVHandler函数里面。这个文件是移植的时候由用户自己负责的(不是FreeRTOS官方发布),也就是说这个原因是NXP官方移植的时候没有考虑使用软件浮点的场景,所以只能使用硬件浮点单元。不过既然硬件支持浮点运算,肯定是建议使用硬件类型的,效率肯定高一些。
但是需要注意的时候S32DS环境下要真正使能硬件浮点,不是单纯在上图中选择FP instructions (hard)就可以了,但NXP提供的软件包里面还有一个开关,你需要定义一个ENABLE_FPU的宏,否则真正的硬件浮点相关的寄存器还是没有设置,你编译可能不会报错,但运行起来的时候会异常(产生hardfault)。如下图所示: