你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】教你如何在STM32中使用DSP指令

[复制链接]
STMCU小助手 发布时间:2022-4-16 20:00
01、DSP简介- N! K3 w* G& W8 C
提到DSP,作为电子专业的学生,大部分第一时间想到的是DSP芯片,DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
/ H( N7 V; F* n4 H5 }, S  Z) k; D1 Y$ q5 Y
实际上,DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。6 b. ~4 [( d  J7 ]: \4 g2 a

2 e' x4 }' q2 ?- {7 D如下面ARM官方描述的,ARM处理器是支持DSP的。
9 G, ]* W, e) [! [( A) Y: z9 ?* q# K  \, d& P7 A+ s
3cee887a7a78759c6c20c8b33b3e420c.png : A9 E4 e: z: s9 U5 D# U

1 v' t  E* E& G* [1 [5 M! ~主要是在cortex-R和Cortex-M内核支持。
# J+ I  c2 l) F- S% T9 h2 b+ H; G3 b' e8 T. ?
1ce953ffe55b72b2178807ccc94159b8.png 8 p) f- n! D  J1 {4 M/ T% W

! e' G7 s& u6 y7 @* Q$ bArm 的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。
3 J9 y1 k5 n6 ]* {! Q2 a1 S' n4 [9 ?6 P# b7 g. b  [
82beffe2c619ec2f3cb49e0eec03b6cd.png , X- `5 m& W% i
# Y4 _1 Y6 y% O
向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。+ @- [/ k1 t" E: Z3 X+ n
8 r/ D6 _3 L. V9 U
02、IAR中DSP Libary的使用) g3 l2 H% |5 O6 r& R
ArmCortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。
: X; X" \6 Y$ O$ @9 E# d% u% f+ B4 L9 L9 a
有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。& b7 j  ^5 T( s
# b0 w$ I, p7 v
IAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。
7 A1 n* \, g; i% ?# L; f  T8 h5 K* P. q4 I& E
Configuringthe CMSIS-DSP library
3 _& p/ G% h' A% w* E  E$ j
; T2 d) J$ Q, }1 F1 t1 j配置CMSIS-DSP库% P; b9 d1 e+ o, g

% t6 N; `) U# w4 z: i9 @ f92aac5b5d462b537bedf7ff023ecb95.png
; P. i" W5 t- a; \' ]' k+ }2 {; x1 z( v6 `* y) a
让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:+ Y, t1 S' n( {

( c' @* ~( O5 L7 H
  1. //#define DSP_Lib
    ) J* g# t5 |  E7 J# a
  2. 0 g9 ]: W. r% O7 y. ?( I  `4 t
  3. #ifdef DSP_Lib
      @. i6 C+ B" l: ?
  4. #include <arm_math.h>: j6 X- R; O' ^1 @, i
  5. #endif$ F7 ?6 e% y- k0 |

  6. , r/ w0 A$ H7 M$ f8 R
  7. #include <math.h>" I5 Q! S  {; A. L6 C# O3 ^
  8. #include <stdio.h>
    5 |- g  K2 K& L3 M8 v- g
  9. int main()" O4 c5 Q* a$ i/ R. e6 G9 @
  10. {
    % D$ d6 p! d# L: T; Q. J: k
  11. #ifdef DSP_Lib
    / R" Q# w8 O# U3 _9 G# J8 q
  12.   float32_t f_input_cmsis_dsp = 2;
    - @- F. C% `; w5 ?" a
  13.   float32_t f_result_cmsis_dsp;: i8 s  F% M5 y$ i) e9 q  m9 y
  14. #endif
    6 R9 |& b+ _  C' I+ t
  15. $ g6 h1 A- r  P
  16.   float f_input = 2;5 s" W2 u: E6 |3 P( t
  17.   float f_result;- o" Z! Z, D/ ~$ y( Z1 B# ~3 ^1 w

  18. / u1 C' J# [5 P9 Q7 b' f& S* k

  19. 0 C. l$ Q8 @' \. z
  20. #ifdef DSP_Lib
    ! z$ i% l% m9 e0 f
  21.   /* Using CMSIS-DSP library */6 H3 W) [: g  T. d) [( p
  22.   arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);5 f  a8 _4 t4 \% N+ q* f7 T
  23.   printf("f1: %f\n",f_result_cmsis_dsp);- C( L5 y9 q% |7 Q# V) |
  24. #endif$ i+ o5 {' Y7 k1 w# h' P5 \
  25. ( ^, m. P7 P  N/ n" J9 J" _8 v' x
  26.   /* Standard math function */, }" j1 P2 U) H1 I1 t* q# @0 a" B
  27.   f_result = sqrt(f_input);
    % p* i. n5 a# v$ l
  28.   printf("f2: %f\n",f_result);  r2 P7 l; d6 ~/ ~

  29. 1 h2 t# L9 V; s& O3 V# I" i
  30.   return 0;7 R' B& g( ~$ J" N! {) K0 }
  31. }
复制代码
) {) c( n6 ~1 `9 r2 O1 B7 w+ C
. y$ D) E; t% w# N$ p! o
结果如下
" r- ~6 F+ n0 v  E& R: h  g/ [. r6 P$ @  a1 X$ ]

  1. % y" x, n; l1 o
  2. f1: 1.414214 + ^. m7 p  }  ~/ R, z2 U8 |3 W, _
  3. f2: 1.414214
复制代码
! Y8 ^! J  r9 N1 b# H- c9 {
接下来,让我们来看看性能。
$ q" r5 `* |' E0 e& v0 R; u" G$ p# }0 s, b* g
IAREmbedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。
5 X  F5 {. E# g6 h/ C2 P
' B6 Y6 z+ b( j" }1 v 82e56d7350473731dc57855135c0125c.png
! K' \6 ]. r' o+ V% ]& B3 K! n! [
% E5 C8 p  K. z# D. K设置断点并记下sqrt函数的CCSTEP值:
, _* y) ^) x' \
  L# i8 \& U( ]3 k& M2 r 986b9d5bad371d5a787cbedf09195bdb.png
( N' z8 S9 o& D! h+ J# t* c3 b0 k9 Z- C
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。+ F' t; N: W7 C, H- R$ K4 N. U8 D

2 ?( W7 w' k% c1 Y1 q
  1. arm_sqrt_f32 :    52 cycles
    : B: H. B# J$ n7 h2 Y. \$ @: x# g
  2. sqrt :            752 cycles
复制代码

/ n7 `6 ?- r- p从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。
- x: X, n& }" Y% R+ a$ S. X
8 _# q6 E2 X3 b+ w0 }
! I' u, h6 s/ I; k6 ~
收藏 评论0 发布时间:2022-4-16 20:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版