S32K14x系列使用之硬件FPU特性介绍和使用详解
1.1. Cortex M4F CPU内核FPU的寄存器组以及控制状态寄存器功能介绍
1.2 Cortex M4F CPU内核FPU的汇编指令集介绍
1.3 CM4F内核的FPU异常
2.1 创建使能硬件FPU的S32DS应用工程
2.2 配置S32K14x的S32DS应用工程使能内核硬件FPU
2.3 关于S32DS应用工程FPU Support选项配置的说明
3.1 EWL库with FP instructions(hard)
3.2 EWL库with Libary with FP(softfp)
3.3 EWL库with Libary(soft)
3.4 EWL库with Toolchain default
3.5 使用单精度浮点数进行数学函数运算
3.6 S32K14x系列MCU硬件FPU使用注意事项(Tips)
S32K14x系列汽车级MCU使用了ARM Cortex M4F作为CPU内核,其配置了硬件的FPU--Float Process Unit, 浮点数处理单元,可以支持IEEE 754规范的32-bit单精度浮点数(Single Precision floating point)运算。但是关于Cortex M4F CPU内核的FPU特性和具体在应用程序中如何使用以及使用时的注意事项,并不清楚。
基于此,本文先介绍一下Cortex M4F CPU内核的FPU特性,然后结合S32K144的S32DS应用工程,介绍如何配置使能M4F内核的FPU单元,并给出一些FPU使用的注意事项供大家参考学习。
CM4F CPU内核的硬件FPU单元具有如下特性:
包含专用的32个32-bit的寄存器组,既可以当做32个32-bit寄存器使用也可以当做16个双字(Double-word 64-bit)寄存器使用;
支持IEEE 754规范的32-bit单精度的浮点数运算;
提供转换指令支持:
整型数<-->单精度浮点数;
定点数<-->单精度浮点数;
半精度<-->单精度浮点数;
支持FPU寄存器组与存储器之间的单精度或者双字数据搬移;
支持FPU寄存器组与CPU整型数寄存器组之间的单精度或者双字数据搬移;
1.1. Cortex M4F CPU内核FPU的寄存器组以及控制状态寄存器功能介绍
Cortex M4F CPU内核为FPU提供了专门的数据寄存器S0~S31,这些寄存器时可以作为单独的32-bit寄存器为FPU使用,也可以两两组合为64-bit的D0~D15为FPU所使用,这样其不占用CPU做整数运算和逻辑控制的通用寄存器R0~R11,大大提高了计算效率。
此外,为了获取FPU浮点数计算的结果,还提供FPU专用的状态和控制寄存器--FPSCR(Floating Point Status and Control Register),其定义如下:
Tips: 复位后CP10和CP11都是0'b00,为关闭FPU,允许低功耗的配置。因此使用FPU之前必须通过以下配置将其配置为0'b11:
SCB->CPACR= 0x00F00000; // Enable the floating point unit for full access
除此之外,FPU还提供可以下可以通过CPU地址映射进行访问的额外寄存器:
除此之外,FPU还提供可以下可以通过CPU地址映射进行访问的额外寄存器:
使能FPU后,若发生CPU中断或者异常,则不但CPU通用寄存器(R0~R3, R12, LR)返回地址(Return Address)和状态寄存器(xPSR)需要压栈保存,FPU数据寄存器(S0~S15)以及状态寄存器(FPSCR)也需要压栈保存:
由于硬件FPU的存在,CM4F内核提供了额外的浮点数处理汇编指令集,如下图,CM4F内核使用的FPU为基于ARMv7-M架构的扩展,称作FPUv4-SP(Floating Point version 4 --Single Precision),其为ARMv-7A 和ARMv7-R架构扩展VFPv4-D16(VFP stands for Vector Floating Point--向量浮点数)的子集。这两个版本中很多浮点数指令都是相同的,因此通常浮点数操作也被称作VFP,且所有的浮点数汇编指令助记符都以字母V开头:
①Libary(soft): GCC编译时调用软件库;
②Libary with FP(softfp):允许使用硬件FPU指令,但依然使用GCC库的软件浮点数调用约定(conventions);
③FP instructions(hard):生成硬件FPU指令,且使用FPU规范的调用约定;
④Toolchain default:为新建应用工程默认设置,取决于具体的目标配置;
Tips: 其中选项①Libary(soft)和④Toolchain default都不会使用硬件FPU,在应用程序中遇到浮点数计算时,将使用CM4 CPU内核的整数指令通过软件库的方式实现;