S32DS编译FreeRTOS报vstm错

作者: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)。如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值