0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32 LL庫為什么比HAL庫高效呢?

冬至子 ? 來源:strongerHuang ? 作者:strongerHuang ? 2023-10-26 16:42 ? 次閱讀

概 述

有些應(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á)到事半功倍的效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 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
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32標(biāo)準(zhǔn)、HALLL介紹

    我們?cè)谶M(jìn)行STM32開發(fā)的時(shí)候,使用寄存器進(jìn)行開發(fā)的終究是少數(shù),大多數(shù)人還是習(xí)慣用庫函數(shù)進(jìn)行開發(fā)。到目前為止,有標(biāo)準(zhǔn)外設(shè)、HAL、LL
    發(fā)表于 06-21 15:13 ?1.3w次閱讀
    <b class='flag-5'>STM32</b>標(biāo)準(zhǔn)<b class='flag-5'>庫</b>、<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>和<b class='flag-5'>LL</b><b class='flag-5'>庫</b>介紹

    STM32四種對(duì)比 STM32標(biāo)準(zhǔn)HAL有什么不同?

    STM32的四種STM32Snippets、Standard Peripheral Library、STM32Cube LL、
    發(fā)表于 08-24 09:45 ?1.4w次閱讀
    <b class='flag-5'>STM32</b>四種<b class='flag-5'>庫</b>對(duì)比 <b class='flag-5'>STM32</b>標(biāo)準(zhǔn)<b class='flag-5'>庫</b>和<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>有什么不同?

    STM32HAL、標(biāo)準(zhǔn)外設(shè)LLSTM32 Embedded Software)

    STM32 Embedded Software??工作以來一直使用ST的STM32系列芯片,ST為開發(fā)者提供了非常方便的開發(fā)。到目前為止,有標(biāo)準(zhǔn)外設(shè)(STD
    發(fā)表于 07-03 15:02

    STM32 LL使用指南

    STM32 LL使用指南
    發(fā)表于 01-23 17:31 ?225次下載

    STM32HALLL能共同使用(混用)嗎?

    STM32HALLL能共同使用(混用)嗎?
    的頭像 發(fā)表于 02-28 16:57 ?1.4w次閱讀

    講講開發(fā)STM32的四種

    1.我是選擇寄存器開發(fā)STM32,還是標(biāo)準(zhǔn)外設(shè)? 2.你有STM32L0標(biāo)準(zhǔn)外設(shè)嗎? 3.HA
    的頭像 發(fā)表于 02-10 10:16 ?1w次閱讀
    講講開發(fā)<b class='flag-5'>STM32</b>的四種<b class='flag-5'>庫</b>

    STM32四種對(duì)比:寄存器、標(biāo)準(zhǔn)外設(shè)、HALLL

    1.我是選擇寄存器開發(fā)STM32,還是標(biāo)準(zhǔn)外設(shè)? 2.你有STM32L0標(biāo)準(zhǔn)外設(shè)嗎? 3.HAL
    發(fā)表于 03-05 06:17 ?50次下載
    <b class='flag-5'>STM32</b>四種<b class='flag-5'>庫</b>對(duì)比:寄存器、標(biāo)準(zhǔn)外設(shè)<b class='flag-5'>庫</b>、<b class='flag-5'>HAL</b>、<b class='flag-5'>LL</b>

    LL串口+DMA

    由于工作中測(cè)試發(fā)現(xiàn)串口傳輸數(shù)據(jù)延時(shí)有點(diǎn)大,傳輸35個(gè)字節(jié),115200,理論值應(yīng)該在3ms左右,然而實(shí)際測(cè)試卻有40ms,所以首先想到會(huì)不會(huì)是hal執(zhí)行效率低得原因,所以采用LL,
    發(fā)表于 12-27 19:31 ?19次下載
    <b class='flag-5'>LL</b><b class='flag-5'>庫</b>串口+DMA

    STM32Cbue LL中巧妙運(yùn)用“靜態(tài)內(nèi)聯(lián)”

    STM32的標(biāo)準(zhǔn)外設(shè)HAL、LL軟件,都有很多巧妙之處值得大家借鑒。 今天講講STM32
    發(fā)表于 08-14 14:30 ?1124次閱讀

    stm32 hal資料分享

    stm32 hal資料分享
    發(fā)表于 11-03 16:17 ?118次下載

    STM32HAL知識(shí)總結(jié)

    ST 為開發(fā)者提供了非常方便的開發(fā):有標(biāo)準(zhǔn)外設(shè)(SPL)、HAL (Hardware Abstraction Layer,硬件抽象層
    的頭像 發(fā)表于 01-14 11:37 ?2636次閱讀
    <b class='flag-5'>STM32</b>的<b class='flag-5'>HAL</b><b class='flag-5'>庫</b>知識(shí)總結(jié)

    STM32 HAL的功能和使用方法 STM32 HAL和標(biāo)準(zhǔn)的區(qū)別

    和可維護(hù)性,從而節(jié)省開發(fā)成本和時(shí)間。STM32 HALSTM32系列芯片的HAL,由ST公
    發(fā)表于 08-08 18:21 ?4001次閱讀

    STM32Cube LL的巧妙之處

    STM32Cube LL的巧妙之處
    的頭像 發(fā)表于 09-27 16:26 ?1334次閱讀
    <b class='flag-5'>STM32</b>Cube <b class='flag-5'>LL</b><b class='flag-5'>庫</b>的巧妙之處

    STM32 HAL串口收發(fā)是如何使用的?

    STM32 HAL串口收發(fā)是如何使用的? STM32是一款高性能的微控制器,它擁有廣泛的應(yīng)用領(lǐng)域,其中包括了各種通訊應(yīng)用,如UART串口通訊。HA
    的頭像 發(fā)表于 10-26 17:42 ?1154次閱讀

    STM32HALLL到底能不能混合使用?

    STM32HALLL到底能不能混合使用? STM32
    的頭像 發(fā)表于 10-26 17:42 ?1420次閱讀