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

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

[复制链接]
STMCU小助手 发布时间:2022-4-16 20:00
01、DSP简介
" G  E* O: r3 |: l提到DSP,作为电子专业的学生,大部分第一时间想到的是DSP芯片,DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
: Q( }0 I5 I, p9 p# T: @1 b5 P: ~8 H- B" f! X
实际上,DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。* Y0 W$ Z' b% d" E1 u* ?) I' h  e
4 K( k8 D6 b3 [( V# [
如下面ARM官方描述的,ARM处理器是支持DSP的。
; _: `1 }$ w2 o; F
- @' Y, r1 x2 ?# j& T 3cee887a7a78759c6c20c8b33b3e420c.png
: a! ~/ T# {& }) L4 E+ b; x( R& n3 U. Y" I7 H. }+ N
主要是在cortex-R和Cortex-M内核支持。
+ L1 N* J( T0 S# z) T1 G7 v# D: F3 [) o$ }
1ce953ffe55b72b2178807ccc94159b8.png
" V& x" h5 v; R) \3 `% U
2 }' b) X6 C7 |3 |! }/ I) f0 K- V( GArm 的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。
3 t; |' p  n1 y- I0 Z
( ^5 Z* v$ }4 V5 ~2 ] 82beffe2c619ec2f3cb49e0eec03b6cd.png - f# C1 [4 F: p" Y$ I

/ `( Q" l. j1 F$ E4 {向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。% v+ C# N% T8 }6 _8 ^, p
) a$ F  l2 w' K7 s6 i* p8 @6 ^
02、IAR中DSP Libary的使用+ Q0 @1 u) h) @" u: B
ArmCortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。& Z* T, C2 E/ _- E

0 Y  W( ?# I$ ]2 y( c, k6 a, a! ^/ f有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。! Q9 Y) n7 W+ A% B* J
0 s  r- l4 a; H! [2 g2 T' r6 ?- Z6 c
IAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。" K$ m- b5 I! [" x9 N8 u# W
/ V3 e" q; d& |! J5 h0 e
Configuringthe CMSIS-DSP library
7 o; Z7 K! ]& ?- n# t
- r  k3 g& F  Y$ F* p) `配置CMSIS-DSP库4 `, I( P5 K* p
: V9 O* v0 v6 t
f92aac5b5d462b537bedf7ff023ecb95.png 4 {' t' F4 G. S. j. b
6 r5 _+ E5 Y3 }: R% ~2 [- o& ~
让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:. {6 i& ~5 D  w* O6 u  ^

3 S% R; m- j1 l+ H9 W: R; z
  1. //#define DSP_Lib
    0 ?3 ?' t1 m& r5 J/ x! U

  2. ( l* A; C6 y" W+ H" g/ l
  3. #ifdef DSP_Lib# {4 V$ @! @& g$ j5 `2 E
  4. #include <arm_math.h>$ T& O( `3 H  @0 a3 j$ _, I
  5. #endif
    6 B& S2 p: D/ }( F$ C. a4 S
  6. 6 p! f3 F4 w6 @% g$ k/ |) C
  7. #include <math.h>7 z9 ]% {) Z. @$ s) e; Z
  8. #include <stdio.h>; E5 c, q  g  l+ D) ]/ {& F/ c2 X* I
  9. int main()7 \0 F# v3 j$ U  l* m# f2 M1 s5 G
  10. {' U' t) J/ `; R: {* U: z
  11. #ifdef DSP_Lib
    ; ?1 F% c% L6 K" ~
  12.   float32_t f_input_cmsis_dsp = 2;
    # \; p7 ^! w4 l" M. C4 g
  13.   float32_t f_result_cmsis_dsp;
    4 _1 U9 ^/ P& {* E5 R
  14. #endif
    * O' h0 E- d% x( W7 _

  15. % ?: m% w# l8 t# m
  16.   float f_input = 2;
      W* s! ?' X* M+ x
  17.   float f_result;) @7 T% h, {$ b9 S- z, \" ~& H
  18. 9 c" q* g7 M3 n! m% V# X& S
  19. * G0 ]/ S, |1 ?& d: C4 Z/ G3 S
  20. #ifdef DSP_Lib
    ) a, Z$ d' V, M7 s. _; q# H
  21.   /* Using CMSIS-DSP library */
    4 r/ C1 C- O% W. G0 g% ^9 b6 a- U
  22.   arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);4 X( s1 H6 m2 ~7 \: p  e
  23.   printf("f1: %f\n",f_result_cmsis_dsp);) \2 C; O. v6 P; q) `( e8 w, ?
  24. #endif% d9 ^3 n/ t8 A4 r4 {9 I& v

  25. # I  A0 }9 }- t4 U( f) p
  26.   /* Standard math function */
    0 H( m, |, f5 Y
  27.   f_result = sqrt(f_input);
    9 \5 a9 g9 K3 L4 t" S
  28.   printf("f2: %f\n",f_result);
    % K" q" }  W  i7 N7 b* Q1 s

  29. * v* z, C# P' n# W3 q
  30.   return 0;
    5 P, T. Y# p4 ^, j
  31. }
复制代码

3 ], X% a  [+ g) N% z
0 R, m# D( o2 y) z4 j+ I0 }2 U/ x( I结果如下- w5 v( `& C; x( I4 x
1 l# b: y' V& N4 l# _

  1. $ ^% z, n1 s" e0 H$ I
  2. f1: 1.414214
    3 ]$ Q% r- o5 s
  3. f2: 1.414214
复制代码

# R4 i$ g6 k2 {' b" X接下来,让我们来看看性能。# \& y# d9 Z4 n4 @

$ ]; ?2 s4 p% H, P# m+ i# B& }IAREmbedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。
7 P0 m. @8 }# x. ~; |  i" m1 ~- r" a( e3 C( X
82e56d7350473731dc57855135c0125c.png / \7 ?+ J" @6 v( U+ B$ d  V

. H9 B; S  ^  z  C2 l4 g+ _3 ~: c4 H设置断点并记下sqrt函数的CCSTEP值:* A2 a6 y6 T6 |! M* d& }0 b1 z
1 o! ?$ ]! p# e/ O2 e' t* v$ y
986b9d5bad371d5a787cbedf09195bdb.png
9 P! N( ?2 g% l7 t& ]# I0 U8 j, E  l! J. H! a( a, b7 m- H. B
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。
8 `( @% P- _; w' d6 ]
9 N0 c* f, y& p) y0 Z6 A) \# n3 O" d
  1. arm_sqrt_f32 :    52 cycles0 \6 {# z8 u8 P- k$ X0 E9 |
  2. sqrt :            752 cycles
复制代码

) @/ s/ m* ]  N从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。  F9 }/ Y# H& L, s/ j5 z* R% D
  d3 L7 T8 f2 }4 i; F% r% O7 z
  Q+ |- L- M  E. O: r' d
赞 收藏 评论0 发布时间:2022-4-16 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版