打印
[信息]

【实战经验】关于ST库函数的代码性能对比

[复制链接]
2783|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-14 14:24 编辑

关于ST库函数的代码性能对比


前言
ST已经推出了三种库函数,用以方便客户快速开发STM32系列的MCU。从最早的标准外设驱动库,到后来的Cube HAL,再到 Cube LL,还有直接写寄存器。这几种库的代码效率到底如何呢?本文将针对这个问题进行分析和对比,最后提供对比数据供大家参考。

问题分析
我们以GPIO翻转、TIM PWM 输出、ADC DMA 数据采集和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 library files
    • STM32CubeF3 V1.60
    • STM32F30x_DSP_StdPeriph_Lib_V1.2.3
    • STM32F3xx CMSIS V2.3.0
测试结果如下:

总结:
总体来看,代码效率与移植性成反比的规律是明显的。但与Cube HAL相比, Cube LL的效率优势还是很明显的,几乎和直接写寄存器的效率相差无几。而且目前STM32cubeMX已经开始支持直接生成使用Cube LL的工程,对于以后追求效率的开发应用人员来说,非常值得推荐给大家使用。


对应PDF和代码:STM32 库函数性能对比
更多实战经验请看:【ST MCU实战经验汇总贴】

沙发
mmuuss586| | 2016-11-17 13:48 | 只看该作者
不错;

使用特权

评论回复
板凳
1223657347| | 2016-11-17 15:40 | 只看该作者
很不错啊

使用特权

评论回复
地板
frognidie| | 2016-11-18 08:48 | 只看该作者
Cube LL 是啥啊

使用特权

评论回复
5
frognidie| | 2016-11-18 09:18 | 只看该作者
有示例代码吗?

使用特权

评论回复
6
wind~风| | 2016-11-18 09:48 | 只看该作者

请教一下CUBE直接生成LL工程师怎么做的

使用特权

评论回复
7
whtwhtw| | 2016-11-18 11:11 | 只看该作者
同问

使用特权

评论回复
8
whtwhtw| | 2016-11-18 11:23 | 只看该作者

LL库是HAL库自带的底层库函数,可以单独使用也可以和HAL库混用,其目的是使编制控制程序更精简。其代码量和执行效率介于HAL库和操作寄存器之间

使用特权

评论回复
9
whtwhtw| | 2016-11-18 11:24 | 只看该作者
LL库和HAL库在一个目录下,注意的话往下拉,在下面

使用特权

评论回复
10
justtest111| | 2016-11-18 13:13 | 只看该作者
HAL库效率这么差。。。

使用特权

评论回复
11
icecut| | 2016-11-18 13:22 | 只看该作者
justtest111 发表于 2016-11-18 13:13
HAL库效率这么差。。。

要是把以前的 stdlib 加进来评测估计更差

使用特权

评论回复
12
Ketose| | 2016-11-18 14:20 | 只看该作者
是不是以__HAL开头的就是 Cube LL?

使用特权

评论回复
13
whtwhtw| | 2016-11-18 14:45 | 只看该作者


如图_HAL结尾的都是HAL库,_LL结尾的都是LL库

使用特权

评论回复
14
frognidie| | 2016-12-1 10:17 | 只看该作者
whtwhtw 发表于 2016-11-18 14:45
如图_HAL结尾的都是HAL库,_LL结尾的都是LL库

我看了下最新的cube 1.7是有ll 库函数的,但是没找到示例啊?

使用特权

评论回复
15
whtwhtw| | 2016-12-1 10:45 | 只看该作者
嗯,那些大神都自用,或者用寄存器,不会上实例。小虾都不会用

使用特权

评论回复
16
myxiaonia| | 2016-12-1 13:17 | 只看该作者
寄存器操作 果然神器

使用特权

评论回复
17
我听闻| | 2016-12-2 13:48 | 只看该作者
感觉 stm32cubemx 并没有什么太大的实际用处啊,还是说我理解的不透彻

使用特权

评论回复
18
诈尸者| | 2016-12-19 14:01 | 只看该作者
很不错 很不错

使用特权

评论回复
19
诈尸者| | 2016-12-19 14:03 | 只看该作者
挺好的

使用特权

评论回复
20
shi123jia| | 2017-11-4 13:02 | 只看该作者
stm32f103是不是没办法直接使用CubeMX生成LL代码?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17058

帖子

283

粉丝