玩轉X-CTR100 l STM32F4 l FPU單精度浮點性能測試


我造輪子,你造車,創客一起造起來!塔克創新資訊【塔克社區 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,建議在后續工程中開啟硬件浮點,綜合計算能力提升較大。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM