前言
ST已經推出了三種庫函數,以方便客戶快速開發STM32系列MCU。從最早的標準外設驅動庫,到后來的Cube HAL,再到Cube LL以及直接操作寄存器。這幾種庫的代碼效率到底如何呢?本文將針對這個問題進行粗略分析,并提供對比數據供大家參考。
問題分析
我們以GPIO翻轉、TIM PWM 輸出、ADCDMA 數據采集和DMA M2M這四個常用功能,通過不同的庫函數來實現相同功能,最終來對比各個庫函數的性能。四個工程代碼的內容簡述如下:
GPIO翻轉:切換GPIO的輸出電平,其中包含了系統時鐘初始化和GPIO翻轉的代碼。TIM PWM輸出:通過TIM1 的通道1輸出頻率是36KHz的PWM,循環修改其占空比從25%到50%,其中包含了系統時鐘初始化、TIM1的初始化和切換占空比的代碼。ADC DMA數據采集:通過ADC的模擬通道1,采集100次ADC的結果,并使用DMA傳輸到到用戶緩沖區,其中包含了系統時鐘初始化、ADC初始化和DMA的初始化的代碼。DMA M2M:使用DMA1的通道1,從Flash中傳輸100字節的數據到片內的SRAM中。其中包含了系統時鐘的初始化和DMA的初始化代碼。
主要對比三個參數:Flash占用量、SRAM占用量和執行代碼的效率。
Flash和SRAM的占用量可以通過查看IAR生成的*.map文件了解到。
在*.map文件中,會有如上圖的內容,其中的readonly code memory加上readonly data memory的和,就是Flash的占用量。而Readwrite data memory的大小即為SRAM的占用量。那么上圖所示的Flash占用量即為3204=3174+30,SRAM占用量即為1032。因用戶堆(Cstack)我們設置的為1024,所以真正應用代碼所占用的SRAM量為8=1032-1024.
代碼的運行效率部分,我們是通過IAR提供的內核運行周期數(CYCLECONTER)來計算的。在功能函數的開始處和結束處分別設置斷點,兩次內核運行周期數的差值,就是此處代碼的運行周期。
測試硬件選用了Nucleo-F302評估板。
軟件環境和庫函數詳情如下:
? IAR V7.60
? Optimizations Level High (Size)
? STM32CubeMX V4.17
? Create Project with Copy the necessary libraryfiles
? STM32CubeF3 V1.60
? STM32F30x_DSP_StdPeriph_Lib_V1.2.3
? STM32F3xx CMSIS V2.3.0
測試結果如下:[手機模式下圖片可點擊放大觀看]
總體來看,代碼效率與代碼的兼容性及可移植性成反比的規律是明顯的。Cube LL庫的效率明顯優于HAL庫的,幾乎和直接寫寄存器的效率相差無幾。HAL庫函數因為要顧及整個STM32系列間的代碼高度兼容與可移植性,代碼相對龐大。對于剛接觸STM32的人來說,非常易于上手做些基本的評估和驗證,入門快捷。LL庫的出現,是對HAL庫的有力補充。相比HAL庫用戶,LL庫用戶需要對MCU及相應外設有更為細致的了解。
目前,STM32cubeMX不但支持基于HAL庫的初始化文件的生成,也已支持基于LL庫的初始化文件及工程的生成,對于已經比較熟悉STM32應用或關注代碼效率的開發人員來說,可以優先考慮使用LL庫。
順便介紹在STM32CubeMx的圖形化界面下,如何選擇使用HAL庫還是LL庫生成初始化文件及相應工程。
在CubeMx界面下,做好各個外設的選擇及配置后,在ProjectProject SettingAdvanced Settiing如下圖示界面上,你可以選擇要使用的庫類型:HAL/LL.
另外,偶爾人詢問及LL庫在哪里,其實LL庫函數跟HAL庫函數是在同一目錄下。以STM32F4為例,你下載STM32CubeF4解壓后,在類似如下目錄可以看見HAL函數和LL函數庫文件。
。。。DriversSTM32F4xx_HAL_DriverSrc
-
STM32
+關注
關注
2270文章
10910瀏覽量
356599 -
庫函數
+關注
關注
0文章
177瀏覽量
33990
原文標題:基于不同STM32庫函數的代碼性能對比
文章出處:【微信號:STM32_STM8_MCU,微信公眾號:STM32單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論