广州周立功单片机科技有限公司
再不认识Cortex-M4F的FPU,你就out啦
摘要:Cortex-M4内核采用扩展的单周期乘法累加(MAC)指令、优化的SIMD 运算、饱和运算指令和一个可选的单精度浮点单元(FPU),具有使用于数字信号控制市场的多种高效信号处理功能。
推送目的:与读者一同学习Cortex-M4F FPU简介。
是否原创:是
关键字:Cortex-M4F 、FPU、浮点
正文:
1.1.1 初识Cortex-M4F FPU
Cortex-M4内核基于ARMv7E-M架构,它在继承Cortex-M3内核优势上,采用扩展的单周期乘法累加(MAC)指令、优化的SIMD运算、饱和运算指令和一个可选的单精度浮点单元(FPU),具有使用于数字信号控制市场的多种高效信号处理功能。
集成FPU的Cortex-M4内核称为Cortex-M4F,本文将重点Cortex-M4F的FPU。
1.1.2 Cortex-M4F FPU强大的浮点运算能力
Cortex-M4F FPU支持单精度浮点数的加、减、乘、除、乘法累加(MAC)以及平方根等操作,符合IEEE 754标准。
下面对Cortex-M4、M4F和M3之间的浮点运算能力进行一个简单的测试,结果如下图所示。
上述测试的C语言代码如下:
i = 10000;
/* 此处为翻转IO代码*/
while (i--) {
/* 此处为运算公式,分别为:*/
/* fA = fB + fC; */
/* fA = fB - fC; */
/* fA = fB * fC; */
/* fA = fB / fC; */
/* arm_sqrt_f32(fA , &fB); */
}
/* 此处为翻转IO代码*/
上图的数据是while()循环除以10000所得到的的每次运算时间。从图中可以看到,M4F 由于具有FPU,浮点运算能力是最好的,而不带FPU的M4以及M3使用的是CMSIS的数学运算库,每个浮点运算都需要几十条或更多的定点指令来实现,因此浮点运算速度显然大不如M4F。
值得一提的是,上述测试的时间还包含了与运算无关的指令时间(如数据的加载和保存等),因此几个内核浮点运算能力的差距要打一定的折扣,实际应用中M4F的优势会更明显。下面就通过一个FFT运算来对几个内核的浮点综合运算能力进行对比。
综合测试使用的是Matlab生成的32点FFT代码,数据使用的是单精度浮点数据,测试结果如下。
为了更深入了解M4F的浮点运算能力,我们来近距离观察一下FPU的浮点指令,FPU 部分指令说明如下表所示。
FPU的浮点指令集很好地支持了需要高精度运算的应用,融合乘法累加(Fused MAC)指令在乘法阶段保留精度,到了加法阶段才对结果进行四舍五入,可以使运算获得更高的精度。
另外,M4F还支持硬件浮点平方根指令,不单运算速度得到很大提高,而且代码长度也大大缩短。
代码转换1.1.3 简便快捷的使用方式
Cortex-M4通过一系列出的软件工具和Cortex微控制器软件接口标准(CMSIS)使信号处理算法开发变得十分容易。下面就以常用的开发软件IAR为例,介绍如何使用Cortex-M4F强大的FPU。
1. 在“Project->Option->General Options->Library Configuration”中,勾选使用CMSIS。
2. 在“Project->Option->General Options->Target”中,选择使用FPU。
3. 在工程中作如下宏定义(也可以在开发环境中预定义)。
#define ARM_MA TH_CM4
#define __FPU_PRESENT 1
完成这3个步骤之后,只要在工程中包含“arm_math.h”,那么就可以轻松使用该头文件中的浮点数学库了。例如,平方根运算,只要调用“arm_math.h”里面的arm_sqrt_f32()函数即可使用FPU的浮点平方根
指令。另外,普通的浮点运算(例如加、减、乘、除)编译器会自动使用浮点指令实现。
Keil开发环境使用FPU的方式与IAR类似,所不同的是,IAR编译器会自动生成使能FPU的代码(main函数之前),但是Keil不会自动生成(笔者使用的是Keil 4.53,新版本不确定会不会自动生成),所以使用Keil开发环境时,用户还需要在启动代码中加入一小段启动PFU的代码,C语言格式如下所示。
#define __OS_FPU_CPACR (*((INT32U *)(0xE000ED88))) /* 协处理器访问控制寄存器*/ /*
* 使能CP10和CP11协处理器
*/
__OS_FPU_CPACR |= (0x0F << 20u);
汇编格式如下:
;CPACR的地址是0xE000ED88
LDR.W R0, =0xE000ED88
;读取CPACR
LDR R1, [R0]
;置位CPACR的20~23位以使能CP10和CP11协处理器
ORR R1, R1, #(0xF << 20)
;写CPACR
STR R1, [R0]
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论