ST的庫(kù),有很多巧妙之處,值得大家借鑒。今天就來(lái)講講STM32Cbue LL庫(kù)中的一點(diǎn)小知識(shí)。
1寫(xiě)在前面
有些應(yīng)用要求MCU能高效處理,特別是跑一些算法時(shí),對(duì)CPU執(zhí)行效率這一塊有要求。
網(wǎng)上有很多文章說(shuō)STM32CubeHAL執(zhí)行效率不高,代碼量大等問(wèn)題,導(dǎo)致很多沒(méi)入門(mén),或初學(xué)的朋友產(chǎn)生各種各樣的疑惑。
承認(rèn),HAL相對(duì)來(lái)說(shuō)有這些問(wèn)題,那么與之對(duì)應(yīng)的STM32CubeLL恰好避免了這樣的問(wèn)題。
2LL能高效的原因
簡(jiǎn)單總結(jié)一下原因:巧妙運(yùn)用C語(yǔ)言靜態(tài)的,內(nèi)聯(lián)函數(shù)直接操作寄存器。
當(dāng)然,這是其中重要的原因,還有一些其它原因,這里不描述。
你會(huì)在LL庫(kù).h文件中發(fā)現(xiàn)大量類似,靜態(tài),內(nèi)聯(lián)函數(shù)直接讀寫(xiě)寄存器的函數(shù)。
比如:讀寫(xiě)IO口
__STATIC_INLINE uint32_t LL_GPIO_ReadOutputPort(GPIO_TypeDef *GPIOx){ return (uint32_t)(READ_REG(GPIOx->ODR));} __STATIC_INLINE void LL_GPIO_SetOutputPin(GPIO_TypeDef *GPIOx, uint32_t PinMask){ WRITE_REG(GPIOx->BSRR, (PinMask >> GPIO_PIN_MASK_POS) & 0x0000FFFFU);}
其中__STATIC_INLINE,就是靜態(tài)、內(nèi)聯(lián):
#define __STATIC_INLINE static __inline
而讀寫(xiě)位的定義:
這里面的紅定義,在眾多外設(shè).h中都在調(diào)用。比如使能USART:
LL使能USART:
__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx){ SET_BIT(USARTx->CR1, USART_CR1_UE);}
標(biāo)準(zhǔn)外設(shè)庫(kù)使能USART:
void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState){ /* Check the parameters */ assert_param(IS_USART_ALL_PERIPH(USARTx)); assert_param(IS_FUNCTIONAL_STATE(NewState)); if (NewState != DISABLE) { /* Enable the selected USART by setting the UE bit in the CR1 register */ USARTx->CR1 |= USART_CR1_UE; } else { /* Disable the selected USART by clearing the UE bit in the CR1 register */ USARTx->CR1 &= (uint16_t)~((uint16_t)USART_CR1_UE); }}
你會(huì)明顯發(fā)現(xiàn):LL庫(kù)的執(zhí)行效率更高。
3拓展:內(nèi)聯(lián)函數(shù)
寫(xiě)到這里,就順便復(fù)習(xí)一下內(nèi)聯(lián)函數(shù)。
內(nèi)聯(lián)函數(shù)是一種編程語(yǔ)言結(jié)構(gòu),用來(lái)建議編譯器對(duì)一些特殊函數(shù)進(jìn)行內(nèi)聯(lián)擴(kuò)展。 ---來(lái)自百度百科
通常,程序執(zhí)行時(shí),處理器從內(nèi)存中讀取代碼執(zhí)行。當(dāng)程序中調(diào)用一個(gè)函數(shù)時(shí),程序跳到存儲(chǔ)器中保存函數(shù)的位置,開(kāi)始讀取代碼執(zhí)行,執(zhí)行完后再返回。
為了提高速度,C語(yǔ)言定義了inline函數(shù),告訴編譯器把函數(shù)代碼在編譯時(shí)直接拷貝到程序中,這樣就不用執(zhí)行時(shí)另外讀取函數(shù)代碼。
提示:
當(dāng)內(nèi)聯(lián)函數(shù)很大時(shí),會(huì)有相反的作用,因此一般比較小的函數(shù)才使用內(nèi)聯(lián)函數(shù)。
4拓展:軟件框架思維
LL之所以高效,是因?yàn)樗擅钸\(yùn)用了一些C語(yǔ)言知識(shí),沒(méi)有太多封裝,直接或間接對(duì)寄存器進(jìn)行操作。
而能這樣實(shí)現(xiàn),歸功于ST開(kāi)發(fā)團(tuán)隊(duì)設(shè)計(jì)了這么一個(gè)中間層軟件框架。
對(duì)于有大型項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn)的人來(lái)說(shuō),一個(gè)項(xiàng)目的框架對(duì)整個(gè)項(xiàng)目影響很大。
就好比你建一棟樓,如果樓層框架都沒(méi)造好,你覺(jué)得這棟樓質(zhì)量會(huì)好嗎?
所以,這里就提到,我們編程時(shí),特別項(xiàng)目較大,需要考慮一下軟件框架,一個(gè)好的框架能讓你你的項(xiàng)目達(dá)到事半功倍的效果。
推薦閱讀:
1.LPTIM低功耗定時(shí)器有哪些獨(dú)特功能
2.STM32F1系列的DEBUG調(diào)試功能需要配置嗎?
5最后
我的知乎:strongerHuang
我的網(wǎng)站:www.strongerhuang.com
若覺(jué)得文章對(duì)你有幫助,隨手點(diǎn)“在看”、轉(zhuǎn)發(fā)分享,也是我繼續(xù)更新的動(dòng)力。
掃描下面二維碼、關(guān)注公眾號(hào),在底部菜單中查看更多精彩內(nèi)容!
長(zhǎng)按識(shí)別圖中二維碼關(guān)注
原文標(biāo)題:STM32Cube LL能高效的原因
文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
ST
+關(guān)注
關(guān)注
32文章
1176瀏覽量
130491 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
286瀏覽量
16249
發(fā)布評(píng)論請(qǐng)先 登錄
STM32CubeIDE報(bào)錯(cuò)的原因?
stm32cubeIDE使用malloc失敗是什么原因?
stm32cubeIDE使用malloc失敗是什么原因?
stm32cubeIDE使用malloc失敗的原因?
光伏電站運(yùn)維系統(tǒng)讓太陽(yáng)能發(fā)電更高效

stm32h7s78 rcc pll2時(shí)鐘使能失敗的原因?

儲(chǔ)能新風(fēng)口 儲(chǔ)能控制單元助力高效能量管理

基于STM32設(shè)計(jì)的大氣氣壓檢測(cè)裝置

電容儲(chǔ)能焊接技術(shù)的先進(jìn)控制器:實(shí)現(xiàn)高效精密焊接的新突破
STM32H503開(kāi)發(fā)(2)----STM32CubeProgrammer燒錄

評(píng)論