博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
玩转X-CTR100 l STM32F4 l FPU单精度浮点性能测试
阅读量:5739 次
发布时间:2019-06-18

本文共 1877 字,大约阅读时间需要 6 分钟。

我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 】【塔克博客 】

    

本文介绍X-CTR100控制器如何开启STM32F4的硬件FPU,并对比使用硬件FPU和不使用硬件FPU的速度差别。

原理

FPU即浮点运算单元(Float Point Unit),浮点运算,对于定点CPU(没有FPU的CPU)来说必须要按照IEEE-754标准的算法来完成运算,是相当耗费时间的。而对于有FPU的CPU来说,浮点运算则只是几条指令的事情,速度相当快。

浮点运算一直是定点CPU的难题,比如一个简单的1.1+1.1,定点CPU必须要按照IEEE-754标准的算法来完成运算,对于8位单片机来说已经完全是噩梦,对32为单片机来说也不会有多大改善。虽然将浮点数进行Q化处理能充分发挥32位单片机的运算性能,但是精度受到限制而不会太高。对于有FPU(浮点运算单元)的单片机或者CPU来说,浮点加法只是几条指令的事情。

STM32F4属于Cortex M4F架构,带有32位单精度硬件FPU,支持浮点指令集,相对于Cortex M0和Cortex M3等,高出数十倍甚至上百倍的运算性能。

STM32F4硬件上要开启FPU是很简单的,通过一个叫:协处理器控制寄存器(CPACR)的寄存器设置即可开启STM32F4的硬件FPU。

有网友测试FPU性能对比数据。

    

根据ST官方文档,采用Julia集对FPU进行测试时,性能提升为14.57倍。

本文采用简单的重复乘法、除法方法测试,相同计算量测试计算时间。

例程

本例程通过计算重复乘法或除法,并测量计算时间,间接测量FPU性能。

硬件说明

硬件资源:

  • 串口UART1

硬件连接:

使用MicroUSB数据线连接X-CTR100 COM接口。

软件说明

开启FPU,需要定义全局宏定义标识符__FPU_PRESENT以及__FPU_USED为1,__FPU_PRESENT用来确定处理器是否带FPU功能,标识符__FPU_USED用来确定是否开启FPU。

需要如下两步。

步骤一:__FPU_PRESENT

X-CTR100 处理器STM32F4是带FPU功能的,所以在我们的stm32f4xx.h头文件里面,我们默认是定义了__FPU_PRESENT为1。

打开文件搜索即可找到下面一行代码。

#define __FPU_PRESENT 1 /*!< FPU present */

步骤二:__FPU_USED

在MDK中做如下设置

    

测试代码如下,重复进行乘除计算,测量计算时间,时间越少性能越好。

int main(void)

{

    uint32_t i, tmp;

    float a = 1.24, b = 34.456, c = 0;

 

    /* X-CTR100初始化 */

    AX_Init(115200);

    printf("***X-CTR100 FPU硬件浮点-性能测试例程***\r\n\r\n");

 

    //模块初始化及配置

    AX_TIMER_TIM6_Init(1);

 

    while (1)

    {

        //乘法测试

        AX_TIMER_TIM6_SetCounter(0);

        for (i = 0; i<20000; i++)

        {

            c = a*b;

            //防止编译器优化掉

            if (c> 0)

                a = c;

        }

        tmp = AX_TIMER_TIM6_GetCountert();

        printf("乘法计算时间:%d us | ", tmp);

 

        //除法测试

        AX_TIMER_TIM6_SetCounter(0);

        for (i = 0; i<20000; i++)

        {

            c = b / a;

            //防止编译器优化掉

            if (c> 0)

                a = c;

        }

        tmp = AX_TIMER_TIM6_GetCountert();

        printf("除法计算时间:%d us \r\n ", tmp);

 

        AX_Delayms(1000);

        AX_LEDG_Toggle();

    }

}

实现效果

首先上述方法开启FPU,测试性能,X工程模板默认开启FPU。

再次通过MDK设置页面关闭FPU功能,重新编译代码,测试性能。

测试结果如下图,乘法提升约5.7倍,除法提升约10.3倍。

    

总结

通过本文学习,可以了解FPU的开启方法,并通过实际实验了解FPU性能提升。

X工程模板默认开启FPU,建议在后续工程中开启硬件浮点,综合计算能力提升较大。

转载于:https://www.cnblogs.com/xtark/p/9369684.html

你可能感兴趣的文章
PHP json_encode() 函数介绍
查看>>
js动态设置元素高度
查看>>
Ossim下的安全合规管理
查看>>
DelphiWebMVC框架下BPL热部署实现
查看>>
C++与MySQL的冲突
查看>>
siki学习之观察者模式笔记
查看>>
PYQT窗口可视化编程
查看>>
单元测试
查看>>
spring.net 继承
查看>>
ES6:模块简单解释
查看>>
JavaScript indexOf() 方法
查看>>
用Bootstrap写一份简历
查看>>
ZJU PAT 1023
查看>>
WMI远程访问问题解决方法
查看>>
从零开始学习IOS,(UILabel控件)详细使用和特殊效果
查看>>
Android开发历程_15(AppWidget的使用)
查看>>
阿花宝宝 Java 笔记 之 初识java
查看>>
7、设计模式-创建型模式-建造者模式
查看>>
Cesium官方教程11--建模人员必读
查看>>
我国古代的勾股定理
查看>>