本帖最后由 我会弄一点 于 2019-12-31 17:48 编辑
【学习笔记+STM32库函数性能对比】
ST已经推出了三种库函数,分别为标准库、HAL库、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:使用 DMA1 的通道 1, 从 Flash 中传输 100 字节的数据到片内的 SRAM 中。 其中包含了系统时钟的初始化和 DMA
的初始化代码。
主要对比了三个参数:Flash 占用量、 SRAM 占用量和执行代码的效率
IAR编译后生成的.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) 来计算的。 在功能函数的开始处和结束处
分别设置断点, 两次内核运行周期数的差值, 就是此处代码的运行周期。
测试结果如下:
总结:HAL执行效率比标准库和LL库低,标准库的效率是比较标准的结果
|