找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

DSP学习经验

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。3 L3 ^( M5 u% O& O3 u8 i5 h
  一、弄清DSP相关资源的来源及熟读手册: r) O( W; X) \! N5 Y6 `
  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。5 S- P! F' x) J5 @. M: X6 ^# \6 F
  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。8 u0 \1 X" W2 |: ~
  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。
  N, q. u9 [' U7 _" U. I  资源主要包含:
. Q% H5 F( N9 d" A( {, ?1 X# d) q/ |    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)% M7 O9 o5 j. @0 q5 F3 P: ^5 P
    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)
6 e' j- j/ ?4 b8 C1 ~3 p* [    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用)# z& R+ e! V' Z6 N
     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的)
+ A; N; \# t9 e: y8 A2 o    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编): f+ g, L  R/ S5 `/ y; s
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux)3 M9 u5 Z0 `5 r8 u, S
  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言)
: \6 e1 P* E) m: K# [) w  三、DSP最小系统的配置& N" o" m# H! ]+ H, W7 X" P- b! A+ C
  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。
; j& K% J7 g% u  四、DSP外设的使用
& K; ^1 l, v" p* g; s* e0 ^$ R$ L; P  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。- X0 Y5 u; }5 y* t
  五、DSP优化2 `* v) m9 c3 y% W1 s8 `/ @
  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:. Q% b1 O( q8 \+ S$ K( N7 N) S$ Y8 c
  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:) {- v: m0 E9 j& h
    (1)优化循环
9 L. R: |( M, r* ]5 O7 P    for(i = 0;i < max;i ++)
. _6 x) ~0 u. l- R5 t     {
+ H9 ]: N* D, C! B  B+ |* ?        for(j = 0; j < max; j ++)' s3 W/ v6 v& i- v4 }: p* Z
        {
1 P6 l% U/ ^9 l4 X) Z, y            float sum = 0.0;
4 J6 X8 D& L$ W4 c  N            for(k = 0; k < max; k ++)
; x1 y2 n) ^% g% V* ^& }, E  ?/ |            {
* T# V2 y( M0 h' [, _3 e( N                sum += input[i * max + k] * input[j * max + k];
  N7 Y4 {% ]# r# a+ W            }* ]8 k8 B, m$ P  d
            cover[i * max + j] = sum / max;
* V, f  i$ M' @  x0 d        }
" G% U) {: b( H+ b    }8 v5 J; Q6 [' w( N  ?1 {6 C
    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:
1 s* b2 N0 C- S0 Q+ x. R. C6 I: h     7    17   27   37
5 Q5 u0 o" w+ T% e     17  43   69   95
& @+ Q2 m$ ^: G     27  69  111  153) a) B& W+ O- p# G5 J
     37  95  153  211
; b2 g& ^  {/ t$ \; M    图示:1 [9 o6 q6 f* d, m% X4 J
    
$ ~+ e7 t8 z6 F    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。
4 G- B+ g9 P: I9 K; @2 O9 N    算法优化后:$ l; C! c# v- [$ h  Z3 D
    for(i = 0; i < max; i ++)
/ d0 k- z+ f" i2 j$ s9 o* P    {" o* D- [7 w; Z  }& L6 K* D9 H
        for(j = i; j < max; j ++)                  // 减少一半循环7 O. o9 Z& l& p: G# h. E* X0 E# Y2 T
        {, s. o& B- d0 M1 T$ j/ b8 C* x
            float sum = 0.0;
) D; Y) g6 L/ ^9 g$ s* U            for(k = 0; k < max; k ++)
! o$ c, }: r- h0 v. N            {
) s3 `2 U! [; C  `/ e                sum += input[i * max + k] * input[j * max + k];6 f- i( d3 K7 ~0 Y; @7 h
            }
; S/ |: O+ X5 v' `            cover[i * max + j] = sum / max;
8 c4 E/ j, x% K/ M$ b            if(i != j)                    // 可加可不加,消除中线上的重复赋值/ h" a7 C) d. r8 b) N
            {5 p- }* d( p7 t6 Z
                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵
3 Q8 D" ~; _6 H            }3 B' L7 c) m0 R
        }( b) k9 p' X* ?6 z8 W# Y
    }, y! z) J3 x# m1 U/ n/ L
    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)
4 e6 {5 ~8 H" T8 T, V. ~    k = k -1;" [: i. y/ F+ q! g$ O
    if(k < -1)
) i6 p. H- R6 J    {, ]# B- |8 M- e  j! }, w
        k = -1;
- F& P: O1 o- t3 C. \    }9 \5 l3 ?3 d+ v2 c: v
    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。
. T/ o" W' j" B, p( q/ p    优化后:
! V! M( L/ _0 }0 y* L    k = max(k-1, -1);! v  u6 s, M$ ]6 F
    转换成汇编后:* E, S' C2 H5 s
    R0 += -1;    // R0 == k;
