STM32的標準外設庫、HAL、LL軟件庫,都有很多巧妙之處值得大家借鑒。
今天講講STM32Cbue LL庫中巧妙運用“靜態內聯”使代碼更高效。
1、寫在前面
有些應用要求MCU能高效處理,特別是跑一些算法時,對CPU執行效率要求較高。
網上有很多文章說STM32Cube HAL執行效率不高,代碼量大等問題,導致很多還沒有入門,或初學的讀者就產生各種各樣的疑惑。
說實話,HAL相對標準外設庫來說確實存在代碼效率不高、代碼量大燈這些問題,那么與之對應的STM32Cube LL恰好避免了這樣的問題。
2、LL能高效的原因
簡單總結一下原因:巧妙運用C語言靜態、內聯函數直接操作寄存器。
當然,這是其中重要的原因,還有一些其它原因,這里暫不描述。
你會在LL庫.h文件中發現大量類似,靜態、內聯函數直接讀寫寄存器的函數。
比如讀寫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,就是靜態、內聯:
#define __STATIC_INLINE static __inline
而讀寫位的定義:
這里面的宏定義,在眾多外設.h中都在調用。比如使能USART:
LL庫使能USART:
__STATIC_INLINE void LL_USART_Enable(USART_TypeDef *USARTx) { SET_BIT(USARTx->CR1, USART_CR1_UE); }
標準外設庫使能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); } }
通過對比,你會明顯發現:LL庫的執行效率更高。
3、什么是內聯函數
寫到這里,就可能有讀者會問:什么是內聯函數?
內聯函數是一種編程語言結構,用來建議編譯器對一些特殊函數進行內聯擴展。(---來自百度百科)
通常,程序執行時,處理器從內存中讀取代碼執行。當程序中調用一個函數時,程序跳到存儲器中保存函數的位置,開始讀取代碼執行,執行完后再返回。
為了提高速度,C語言定義了inline函數,告訴編譯器把函數代碼在編譯時直接拷貝到程序中,這樣就不用執行時另外讀取函數代碼。
提示:
當內聯函數很大時,會有相反的作用,因此一般比較小的函數才使用內聯函數。
4、軟件框架思維
LL之所以高效,是因為它巧妙運用了一些C語言知識,沒有太多封裝,直接或間接對寄存器進行操作。
而能這樣實現,歸功于ST開發團隊設計了這么一個中間層軟件框架。
對于有大型項目開發經驗的人來說,一個項目的框架對整個項目影響很大。
就好比你建一棟樓,如果樓層框架都沒造好,你覺得這棟樓質量會好嗎?
所以,這里就提到,我們編程時,特別項目較大,需要考慮一下軟件框架,一個好的框架能讓你你的項目達到事半功倍的效果。
來源:嵌入式專欄
審核編輯:湯梓紅
-
mcu
+關注
關注
146文章
17964瀏覽量
366433 -
cpu
+關注
關注
68文章
11075瀏覽量
216979 -
C語言
+關注
關注
180文章
7632瀏覽量
141593
發布評論請先 登錄
STM32四種庫對比 STM32標準庫和HAL庫有什么不同?

STM32四種庫對比:寄存器、標準外設庫、HAL、LL

STM32Cube學習一——簡介、工程建立、代碼輸出

UM2123_用于STM32Cube的X-CUBE-MEMS1擴展板的osxMotionAW手腕動作識別庫入門

DB3161 STM32WB系列的STM32Cube嵌入式軟件,包括LL/HAL驅動、Bluetooth? 5、Mesh V1.0、Zigbee和Thread?庫、RTOS、觸摸感應等

STM32Cube X-CUBE-MEMS1擴展的MotionGR實時手勢識別庫入門

評論