概 述
有些應(yīng)用要求MCU能高效處理,特別是跑一些算法時(shí),對(duì)CPU執(zhí)行效率要求較高。
網(wǎng)上有很多文章說STM32Cube HAL執(zhí)行效率不高,代碼量大等問題 ,導(dǎo)致很多還沒有入門,或初學(xué)的讀者就產(chǎn)生各種各樣的疑惑。
說實(shí)話,HAL相對(duì)標(biāo)準(zhǔn)外設(shè)庫來說確實(shí)存在代碼效率不高、代碼量大燈這些問題,那么與之對(duì)應(yīng)的STM32Cube LL恰好避免了這樣的問題。
LL能高效的原因
簡(jiǎn)單總結(jié)一下原因: 巧妙運(yùn)用C語言靜態(tài)、內(nèi)聯(lián)函數(shù)直接操作寄存器 。
當(dāng)然,這是其中重要的原因,還有一些其它原因,這里暫不描述。
你會(huì)在LL庫.h文件中發(fā)現(xiàn)大量類似,靜態(tài)、內(nèi)聯(lián)函數(shù)直接讀寫寄存器的函數(shù)。
比如讀寫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
而讀寫位的定義:
這里面的 宏定義 ,在眾多外設(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è)庫使能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);
}
}
通過對(duì)比,你會(huì)明顯發(fā)現(xiàn): LL庫的執(zhí)行效率更高 。
什么是內(nèi)聯(lián)函數(shù)?
寫到這里,就可能有讀者會(huì)問:什么是內(nèi)聯(lián)函數(shù)?
內(nèi)聯(lián)函數(shù)是一種編程語言結(jié)構(gòu),用來建議編譯器對(duì)一些特殊函數(shù)進(jìn)行內(nèi)聯(lián)擴(kuò)展。
通常,程序執(zhí)行時(shí),處理器從內(nèi)存中讀取代碼執(zhí)行。 當(dāng)程序中調(diào)用一個(gè)函數(shù)時(shí),程序跳到存儲(chǔ)器中保存函數(shù)的位置 ,開始讀取代碼執(zhí)行,執(zhí)行完后再返回。
為了提高速度,C語言定義了inline函數(shù),告訴編譯器把函數(shù)代碼在編譯時(shí) 直接拷貝到程序中 ,這樣就不用執(zhí)行時(shí)另外讀取函數(shù)代碼。
**提示:**當(dāng)內(nèi)聯(lián)函數(shù)很大時(shí),會(huì)有相反的作用,因此一般比較小的函數(shù)才使用內(nèi)聯(lián)函數(shù)。
軟件框架思維
LL之所以高效,是因?yàn)樗擅钸\(yùn)用了一些C語言知識(shí),沒有太多封裝,直接或間接對(duì)寄存器進(jìn)行操作。
而能這樣實(shí)現(xiàn), 歸功于ST開發(fā)團(tuán)隊(duì)設(shè)計(jì)了這么一個(gè)中間層軟件框架 。
對(duì)于有大型項(xiàng)目開發(fā)經(jīng)驗(yàn)的人來說,一個(gè)項(xiàng)目的框架對(duì)整個(gè)項(xiàng)目影響很大。
就好比你建一棟樓,如果樓層框架都沒造好,你覺得這棟樓質(zhì)量會(huì)好嗎?
所以,這里就提到,我們編程時(shí),特別項(xiàng)目較大,需要考慮一下軟件框架,一個(gè)好的框架能讓你的項(xiàng)目達(dá)到事半功倍的效果。
-
STM32
+關(guān)注
關(guān)注
2264文章
10854瀏覽量
354305 -
C語言
+關(guān)注
關(guān)注
180文章
7595瀏覽量
135871 -
GPIO
+關(guān)注
關(guān)注
16文章
1189瀏覽量
51837 -
USART串口
+關(guān)注
關(guān)注
0文章
32瀏覽量
6796 -
HAL庫
+關(guān)注
關(guān)注
1文章
114瀏覽量
6144
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論