找回密码
 注册
关于网站域名变更的通知
查看: 465|回复: 3
打印 上一主题 下一主题

DSP学习经验

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。
5 s; F3 m" l0 I2 B1 @4 \0 O" p! o  一、弄清DSP相关资源的来源及熟读手册
/ w4 R; M/ C2 r  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。9 c! ?, ]: z- y# P
  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。1 T- P6 }( Y7 R/ \" K
  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。
# l: W7 N& l% z* p  资源主要包含:; p" Q* e2 W8 G% J# G" Y
    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)
1 w! y3 B: V6 b0 O- c    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)/ y0 l6 y' r4 m1 T. v  L
    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用); k3 n) h5 v# `7 O3 p( E" T
     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的)8 h  u* C  H/ B* c, v
    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编)* \+ j" R  ?2 ?2 W" \& a3 r' N
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux)
" ?) L4 q1 G$ j) T. W# q6 G  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言). C6 d. _# T9 M* d7 g. W: {- t
  三、DSP最小系统的配置3 I. J! C8 U" ^( [3 z6 r" M5 r
  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。( p, @1 M, Z2 \
  四、DSP外设的使用* t5 d$ @' d* o+ [1 Y
  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。4 o9 \8 e7 r& \
  五、DSP优化
& e" o; J6 `! d9 b  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:6 f$ d8 c0 b6 d- y; `. o8 m0 b
  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:& {# R6 W$ y+ K2 M
    (1)优化循环
1 C( t2 x2 c$ ?5 E    for(i = 0;i < max;i ++)
) l4 s5 u! y9 r     {& U5 {+ t/ w! Y0 l5 ~! _4 [4 j
        for(j = 0; j < max; j ++)
1 |% u) J" z' Z2 E" k        {
* x8 Z( `8 m0 p# s+ z0 L4 Y. Q9 w            float sum = 0.0;
  v, a3 f" X% u- r3 ^# g. J4 Q7 l8 t& Z            for(k = 0; k < max; k ++)) A! w; F' G$ s+ B' f
            {
5 _* z  {) ^% y( Q) X- V2 g                sum += input[i * max + k] * input[j * max + k];
0 T8 Y% X7 R, o/ g            }# e* Z& C% p( O. T
            cover[i * max + j] = sum / max;2 m& H1 S  P0 B* G+ }7 g8 w
        }' R4 E9 w3 {% n' R; w0 f% u
    }
; I3 [9 O4 s0 K- O+ x2 k    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:
' V  N5 R8 V4 |0 o     7    17   27   37( b* t) V" A0 S6 r
     17  43   69   95
/ o; J1 O$ o1 c     27  69  111  1537 G5 `$ u* H$ J' }! V+ U) k/ D
     37  95  153  211/ l3 t! ]' y6 Y
    图示:5 I2 u( b1 F; R7 Q0 p: G
    
' r, \! j) E2 Q4 T! t    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。
" k4 M% y6 C9 _7 ]; ], F    算法优化后:( \6 r* I' ]6 r! H! }6 X3 f. |. [3 s
    for(i = 0; i < max; i ++)
) A& }7 l7 q8 t6 j( n9 ?# J    {
8 g& g7 F) K) a5 ]7 t. V8 \        for(j = i; j < max; j ++)                  // 减少一半循环
6 N' ]) A4 Q* d4 t5 k  J        {
7 H8 I. O$ [! O2 P$ f/ T# _            float sum = 0.0;
8 t) o' `+ q  g4 x/ {( D4 U7 q            for(k = 0; k < max; k ++)
& s0 f! q6 g  J/ S            {
& j" J% I6 Q: q7 @0 i                sum += input[i * max + k] * input[j * max + k];  }* U3 g. F( H2 v! _  ^
            }: q. Z, C5 y& |4 n3 I8 d! Z
            cover[i * max + j] = sum / max;
( q5 l9 d( w# W0 }# D3 r4 G8 I            if(i != j)                    // 可加可不加,消除中线上的重复赋值9 ?$ H0 x* \  b/ l+ I1 _
            {
: Y. v- k/ F$ `2 O; _" }                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵
9 t  F3 }8 a" p& N# X! o/ a            }
- J% U& O9 o/ ~" u1 J6 y        }* W) `+ |. \) B8 Y' E0 g9 ?
    }% \+ P) G7 B7 ~# Y6 s; v' P! V
    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)8 L$ j5 i7 g. r5 I
    k = k -1;) `: m& [' F4 M; p* I; I  S; y* ~
    if(k < -1)
# g, C3 T" A4 e. [) S4 n    {
, x( `% v" Y/ G. a        k = -1;* M4 Q) R$ S7 h9 D( j: {5 U; @
    }
