01 DSP简介
- V- L/ t; p8 R( U T' h6 e提到DSP,作为电子专业的学生,大部分第一时间想到的是DSP芯片,DSP芯片的内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的DSP指令,可以用来快速的实现各种数字信号处理算法。9 M% j# D7 ]' h
% \/ E, p0 T/ R3 j% g2 _9 J* q
; Q9 y, i( l) v3 i- i, j
实际上,DSP的全称是数字信号处理(DigitalSignalProcessing,简称DSP)。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛DSP技术图解的应用。
0 o u5 k4 T/ Z2 U3 b! Z) f( k" I
6 G/ t! }" O& G j. {7 |6 }& |9 s0 I9 S- C0 z, l' U9 E1 F, ?
如下面ARM官方描述的,ARM处理器是支持DSP的。
! [$ e" r8 ~* A! Q3 x0 l+ N主要是在cortex-R和Cortex-M内核支持。" D& ?) ]5 Y( `' ^. F
Arm 的数字信号控制器Cortex-M4、Cortex-M7、Cortex-M33、Cortex-M35P和Cortex-M55处理器满足了对高性能通用代码处理以及数字信号处理应用的需求。 ?! X( {6 d/ O0 p" {
向Thumb 指令集添加DSP 扩展和可选浮点单元(FPU),旨在提高数值算法的性能。此外,它们提供了直接在 Cortex-M处理器上执行信号处理操作的机会,同时保持Cortex-M程序员模型的易用性。: p9 G4 t7 T! P0 J/ q& a# d4 e
. R$ ^) ~3 G" z
02 IAR中DSP Libary的使用! ~% h, p; w. a; N9 ]9 i
5 t2 O3 J3 B* Y, u& }9 v
6 P- o: e" s# o v$ g" uArmCortex-M3 /M4处理器提供信号处理指令,例如SIMD(单指令多数据)。特别是Cortex-M4专为DSP应用而设计,它支持高级SIMD,MAC(乘法和累加)指令。此外,Cortex-M4F器件具有FPU(浮点单元),用于处理浮点计算。, g2 }- n; l* }
9 l2 b" u( s5 S9 [6 M+ b I% S
6 K0 U: `$ t8 ^/ M K& H$ e9 q* w& D有几种方法可以使用这些指令,例如使用汇编程序例程或内部函数,但最实用的方法之一是使用ArmCortex微控制器软件接口标准(CMSIS)DSP库。CMSIS-DSP库专为Cortex-M处理器而设计,它为数字信号处理提供优化的功能,如矩阵函数,统计函数,高级数学函数等。
& v/ ?/ l, U# e7 a2 \! h
4 L/ t6 E7 I3 R- V8 f. [ {5 b, H
% p: [; {7 |: {9 F Z# P- qIAREmbedded Workbench forArm中提供了预构建的CMSIS-DSP库及其源代码,在本文中,我们将了解如何将CMSIS-DSP库与IAREmbedded Workbench for Arm一起使用以及如何改进性能。1 @& C w3 i+ P) {; Q0 {6 }; N
6 G) x+ h1 e n
+ H( Y, m1 _! c5 ~/ KConfiguringthe CMSIS-DSP library
1 e, c8 G f: G3 x4 _: H g$ u% Q3 O( r
+ [7 e" i$ w: E: _配置CMSIS-DSP库
* w5 _3 a- N1 j A0 B+ L, A; e让我们看看如何调用CMSIS-DSP功能及其性能。这里我们将使用sqrt(平方根)函数并与标准数学函数进行比较:/ B; v9 C6 J( G! `7 E4 f4 A& d
: q9 W2 y5 h0 i, N8 z- //#define DSP_Lib
/ _0 P0 o0 R1 ?; i% X+ j! o( T - D' K& J( b; Y5 w' M
- #ifdef DSP_Lib
# T. F7 h6 E8 b2 f - #include <arm_math.h>8 H/ v$ V7 A$ s% ^
- #endif
6 J- ]$ Q4 v- f/ R
0 \ u" ^. t% c- #include <math.h>
; o. k2 U3 y( q3 N: \ - #include <stdio.h>
1 r4 r; m- ?( u9 ~! `, x; v - int main()
) y) X. c& U: }9 R6 Q - {
4 [ `( @& R, i# \. d - #ifdef DSP_Lib- O: X# y$ O) J# R& ^0 J( ]. V5 c
- float32_t f_input_cmsis_dsp = 2;, Y3 z4 F! J+ L" G
- float32_t f_result_cmsis_dsp;. ?" Q7 P$ P) s" b
- #endif
4 a- ^+ Q; W& H - ) ]) ?! d9 Y6 I; S4 L
- float f_input = 2;
3 H# `* g t! i |4 h" P) i e) _ - float f_result;
% Z c+ j7 O3 M$ W# U# O - & ~& w! |* N' R4 `% t
- ' [6 X1 x4 i) v8 T% S8 y+ @
- #ifdef DSP_Lib
( P5 n6 w7 f- G. [- j4 U; { - /* Using CMSIS-DSP library */+ y: |& E9 c" K1 y: `; c' o# q
- arm_sqrt_f32(f_input_cmsis_dsp,&f_result_cmsis_dsp);
+ W X/ [$ j9 G& G. |2 W - printf("f1: %f\n",f_result_cmsis_dsp);& l+ O$ l6 W: _+ o8 s8 E8 F) ]; p
- #endif
# o4 a/ ~4 G" ]# O# V# b: F -
( t1 h9 V, X$ d# Y7 h) ^! G - /* Standard math function */
) n* F w8 ~- m' f. H$ X. N) W) @ - f_result = sqrt(f_input);' ], `* u* j |# z9 l4 }4 F. H
- printf("f2: %f\n",f_result);9 ~5 j& i! E( j, ?+ v0 X
- 3 F* i, Q6 f3 a1 Q# Q
- return 0;
% ^; P! ^5 F, Y+ w: I0 J) Y4 U. x - }
复制代码 结果如下
1 C+ E/ b+ V/ {% K- f1: 1.414214
5 G1 k3 y% h& ` - f2: 1.414214
复制代码 接下来,让我们来看看性能。) `* h7 i/ N6 X @% Q
! F4 ?) t: ^; q6 V# k; s5 \9 Y
_! I% c# c: W; ^+ ]! Q
IAREmbedded Workbench中的CYCLECOUNTER寄存器可用于检查正在运行的代码所消耗的周期数。在检查上次执行的C/ C ++源代码或汇编程序步骤期间的循环次数时,CCSTEP寄存器非常方便有用。
8 z; m0 _& P) T* L# A: f) u, e设置断点并记下sqrt函数的CCSTEP值:1 S3 o8 ~0 r* D) b5 ?/ y* Z
在这种情况下,CMSIS-DSPsqrt功能比标准数学函数快10倍以上。
. U& T+ g u2 M6 M/ ]! U- arm_sqrt_f32 : 52 cycles
; A% r1 Q9 X+ E8 F3 k+ f7 Z - sqrt : 752 cycles
复制代码 从这个简单的例子中,我们可以看到CMSIS-DSP非常易于使用,并且显着提高了性能。
5 B s9 C: H2 p; h! n$ i/ c6 a% I+ h
# C5 K0 A/ P6 }5 V6 G' U |