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

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

[复制链接]
STMCU小助手 发布时间:2021-9-18 13:07
01 DSP简介
1 u( `, Z& r  Q' x% z  l3 Z2 S提到DSP,作为电子专业的学生,大部分第一时间想到的是DSP芯片,DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
. y# ?' i+ @/ G' P* y0 p0 U, O( o
& d! D# V! ~2 S

% r, }" W8 ?+ f/ ]( _6 R* F实际上,DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。1 Y& V. K; v0 N, X! J" A
+ s. G* ]7 G: [9 U' p

4 f$ l9 z  {7 x) E$ w+ x如下面ARM官方描述的,ARM处理器是支持DSP的。2 D$ w  N8 h3 }. c8 A
13.png
主要是在cortex-R和Cortex-M内核支持。" m( r* E9 [0 M3 H# ?) C  Q
14.png
Arm 的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。  Q* o$ I& `# q0 |6 `  p
15.png
向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。9 y$ t% h! L+ R; K4 \

0 k# F; ]. ?  I) F' G$ v, \02 IAR中DSP Libary的使用  u* D+ `; J3 g$ l, @3 }

9 G. K0 Q+ c/ g
- x' t/ @% u# l- Q4 m* @# ]7 R
ArmCortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。
3 I0 B: y# Q5 D* K$ h
8 i5 N$ S5 U* _  Z" B
0 E/ k+ J5 G) y0 B# q6 y
有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。; K& \' g/ g! w0 n6 ?
) d+ s  ]7 O5 }! z6 N
; |1 P" w: ^' S. c- h
IAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。& v( H9 y9 G$ w4 C

2 U  E. z8 a3 j, U9 `8 `
4 i1 P  L) u' [: a! O
Configuringthe CMSIS-DSP library" o( }: h; u" L+ X9 X% c" |

9 W/ F/ V2 n8 P
5 f- |  Y. l- _
配置CMSIS-DSP库' g6 r% n8 y7 q6 u5 J( f  {
16.png
让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:0 N  f) A8 c; U$ d
  1. 4 |# g, I, u) }, Q$ L
  2. //#define DSP_Lib& ]' R6 F- |! A/ c( {  p

  3. % y9 R+ g4 Y: u' w. c
  4. #ifdef DSP_Lib9 i5 V' m: c  c4 P- |
  5. #include <arm_math.h># s7 R0 f% {. f# @2 {
  6. #endif7 P/ C- u8 n) M( |# R" R6 v) x% m

  7. ! K5 t" a* F% k
  8. #include <math.h>
    3 v$ y( G) s! b4 W1 ^2 n
  9. #include <stdio.h>, L7 I  F' d$ ?. B
  10. int main()
    $ X  _5 T  m. j) _- D1 p
  11. {
    $ l- W! P6 M* H7 ~, b5 n- s
  12. #ifdef DSP_Lib
    # m8 s9 X) v" G7 z# W$ j, C
  13.   float32_t f_input_cmsis_dsp = 2;
    + h0 C' {1 q. J/ G7 a
  14.   float32_t f_result_cmsis_dsp;/ M' h6 J7 p# P" ~% L8 w3 j+ A2 l
  15. #endif
    - E; w. N2 s- y
  16.   
    - O) v9 X$ I3 C
  17.   float f_input = 2;$ O6 a- s; B# R4 u8 z( C
  18.   float f_result;
    . v+ X: a, {" v3 p" A) o' r% }
  19.   ' h+ ~$ }0 t3 l5 h. w: t, u

  20. 9 o$ u: u, r! Z+ H' O$ O( |5 k' a
  21. #ifdef DSP_Lib
    % {, c9 {; V; r
  22.   /* Using CMSIS-DSP library */3 D, B+ ]2 |' m7 h. t
  23.   arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);
    + S! g1 J" h* j6 ?
  24.   printf("f1: %f\n",f_result_cmsis_dsp);9 D( d% k$ S7 D+ u# ~5 v3 K( `9 D
  25. #endif% O$ q8 m# i9 v) D9 _
  26.   
    3 ~! w3 Y' ^; H. E  c, z
  27.   /* Standard math function */, ?" F/ X5 Y) R. _3 w
  28.   f_result = sqrt(f_input);
    * a& T: F7 J" U* ~+ S
  29.   printf("f2: %f\n",f_result);' {6 b8 p; X  d' ]- |6 S% M
  30.   
    & }, T7 b9 s3 v* H& c
  31.   return 0;( R7 G6 P# k) w9 G0 V, o7 w
  32. }
复制代码
结果如下
: u. ?/ R# t2 i: Q& I- k6 L
  1. f1: 1.414214
    5 k4 s4 N8 k! H* _$ u: M! K
  2. f2: 1.414214
复制代码
接下来,让我们来看看性能。
9 C3 }4 i6 m( ?/ B3 y. V2 v& V7 L* a6 r/ ?6 g( ], T

! j  G6 n2 b/ o+ \IAREmbedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。
, h2 T+ c  [, Z/ z
17.png
设置断点并记下sqrt函数的CCSTEP值:5 L1 M+ W8 Z: J* R) J) b% \. m+ s
18.png
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。
9 z+ J6 c0 }, g) O
  1. arm_sqrt_f32 :    52 cycles
    5 q) n  j9 b/ j$ V
  2. sqrt :            752 cycles
复制代码
从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。
% T; g# O6 m; S6 _2 f  Q9 g) n( j& W
9 `# _' o* t/ _; a' `6 T
赞 收藏 评论0 发布时间:2021-9-18 13:07

举报

0个回答

所属标签

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