找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 52|回复: 3
打印 上一主题 下一主题

DSP学习经验

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1306
跳转到指定楼层
1#
发表于 2016-5-10 17:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。
2 Q' c+ h' P1 f7 R0 i- q* {4 A4 d  一、弄清DSP相关资源的来源及熟读手册
( ~9 s( ~* [, \; A9 P  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。# d5 A8 {2 M# \, m2 j
  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。
& E7 Y* K1 j# j) \  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。! q4 [2 P/ e$ x- `5 q# i/ W4 S: h/ t+ X
  资源主要包含:
5 M& Q4 u; C/ v2 X  b$ _    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)
& ^( f3 ^$ t1 o    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)0 E8 i/ E" Y; q+ `
    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用)
% J1 B$ p( v  S+ f     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的)# N* b; H+ W, j3 _& Z
    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编)( x' T* O, P" s+ t1 g( v. z( E% H
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux)7 k0 |) M' N1 X
  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言)/ u& Z) n4 B0 H5 l2 g
  三、DSP最小系统的配置
( ~+ H& ]9 I* i4 ~# {7 [8 G- x1 G  c( D  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。# N8 ^8 C' R! }; x* o$ Q! D
  四、DSP外设的使用' T& s7 E% ^- x7 ~$ l( {
  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。6 T+ u1 a, _% K. w5 ^' D! X+ |
  五、DSP优化( v7 G! O$ u% Z$ i5 |; i! @
  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:
8 S  t6 k+ O0 Y, D7 K  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:! r; I" a- V7 N  a8 `8 A2 M
    (1)优化循环
4 O# ]( _4 A( g- F; N4 F    for(i = 0;i < max;i ++)2 Y1 s1 E4 j8 O6 o
     {+ M( o* C5 ^& ]+ v) v; z
        for(j = 0; j < max; j ++)) c; f" E2 {  X9 z, s' o
        {
5 v5 f# e5 m6 O- a/ O# B! l  P            float sum = 0.0;7 H+ ~5 w0 o& K
            for(k = 0; k < max; k ++)
/ O- E3 C" p: h. u0 `# F            {
- s3 {- g& i1 R( T( s; V1 o                sum += input[i * max + k] * input[j * max + k];6 o- R# V) {) O
            }2 G1 a- u+ v3 @* Y+ i1 ]6 N' S" D
            cover[i * max + j] = sum / max;0 e& j: w) ]+ v" Z, f4 z3 _
        }* @. c% h9 S( R" d, w
    }/ k9 R" j! N' x6 }, B3 |
    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:& \6 @- x6 j/ ?" C$ E) u% r
     7    17   27   37, P/ c0 D# W' q; L. O# |! ~
     17  43   69   95