5 I/ r# ^' Y4 W4 c    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。  j: v. Z; t" h' {" ]# t. B
    优化后:
5 s5 i: h/ M* C, @5 u    k = max(k-1, -1);
# R( v- Q; `8 q# y    转换成汇编后:0 E& J0 j+ a1 g8 K! \* C
    R0 += -1;    // R0 == k;
4 U' Y. V- |0 x" b& k- `8 ]    R1 = -1;9 }$ [+ s% |: b4 e: G9 p3 K
    R0 = MAX(R0, R1);
, a. W. ~' P( T4 `* f    (3)for循环中的条件跳转
0 `0 y- v0 O! S/ p    for0 g  ^/ O9 c( k
    {1 T; Y; k! \* f/ C5 Y
        if{...}else{...}; w, d; X1 C. g. Q1 l) @
    }6 [5 o" p5 N; l8 @! F
    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。
5 L, Z. {$ o/ ]% ~+ S' g    优化后:% F( ~' K3 g! {" M) r- [0 }
    if  d+ J5 m1 [7 E
    {
, D7 M; k3 |( C        for{...}
- R8 R0 g4 D- Z. T    }9 W' c; |8 y" ^5 D
    else
5 e5 I$ j  ^, n    {
$ f$ T3 I1 x% k1 L( o        for{...}
2 L/ a9 l# l( G/ H# z7 z    }
. D( f* i/ k" t+ U7 Z    (4)使用断言指令来避免条件跳转
2 }" m* p" ], G    if(A)
, l$ s! A0 W/ `% m( x    {+ ]( D1 o! Q$ t7 M( {3 r9 f
        X = exp1;; Q1 s- N: u8 X- M
     }
5 a" X9 y" A4 @+ ?  l6 r0 q' n! S    else2 ~7 j% z1 \1 t  r4 E
    {
( O  H7 y! G! |+ S        X = exp2;
+ T6 g3 y) z+ P    }    " u" \& @( R# p1 B
    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。6 c7 |9 Q+ C! l, L) _7 h- V
    优化后:
; y" Y& P3 A7 @+ S9 b3 N    X = exp1;! |8 t3 s0 ~0 k( \8 M$ Q
    if(!A)  a/ v. ?! Q! O; m& f# T
    {. i/ T" q: B  N4 y6 s0 S
        X = exp2;
+ @- S0 H& y* Q; I9 W9 I/ n1 @    }
" M6 Q" L( M4 L: Y    (5)除法(取模)操作) n* x2 m/ e* ?7 V6 C4 R
    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。
( P( }, F( h+ C: q. R    除数为2的N次方时可采用右移法。
$ B! k1 @1 S2 Q$ m5 R) o7 J    如为提高性能,可采取查表的方式,这样会损失精度。
& u7 V: [1 [, B( ]    隐藏的除法:/ g, U9 j0 Y  h3 W& w$ N  H
        for(i = start; i < finish; i += step)2 Q. i( S6 P  g& W/ Q, W4 Q
        此时编译器会looper = (finish - start) / step 得到次数。2 D, c# j# Y/ w6 d- k, k# J* k- U
    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)
- f9 V& V9 l2 U4 y8 Q* \3 I) ^        if(x / y > a / b)
1 s  e  M% a# K        可转换为:
1 ?: \9 k! u2 J8 n. q3 v        if(x * b  > a * y)! Y( f3 S: L  O1 h& W6 E, y7 e1 o8 L
    (6)数据类型( h; v( [# h% w; u$ o* z2 U- Y' ~
    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。
9 s6 b, ]# J/ v+ U# ?0 k" A    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)8 V& K; }& A9 _$ C
    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。2 L0 P. X* u) U* d" ?
    要做控制类,条件跳转时,32bit的操作是比较合适的。
, M) G( X9 Y. E8 {7 z0 v    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。
6 b& ?: n: [8 p: c5 s/ ?2 r    (7)Memory分配
% v0 \0 Q" P4 J9 @/ o    将运算比较频繁的数据和程序段放入片内Memory,开启cache。
: j+ V. `/ ^+ v6 {! D4 M    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank
" z* D- N/ s; o    (8)开启仿真软件的编译优化选项7 {3 N% W/ q/ c; R! W# H
    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。
: a; J# L# C. E9 z0 N    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。! A, Y' W/ U% q6 q+ {' _3 |) E' G
  六、总结7 H" n; s$ s( s+ A6 d
  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。5 Z0 ?- R0 R$ p' p2 b- J0 }0 [8 S
  快速入门的步骤如下:
. ]' D4 J1 o' i- N4 m1 _3 X  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。

该用户从未签到

2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!
* O) n, j5 J- Y# I1 q感谢感谢!

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 17:03 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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