前言

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界面下,做好各个外设的选择及配置后,在Project\Project Setting\Advanced Settiing如下图示界面上,你可以选择要使用的库类型:HAL/LL.

另外,偶尔人询问及LL库在哪里,其实LL库函数跟HAL库函数是在同一目录下。以STM32F4为例,你下载STM32CubeF4解压后,在类似如下目录可以看见HAL函数和LL函数库文件。

。。。\Drivers\STM32F4xx_HAL_Driver\Src

基于不同STM32库函数的代码性能对比相关推荐

  1. 中国移动基于ARM/x86服务器的Ceph性能对比

    2018年11月17日,Ceph中国行首次走进杭州,万众期待的杭州站沙龙如期而至,虽然杭州已经开始降温,阵雨不断,但活动现场依然热度爆表,杭州各大IT公司的从业人员和Ceph爱好者纷纷而来. 中国移动 ...

  2. STM32各系列MCU性能对比及测试说明

    置顶/星标公众号,不错过每一条消息! 很多人说STM32性能太弱,那你了解这个性能是如何得出来的吗? 1写在前面 我们经常听见某手机发布会,安兔兔跑分多少多少,其实这个跑分就是体现手机性能的一个指标. ...

  3. Pytorch优化器全总结(四)常用优化器性能对比 含代码

    目录 写在前面 一.优化器介绍 1.SGD+Momentum 2.Adagrad 3.Adadelta 4.RMSprop 5.Adam 6.Adamax 7.AdaW 8.L-BFGS 二.优化器对 ...

  4. 基于逻辑回归/决策树/随机森林/多层感知分类器/xgboost/朴素贝叶斯分类的资讯多分类性能对比

    在上一篇(https://blog.csdn.net/baymax_007/article/details/82748544)中,利用逻辑回归实现资讯多分类.本文在之前基础上,又引入决策树.随机森林. ...

  5. SCI期刊写作必备(二):代码|手把手绘制目标检测领域YOLO论文常见的性能对比折线图,一键生成YOLOv7等主流论文同款图表,包含多种不同功能风格对比图表

    绘制一个原创属于自己的YOLO模型性能对比图表 具体绘制操作参考:(附Python代码,直接一键生成,精度对比图表代码 ) 只需要改动为自己的mAP.Params.FPS.GFlops等数值即可,一键 ...

  6. Node四种动态加载JS代码方法性能对比

    背景 我们运行node程序的时候,一般情况下,js代码都是事先写好在js文件里,然后启动的时候加载到内存中执行的.在一些特殊的需求下,我们可能会执行一些动态的js代码. 四种方法 目前我能想到的方法有 ...

  7. mysql firebird 性能_Firebird, MySQL 与 PostgreSQL 代码质量对比

    今天看到一篇文章 - "Firebird, MySQL 与 PostgreSQL 代码质量对比"-  关于三个开源 RDBMS 的静态分析比较. 主要内容 A few words ...

  8. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  9. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

最新文章

  1. html页面调用ico图标,如何在HTML中使用图标字体 - icon font?
  2. RHEL5下安装Xen
  3. springboot+mongodb
  4. Jenkins环境搭建(2)-搭建jmeter+ant+jenkins自动化测试环境
  5. java进程内存一直没释放_五分钟彻底搞懂你一直没明白的Linux内存管理
  6. 记一次“Shiro+任务调度”开发过程中出现UnavailableSecurityManagerException解决思路
  7. OpenShift4 - 使用 Service CA 证书增加内部通讯安全
  8. Spring中的设计模式学习
  9. 王思祺2015080360030的第一次作业完全版
  10. xenserver 虚拟机扩容lvm磁盘分区的方法_vm虚拟机中linux Centos7.4硬盘扩容
  11. Linux下文件查找命令
  12. 181008有道扇贝每日一句
  13. usb声卡驱动_最适合专业音乐人网络直播的声卡型号
  14. 希腊语 - 希腊字母表对应的意思 - 数据挖掘必备
  15. 满足国六标准通用型故障诊断仪:Q-OBD
  16. python数据按照分组进行频率分布_python实现读取类别频数数据画水平条形图案例...
  17. 基于TTP223金属触摸开关电路模块原理图和PCB工程文件
  18. 16.04Ubuntu桌面版搭建
  19. QT 屏幕旋转的两种方式
  20. 设计模式05——结构型模式

热门文章

  1. 《教师教学究竟靠什么--谈新课程的教学观》之交往与互动的教学观 心得体会三...
  2. CodeForces - 1400D Zigzags(简单dp)
  3. 牛客多校 - 1 or 2(一般图最大匹配)
  4. POJ - 3417 Network(树上差分)
  5. python左移位运算_python 移位运算符只能用于整型吗
  6. PyTorch-数据准备
  7. 最小公倍数和最大公约数
  8. 径向基(RBF)神经网络
  9. python网络编程实例简析
  10. 安全编程: 防止缓冲区溢出