1 [/ U) O2 L9 J2 I' e! i7 B    R1 = -1;
7 p4 N$ m  L: q0 K    R0 = MAX(R0, R1);
0 g8 n9 ?6 d) v! I' g    (3)for循环中的条件跳转, ?) m# i2 r% B* n
    for* t" a, V4 x! G4 R. O' C  R$ x
    {
7 e, @  D' ~  u5 }5 V( e) A        if{...}else{...}. y4 k) |5 j, d1 ^, h$ j7 R
    }, j" }0 N/ x. T. G4 Y
    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。& ]  k* c) i! l+ c
    优化后:6 F, P1 n* v2 _5 W$ k7 X5 n9 G
    if
2 j5 n* W+ i/ q. ?    {* }# {; i: O1 H% ^& x* o
        for{...}
1 r* ~9 \4 I+ y    }
. z5 G, }+ L  K5 g    else& h& [5 }0 D* g- o4 {
    {' F1 T( N$ ?3 p7 [4 N
        for{...}
* L* j, v3 @) P    }
& F) ?/ I# q0 o1 \; S# N# v1 P    (4)使用断言指令来避免条件跳转* _4 x- N% q, c5 O5 h+ U
    if(A)5 S! l4 h/ T- h4 |5 c. M1 f8 W
    {6 P, |/ w; I/ i3 u
        X = exp1;
$ h4 ], U* D* P/ P7 U0 N9 d7 K     }
9 u3 R6 T& ^" s- @9 e0 g$ I2 L    else
- ^& u" |6 X( G9 j# {& q    {
# ~$ i/ a+ U; Z7 q: s        X = exp2;, o1 e4 \" f; S2 f( \% C, p
    }    
' C+ U) B$ R: ]    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。
& v9 M- C+ g4 c" z- w5 f    优化后:
  m6 I6 b2 D( T  q7 c    X = exp1;  F6 a- K% d6 M9 r
    if(!A)
% \0 q9 w. k, v+ G    {4 \  p0 i# L4 _4 }( Z3 k' s
        X = exp2;
" S) P, V' D* \: {, |7 H3 a    }
" Y* M+ M( m* I    (5)除法(取模)操作
! x: E. e9 W% K! W" w3 `' L- m    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。
) G1 t! M, S9 K+ S& @    除数为2的N次方时可采用右移法。1 ^4 |2 q" \' k5 ]4 X1 |
    如为提高性能,可采取查表的方式,这样会损失精度。8 o2 k6 P2 L! S
    隐藏的除法:
% V2 c7 n5 e. e  Y  h3 ]4 g" e/ H        for(i = start; i < finish; i += step)% e( u9 i9 \, {: ^: R  q8 O9 p
        此时编译器会looper = (finish - start) / step 得到次数。
. f: J2 N) K4 J$ `$ J% |0 @/ i    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)
; s/ o2 z. Z+ `/ z        if(x / y > a / b)9 A  u7 u# k( J0 f3 H& A
        可转换为:
7 v, d% C1 ?4 z) j/ N5 |4 b        if(x * b  > a * y)1 k8 G; {' A4 n9 l
    (6)数据类型; N" P3 b* N% F% W
    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。- k- F5 ?/ n( _* u
    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)) `) k+ V( b0 \8 L$ F
    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。+ b$ R3 K( ^4 e! [) z
    要做控制类,条件跳转时,32bit的操作是比较合适的。' f; p8 I& W% m) e5 }+ b" W
    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。  w: R  e$ k. }, a
    (7)Memory分配
; q" O2 X  B! d5 z7 }3 V6 D    将运算比较频繁的数据和程序段放入片内Memory,开启cache。  z% J2 Q/ z$ R/ ^
    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank
$ r* v  q( C" M0 H* }3 O' r( V    (8)开启仿真软件的编译优化选项
% w* F- ?/ M. u# Y  t* l; K3 X0 q2 F    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。
% C% c# t% R: v% p3 K+ i    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。5 F8 F6 \# F  W* {. a. c  S
  六、总结
7 v% ~) Q; g" Q) `# M! K: D6 C- V! P4 j  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。5 f: R4 H# p. M1 g: R8 r: Y
  快速入门的步骤如下:
8 y" o+ t4 R* j+ Z2 G  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

162

主题

614

帖子

1255

积分

四级会员(40)

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

积分
1255
2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!# ?; w1 K  }6 ]9 T! j8 S
感谢感谢!

156

主题

503

帖子

1186

积分

四级会员(40)

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

积分
1186
3#
发表于 2016-6-1 16:26 | 只看该作者
) `& n8 I! ]9 _! Q: J* O7 |* A/ O) S
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, 2025-2-22 02:22 , Processed in 0.058843 second(s), 32 queries , Gzip On.

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

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

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