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