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

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

[复制链接]
STMCU小助手 发布时间:2021-9-18 13:07
01 DSP简介
" {5 c- u! Y9 I% `( R' ^$ R提到DSP,作为电子专业的学生,大部分第一时间想到的是DSP芯片,DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。
6 C0 c& r" }& n
9 D! E' g2 x$ s; _8 Z8 ]
( I* x/ z/ z9 p: Q& S( J( h, @0 k
实际上,DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。
) V0 R3 u# ~0 u; {# o9 P" q, e0 I1 d% n1 A3 |' S- b8 [
0 P7 ?* E# B0 V. D  o6 ~- @/ X
如下面ARM官方描述的,ARM处理器是支持DSP的。) i) k3 ^' J$ t0 `/ N! m8 a$ p: y
13.png
主要是在cortex-R和Cortex-M内核支持。
, ~9 E( k. R* d* e
14.png
Arm 的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。
* {5 u" [9 A$ a' J
15.png
向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。
8 [; S7 ~* H* K- s: t! H/ [
( L1 e$ {# H+ k, V# D* @$ t: ^02 IAR中DSP Libary的使用
4 M% j- V9 W1 ^/ }' g7 I& H  ?6 h6 J$ b8 _, y
! {' I0 }# s8 Q5 c
ArmCortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。
1 J; t! Y) w4 O, w( Q- H+ A
% K$ P) z4 U, b8 f* F1 G
9 K! Y2 V( n0 ?: n' M/ b) s2 d+ i
有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。- M" q& K& g, h8 ?4 {2 z" p% A' b4 s
9 i: l3 t7 `9 I9 Y" O3 e" c

9 n, L  Z7 j& w$ K' rIAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。
1 U% _/ v3 S% n9 ]# F( \  ?1 {2 ]2 E2 W4 i$ C0 \
" _  s$ e# U4 N/ |6 s; l
Configuringthe CMSIS-DSP library3 k* ~( N/ M2 J" L& g) |# K7 L
+ ?: J4 t, w9 n8 T

/ a$ {$ \3 T, j4 G. [配置CMSIS-DSP库8 U" ], \! i8 h# |$ x
16.png
让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:
, g8 l. ?5 T) x. f
  1. : H5 L# [* R: P
  2. //#define DSP_Lib3 \& \7 P9 M7 P# |4 R/ I4 J/ w

  3. : g  w% M, Y, k4 ?
  4. #ifdef DSP_Lib
    , o6 f* z* g% J! {  j
  5. #include <arm_math.h>+ S  _3 e+ B3 g0 a, D/ p( `
  6. #endif& {; F6 Y& a) `0 d( U
  7. 1 V6 M# a0 L3 F( h/ q
  8. #include <math.h>
    , K4 x+ R0 X$ B  U7 O
  9. #include <stdio.h>  Q5 W5 c* O" `+ ^0 J$ ?, U
  10. int main(), o: G9 t8 p, Y2 _, s" }0 R! H, w
  11. {
    1 c0 L  i) H8 b0 c/ ]& {
  12. #ifdef DSP_Lib$ e0 y2 f: I3 c5 ~% e" z) j
  13.   float32_t f_input_cmsis_dsp = 2;" @+ B( c3 x6 q, z; e$ Q
  14.   float32_t f_result_cmsis_dsp;
    & y. u2 u0 C9 V! p5 p
  15. #endif( U. z3 I2 K+ F3 v  ?* H2 E
  16.   8 G! B$ h/ ?* [: S3 V
  17.   float f_input = 2;% o4 j8 M4 G. `3 f- c$ l+ G
  18.   float f_result;) T' j7 {- z2 O% A" V7 H6 J
  19.   
    + N% C) Z" M% ?- p3 Y6 S9 [
  20. , |! R6 B7 V) o0 O; F
  21. #ifdef DSP_Lib
    ' R8 Z' l- _% H" k$ V7 p; s
  22.   /* Using CMSIS-DSP library */9 B" A: x" n7 m/ G8 G( x0 Z
  23.   arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);
    - W6 s+ C" D" M; x- A
  24.   printf("f1: %f\n",f_result_cmsis_dsp);; ~2 Q2 F* P& u/ R! Y& r$ V: h# I
  25. #endif3 z+ Y: E; x; k0 s& K8 ~; W8 P$ f
  26.   + p9 l- l* A+ j8 y! j+ x
  27.   /* Standard math function */
    8 y+ c: j6 R( B0 X+ g5 r
  28.   f_result = sqrt(f_input);
    9 D$ P" S' V+ D3 h1 }% e
  29.   printf("f2: %f\n",f_result);
    1 N9 @6 |. d. y; p
  30.   # n& e+ n/ N# G
  31.   return 0;
    , c: t$ L' o7 S* s
  32. }
复制代码
结果如下
) J( @' G) X8 S- k
  1. f1: 1.414214 ; D4 a: C1 ]& E3 l" S
  2. f2: 1.414214
复制代码
接下来,让我们来看看性能。, p" I& Z% e, r: `4 {
+ H' b& d: S2 G7 }* C
$ Y/ E, y, j* `
IAREmbedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。6 c% T& H3 ?5 K4 @7 r6 T5 b% e7 Z
17.png
设置断点并记下sqrt函数的CCSTEP值:3 s1 u1 u5 j. O* {* G
18.png
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。
+ J+ Z4 |- b+ r2 v8 `, q+ M0 S
  1. arm_sqrt_f32 :    52 cycles/ ^3 C8 ]( X1 `# ~, g" O) H; ]
  2. sqrt :            752 cycles
复制代码
从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。- E1 W, ]3 r0 {0 H  ^

5 A) K- a6 V6 z: k2 u1 @
5 q- \8 J0 x# k' f" S
赞 收藏 评论0 发布时间:2021-9-18 13:07

举报

0个回答

所属标签

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