立即注册
查看: 1135|回复: 1

[转载] 如何在STM32中使用DSP指令

已绑定手机
发表于 2021-9-1 11:10:08 | 显示全部楼层 |阅读模式 来自 广东省深圳市
1、DSP简介
DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。
如下面ARM官方描述的,ARM处理器是支持DSP的:
1.jpg
Arm的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。
2.jpg
向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。

2、IAR中DSP Libary的使用
Arm Cortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。
有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。
IAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。
Configuringthe CMSIS-DSP library
配置CMSIS-DSP库:
3.jpg
让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:
//#define DSP_Lib
#ifdef DSP_Lib
#include <arm_math.h>
#endif
#include <math.h>
#include <stdio.h>
int main()
{
#ifdef DSP_Lib
  float32_t f_input_cmsis_dsp = 2;
  float32_t f_result_cmsis_dsp;
#endif
  float f_input = 2;
  float f_result;
#ifdef DSP_Lib
  /* Using CMSIS-DSP library */
  arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);
  printf("f1: %f\n",f_result_cmsis_dsp);
#endif
  /* Standard math function */
  f_result = sqrt(f_input);
  printf("f2: %f\n",f_result);
  return 0;
}
结果如下
f1: 1.414214
f2: 1.414214
接下来,来看看性能:
IAR Embedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。
4.jpg
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。
arm_sqrt_f32 : 52 cycles
sqrt : 752 cycles
从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。
已绑定手机
发表于 2021-9-7 11:19:01 | 显示全部楼层 来自 广东省深圳市
牛逼,学到了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

合作/建议

TEL: 19168984579

工作时间:
周一到周五 9:00-11:30 13:30-19:30
  • 扫一扫关注公众号
  • 扫一扫打开小程序
Copyright © 2013-2024 一牛网 版权所有 All Rights Reserved. 帮助中心|隐私声明|联系我们|手机版|粤ICP备13053961号|营业执照|EDI证
在本版发帖搜索
微信客服扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表