我造轮子,你造车,创客一起造起来!塔克创新资讯【塔克社区 www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/

    

本文介绍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,建议在后续工程中开启硬件浮点,综合计算能力提升较大。

玩转X-CTR100 l STM32F4 l FPU单精度浮点性能测试的更多相关文章

  1. 玩转X-CTR100 l STM32F4 l ADC 模拟数字转换

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 AD转换接 ...

  2. 玩转X-CTR100 l STM32F4 l MPU6050加速度陀螺仪传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 板载加速度 ...

  3. 玩转X-CTR100 l STM32F4 l DSP指令集性能测试

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 DSP库的 ...

  4. 玩转X-CTR100 l STM32F4 l X-CTR100与树莓派搭建机器人平台

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器与树莓派Linux系统 ...

  5. 玩转X-CTR100 l STM32F4 l 舵机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器的舵机控制,X-CTR ...

  6. 玩转X-CTR100 l STM32F4 l DRV8825 A4988 步进电机控制

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器控制步进电机 ...

  7. 玩转X-CTR100 l STM32F4 l 基础例程printf、LED、蜂鸣器、拨码开关、位带操作

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器基础板载资源 ...

  8. 玩转X-CTR100 l STM32F4 l PS2无线手柄

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] SONY的PS2无线手柄是索尼游戏机的遥控手柄,控制 ...

  9. 玩转X-CTR100 l STM32F4 l RNG硬件随机数发生器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 STM32F4硬件随 ...

随机推荐

  1. Lab 5-1

    Analyze the malware found in the file Lab05-01.dll using only IDA Pro. The goal of this lab is to gi ...

  2. android -------- 混淆打包报错(warning - InnerClass annotations are missing corresponding EnclosingMember annotations)

    最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations ...

  3. python记录_day07

    一.基本数据类型补充 1.列表的拼接用join()方法 li = ["hello","world"] s = "_".join(li) pr ...

  4. GPLT L2-014 列车调度

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805063166312448 分析:明显从右到左列车的序号需要依 ...

  5. Mac OS下安装和配置MongoDB

    安装和配置教程: 参考地址:https://blog.csdn.net/yibowanbo/article/details/80233030 可视化管理工具: 地址:https://blog.csdn ...

  6. C++笔试题总结

    1.C和C++的特点与区别? 答:(1)C语言特点:1.作为一种面向过程的结构化语言,易于调试和维护: 2.表现能力和处理能力极强,可以直接访问内存的物理地址: 3.C语言实现了对硬件的编程操作,也适 ...

  7. Windows下Python3.6安装第三方模块

    一 安装pip 一般需要用pip进行安装,不过我安装p3.6的时候pip已经有了. 如果没有的话,可以用在以下http://www.lfd.uci.edu/~gohlke/pythonlibs/#pi ...

  8. 2017-6-6&6-8/大型网站架构总结

    一.WikiPedia(维基百科) WikiPedia是非盈利网站,因此尽可能地使用免费的软件和廉价的服务器.截止到2012年,这个只有区区数百台服务器和十余个技术人员开发.维护的网站,成为流量全球排 ...

  9. IO多路复用和协程

    1.IO多路复用 作用:检测多个socket是否已经发生变化(是否连接成功/是否已经获取数据) 什么是进程.线程.协程以及它们的区别? 进程是资源分配的最小单元,其作用是进行数据隔离, 线程是cpu调 ...

  10. [NOIP 2015TG D2T3] 运输计划

    题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...