關(guān)于應(yīng)用航順芯片HK32F030延時(shí)效率問(wèn)題
客戶在應(yīng)用程序中可能存在死等延時(shí)的處理函數(shù)(用for或者do…while)。 對(duì)比ST同樣的函數(shù)HK的芯片出現(xiàn)延時(shí)比ST慢,是因?yàn)镠K的芯片在cpu和flash之間有一個(gè)4個(gè)word大小(編號(hào)為00,04,08,0c)的指令緩存,工程編譯之后,如果函數(shù)被存放到flash的地址的尾地址沒(méi)有從0開(kāi)始的話,(比如函數(shù)的入口地址為0x08000004,會(huì)被放到編號(hào)04的字中,而不是編號(hào)0中),就會(huì)出現(xiàn)執(zhí)行效率低的問(wèn)題。如何避免這種問(wèn)題呢?
我們?cè)贖K030/031/04A的應(yīng)用筆記中有指導(dǎo)說(shuō)明,今天在這里用一個(gè)例子詳細(xì)說(shuō)明修改方法:
比如用戶使用uint32_tGItimer=1000000;voidDelayTimer(void){uint32_t i;for(i=0;i<GItimer;i++){ i=i;}}這樣工程編譯后放在flash ROM空間不同位置,尤其是超過(guò)32K后容易表現(xiàn)出來(lái)延時(shí)不同。為了解決這種因程序尾地址不同造成命令預(yù)取指不同而影響指令執(zhí)行效率問(wèn)題,把延時(shí)程序修改成如下方式可以避免上述現(xiàn)象。
修改如下:voidDelayTimer(void){ uint32_t i; FLASH->ACR&= ~(0x00000010); for(i=0;i<GItimer;i++) { __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); __nop(); } FLASH->ACR |= 0x00000010; }這樣修改后,就可以使調(diào)用函數(shù)延時(shí)指令執(zhí)行效率與ST一樣。因此用戶在使用030/031/04A做開(kāi)發(fā)時(shí)如果程序中存在這樣死等待的延時(shí)函數(shù),如果在時(shí)效上想與ST接近,建議采用這種方式修改。
如需要了解更多航順MCU產(chǎn)品,請(qǐng)聯(lián)系航順核心代理商,穎特新科技,或者掃碼聯(lián)系我們!
在之前的介紹中,我們也為大家介紹了《航順代理:HK32F103進(jìn)空閑中斷的解決方法》,也是目前我們主推的非常成熟的解決方案!
編輯:zzy 最后修改時(shí)間:2022-05-17