$ m- H4 S" _: D! [% q& a     27  69  111  153
3 f) g9 T& t) H; R     37  95  153  2119 D3 u: n# g7 |* X9 @6 ^
    图示:! L( C. Y9 b8 C6 r  k
    - f" ^5 F+ _+ e. n* B# M/ D/ Z
    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。
: e$ |+ }! V: n# n    算法优化后:
5 d' \/ r% p$ R5 U, z  ^8 \    for(i = 0; i < max; i ++)3 [1 i/ w2 c  [% l: P* {0 S
    {
9 B$ R2 f2 }* g: [3 V4 u0 e$ d4 @        for(j = i; j < max; j ++)                  // 减少一半循环
: I  ^+ `0 i3 F6 u: ?        {
7 p# ~% ~, x. C) P3 a            float sum = 0.0;
2 K0 n4 C, ~5 r  F/ U            for(k = 0; k < max; k ++)
; U$ V; z+ v/ c% f: H% C. h; m2 T            {
5 U$ U" J- G; G% S  W                sum += input[i * max + k] * input[j * max + k];. C, J% E6 N7 y8 ], U0 X
            }
+ U5 E4 f8 ~( S9 s0 T" V. Z; l8 y            cover[i * max + j] = sum / max;
( e+ G- \1 y0 B" b            if(i != j)                    // 可加可不加,消除中线上的重复赋值
# P1 r) K$ R. C$ S, b) P# z0 s            {; }0 n3 r: T! T+ h$ l
                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵0 }+ s4 X  j: G. d# p
            }$ u( F4 l7 e8 S
        }
  B" c0 I* k9 T! ?. D    }+ F4 Z, ~3 k3 E& o
    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)
. |( x; q+ C, Y6 i+ z    k = k -1;
1 D* _5 |9 V- w  q  P4 c    if(k < -1)! d2 D, G& _8 J7 n9 `+ i5 P% l# p
    {7 `" `! g5 \. }
        k = -1;/ [. R7 s0 o  [: r
    }) Y6 H6 Q  D6 a7 Z
    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。( |- |. p  ]" m# s" b& D: u* w" ^, r
    优化后:
4 \3 K& H3 z0 [    k = max(k-1, -1);
4 N7 V. @. E; z; H    转换成汇编后:
- r& A7 X8 `$ u+ h- N' T5 {    R0 += -1;    // R0 == k;/ y2 q5 f& ^# `$ h" ^
    R1 = -1;
# G4 }  I5 [' o6 @$ H: p6 g    R0 = MAX(R0, R1);
0 q) J/ `3 V1 Q    (3)for循环中的条件跳转
+ B7 l3 v2 L* R1 }8 M+ m4 b# d3 e    for7 t6 N; _$ [5 W3 a+ B
    {
$ S1 h* I5 Q# q/ v+ ^        if{...}else{...}
& Q, H* S8 W. I$ ~    }
0 E8 G5 S3 k& K    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。/ E. C& D3 X; J9 f5 l9 U( ?: q
    优化后:9 m# K6 x2 f* G6 z: c' O) q  b# e
    if! B( e$ j% D4 p; |
    {- v2 o" f* h6 t: p$ f; B/ c3 ]$ H. ]
        for{...}! Q, U: a& j; k2 ]+ e* G. H6 T
    }& J5 X: A+ f! Z( ~
    else7 g0 v- i6 O9 [: C
    {, L( m  j8 ^4 [7 Z
        for{...}
0 H+ W2 s3 ]# ?  C/ Y    }
  I+ y% m& @% V, I    (4)使用断言指令来避免条件跳转  ^! w* v6 [% Q' ~
    if(A). U& X! L8 k6 i6 [) ?
    {
+ o$ b* C0 {6 n& Y, d        X = exp1;
& b5 h3 a1 U. Q+ L     }* U) _3 B! ~/ F; [; f" x" x/ W
    else5 O. B, k9 R# E2 a& o8 }8 V
    {, S+ j( n$ L+ K8 Y
        X = exp2;
: L5 J4 B; n& ?; N    }    0 a) W% h, k! c) a
    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。
! E" a0 c% n% T. y0 x! {    优化后:8 x% C. j' B6 J9 z
    X = exp1;
' Y/ N2 i  z% E4 B" m    if(!A)  ^* E# S7 R, {1 M4 p
    {1 r) U! G# {# M# k- ^. `
        X = exp2;3 o9 G, q/ z. u  y: a9 F) U( X
    }( y6 }& t8 ~* ~& v
    (5)除法(取模)操作) a) r7 j# N3 {; u) I  |+ U  w
    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。
9 r; b0 Q0 E( F3 ^. d2 j' M    除数为2的N次方时可采用右移法。
: n/ ?7 \9 W6 b  c0 W) Z, F& O    如为提高性能,可采取查表的方式,这样会损失精度。
6 d+ }7 h: L8 y( ?6 b    隐藏的除法:7 N0 L% X" ^2 H4 T2 Y
        for(i = start; i < finish; i += step): p6 W1 b- _: d7 L  J
        此时编译器会looper = (finish - start) / step 得到次数。3 |& a9 A% H2 g$ @5 T' v
    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)3 {- M5 R; w' D2 W, M9 a0 \
        if(x / y > a / b)
, o) m% Y8 r* e4 }5 p        可转换为:
2 `+ t  T+ U# n: b        if(x * b  > a * y)) I) F2 }- U5 [$ ]
    (6)数据类型
/ m" W, ^4 l2 Q% H, c" _+ V    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。- d. Y; G- W6 u: |
    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)
* N$ Q2 L4 C+ R8 P    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。& z: A  }. g/ [" g/ W$ U
    要做控制类,条件跳转时,32bit的操作是比较合适的。5 P7 p7 H9 }+ X# t
    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。
" V0 T1 G' t' |    (7)Memory分配7 H2 y! C9 K2 g2 H6 j5 Y1 _
    将运算比较频繁的数据和程序段放入片内Memory,开启cache。
" q& A" L8 e+ R. W7 i4 C    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank
1 r6 b: V, a$ w4 I    (8)开启仿真软件的编译优化选项! ?: f7 K( Q3 B0 a5 `1 |
    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。
5 x$ `4 r8 C6 N& r! a4 g    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。8 O( A4 J% k7 ~) N. e( b7 K" J
  六、总结" u! [0 o5 T$ l, R. c- _# h; ]
  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。
+ t: z3 m7 {9 `9 w, u7 e  快速入门的步骤如下:
/ T  G! p* P; g  A  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

162

主题

614

帖子

1255

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1255
2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!6 `$ S$ I6 M0 D2 Z$ ?3 o8 C
感谢感谢!

156

主题

503

帖子

1186

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1186
3#
发表于 2016-6-1 16:26 | 只看该作者
3 u$ ?+ u$ P% C# [. O
haohao

159

主题

527

帖子

1197

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1197
4#
发表于 2016-6-2 15:28 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-13 03:31 , Processed in 0.058206 second(s), 31 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表