stm32h743单片机嵌入式学习笔记7-FPU
* FPU 即浮點(diǎn)運(yùn)算單元(Float Point Unit)。浮點(diǎn)運(yùn)算,對(duì)于定點(diǎn) CPU(沒(méi)有 FPU 的 CPU)
來(lái)說(shuō)必須要按照 IEEE-754 標(biāo)準(zhǔn)的算法來(lái)完成運(yùn)算,是相當(dāng)耗費(fèi)時(shí)間的。而對(duì)于有 FPU 的 CPU
來(lái)說(shuō),浮點(diǎn)運(yùn)算則只是幾條指令的事情,速度相當(dāng)快
LDR.W R0, =0xE000ED88 ; 使能浮點(diǎn)運(yùn)算 CP10,CP11
LDR R1,[R0]
ORR R1,R1,#(0xF << 20)
STR R1,[R0]
DSB
此部分代碼是 Reset_Handler 函數(shù)的部分內(nèi)容(默認(rèn)就是有的,我們不需要修改和添加),功能就是設(shè)置 CPACR 寄存器的 20~23 位為1,以開(kāi)啟 STM32H743 的硬件 FPU 功能。
但是,僅僅開(kāi)啟硬件 FPU 是不夠的,我們還需要在編譯器上面,做一下設(shè)置,否則編譯器
遇到浮點(diǎn)運(yùn)算,還是采用傳統(tǒng)的方式(IEEE-754 標(biāo)準(zhǔn))完成運(yùn)算,不能體現(xiàn)硬件浮點(diǎn)運(yùn)算的優(yōu)
勢(shì)。這里,我們?cè)?MDK5 編譯器里面,點(diǎn)擊 按鈕,然后在 Target 選項(xiàng)卡里面,設(shè)置 Floating
Point Hardware 為 Double Precision,如圖 56.1.1.2 所示:(我估計(jì)這個(gè)過(guò)程,編譯器實(shí)際上就是在單片機(jī)程序里添加了定義了__FPU_USED這樣的一個(gè)宏,文章末尾我會(huì)講解一下hal庫(kù)函數(shù)工程確實(shí)就是這么回事)
這樣就成功開(kāi)啟了FPU,當(dāng)我們的程序中有浮點(diǎn)數(shù)計(jì)算的時(shí)候單片機(jī)就會(huì)自動(dòng)調(diào)用FPU硬件單元進(jìn)行計(jì)算了
經(jīng)過(guò)這個(gè)設(shè)置,編譯器遇到浮點(diǎn)運(yùn)算就會(huì)使用硬件 FPU 相關(guān)指令,執(zhí)行浮點(diǎn)運(yùn)算,從而大
大減少計(jì)算時(shí)間。
最后,總結(jié)下 STM32H743 硬件 FPU 使用的要點(diǎn):
1, 設(shè)置 CPACR 寄存器 bit20~23 為 1,使能硬件 FPU。
2, MDK 編譯器 Code Generation 里面設(shè)置:Double Precision。不需要在代碼里添加任何東西
經(jīng)過(guò)這兩步設(shè)置,我們的編寫(xiě)的浮點(diǎn)運(yùn)算代碼,即可使用 STM32H743 的硬件 FPU 了,可
以大大加快浮點(diǎn)運(yùn)算速度。
----------------------------------------------------------------------------------------------------------------------------------------------
hal庫(kù)函數(shù)工程:
我們?cè)?system_stm32h7xx_c 文件里面開(kāi)啟,代碼如下:
void SystemInit(void)
{
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */
#endif
……//省略部分代碼
}
此部分代碼是系統(tǒng)初始化函數(shù)的部分內(nèi)容,功能就是設(shè)置 CPACR 寄存器的 20~23 位為 1,
以開(kāi)啟 STMH32H7 的硬件 FPU 功能。從程序可以看出,只要我們定義了全局宏定義標(biāo)識(shí)符
__FPU_PRESENT 以及__FPU_USED 為 1,那么就可以開(kāi)啟硬件 FPU。其中宏定義標(biāo)識(shí)符
__FPU_PRESENT 用來(lái)確定處理器是否帶 FPU 功能,標(biāo)識(shí)符__FPU_USED 用來(lái)確定是否開(kāi)啟
FPU 功能。
實(shí)際上,因?yàn)?H7 是帶 FPU 功能的,所以在我們的 stm32h743xx.h 頭文件里面,我們默認(rèn)
是定義了__FPU_PRESENT 為 1。大家可以打開(kāi)文件搜索即可找到下面一行代碼:
#define __FPU_PRESENT 1
但是,僅僅只是說(shuō)明處理器有 FPU 功能是不夠的,我們還需要開(kāi)啟 FPU 功能。開(kāi)啟 FPU
有兩種方法,第一種是直接在頭文件 STM32h743xx.h 中定義宏定義標(biāo)識(shí)符__FPU_USED 的值為
1。也可以直接在 MDK 編譯器上面設(shè)置,我們?cè)?MDK5 編譯器里面,點(diǎn)擊 按鈕,然后在 Target
選項(xiàng)卡里面,設(shè)置 Floating Point Hardware 為 Use Double Precision
經(jīng)過(guò)這個(gè)設(shè)置,編譯器會(huì)自動(dòng)加入標(biāo)識(shí)符__FPU_USED 為 1。這樣遇到浮點(diǎn)運(yùn)算就會(huì)使用
硬件 FPU 相關(guān)指令,執(zhí)行浮點(diǎn)運(yùn)算,從而大大減少計(jì)算時(shí)間。
?
通過(guò)實(shí)驗(yàn)對(duì)比發(fā)現(xiàn),使用硬件 FPU 和不使用硬件 FPU 對(duì)比,同樣的條件下,硬件 FPU 快了近
16 倍,充分體現(xiàn)了 STM32H743 硬件 FPU 的優(yōu)勢(shì)
?
總結(jié)
以上是生活随笔為你收集整理的stm32h743单片机嵌入式学习笔记7-FPU的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 移动安全--37--说说Android软
- 下一篇: 有一千万资产能被称为富二代吗?