找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

DSP学习经验

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。4 ^  p, e  D7 f& i9 d
  一、弄清DSP相关资源的来源及熟读手册
# n$ ]9 w4 j- x" j* a0 R- Q  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。$ Q3 h2 Y- [5 F* W
  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。+ J% K9 D' T. H
  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。0 ]) i. B2 s8 T" b, @
  资源主要包含:1 h' w9 p) r' s7 g6 O
    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)
0 s- R- O" ^$ [, ^    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)0 g2 D4 T3 c  M) ?' l
    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用)
& T( i  O7 I9 x     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的); _/ y0 {% ^8 k4 c% z1 r5 C
    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编)$ H* A7 d( t9 g, t9 Z  h6 B# g
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux): n& c2 P6 s5 ~0 T9 Y! O2 A
  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言), C: a( g1 g& [. W6 ?6 ]- Z- e$ B; Q
  三、DSP最小系统的配置
: D/ K5 [& }$ _* v. @# ~4 F/ q  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。
5 H; W* h7 O& O7 w; d7 U  四、DSP外设的使用
4 l7 T7 @; C5 k0 a* I+ q  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。
1 H2 P4 Q" i7 D& ^0 q( A0 l  五、DSP优化6 e2 P& a6 I0 B; K  J$ v- T( Y
  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:0 T0 v) v# X9 B# L# ^2 @
  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:
- V: T3 a' ~6 ?  z% H    (1)优化循环. {1 ?' V& i) N+ h6 n
    for(i = 0;i < max;i ++)
- ]% p8 U0 e' O0 E0 o* i! i& T     {. H$ r4 ?7 u* {# [8 ~1 o
        for(j = 0; j < max; j ++)# b8 Z# k8 u/ |4 ?  v" d2 @' A
        {
" Y/ d% m: o8 o. i+ u. G            float sum = 0.0;
" C$ f1 n8 `* T6 W1 c1 P$ P5 O( M            for(k = 0; k < max; k ++)  R; z$ Z& q2 W5 U) e
            {
6 s& `0 i; S) u6 S; g                sum += input[i * max + k] * input[j * max + k];  j" l. I! V- ~7 N  O; j
            }0 n( t/ r4 t4 a  E+ N) _+ e( H
            cover[i * max + j] = sum / max;9 d! ]+ p$ p2 p' k
        }; o& k) {7 c# F5 |
    }7 |" f# W- M& N' O% V( N9 P# {
    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:4 N& u2 y# P; @6 _' k4 t$ z; ?6 j
     7    17   27   37
" Z. I' A; j: g1 @6 b9 V3 M' z& q     17  43   69   95% o0 `( l3 O* L7 ~
     27  69  111  1539 D# j  A$ ]4 t4 F( d' Z  X
     37  95  153  211
+ O7 D, h# q( O0 b    图示:; h: f: R0 {. j, [' n" }
    2 F3 O# R! k5 W( O
    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。
3 N; N5 x  V( ^/ X) F    算法优化后:
# z' }4 S- L2 J9 `1 x8 b    for(i = 0; i < max; i ++)
8 ?! h* z* q( Y! H) z: j    {
( P  J9 L0 {3 Q5 ?9 v        for(j = i; j < max; j ++)                  // 减少一半循环
' F- `" s' A# J' Z        {
0 C1 N6 Q( ]$ q            float sum = 0.0;
, p* W$ H! R5 X' o2 d) |% D8 E2 c            for(k = 0; k < max; k ++)
" o! q6 z' ]  m( z& K5 t% ^            {
8 _* e1 Z6 V/ w% B                sum += input[i * max + k] * input[j * max + k];
1 |- Z) g, q5 k% \1 b            }
0 g1 Z" Q' @- @% v6 T& {            cover[i * max + j] = sum / max;# h7 u, y2 }7 Z! r/ l" k
            if(i != j)                    // 可加可不加,消除中线上的重复赋值
% D% E9 ^* S! b( }5 _7 A/ S, E            {% a+ n2 A. }5 V9 L
                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵  C: v$ \2 e$ A: @# D  h8 a* y; Z
            }/ y' u# I7 W% c- t; Y
        }
0 s* A; {6 z, y/ h    }
# H) o8 d7 s. N8 j8 r4 S7 T    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)6 E# _% d, Q: F9 B  g) b
    k = k -1;
' n9 N: \! c2 z  Q/ R) T$ }    if(k < -1)
& l' F! _  ?3 H    {
3 U, d7 a6 {- z. X: H7 c        k = -1;
$ ^( c6 v5 u, S3 b    }
* i  X0 V6 i/ T1 F8 ~: \9 \- j    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。
3 O7 j/ v) U, o6 x5 E. |; \    优化后:! S  E: [3 D( r5 U
    k = max(k-1, -1);
- A4 M4 p+ h; U& H: V) J    转换成汇编后:
- b6 A$ ~& j* n* ^" g$ X    R0 += -1;    // R0 == k;* x2 |9 H+ V7 R+ D1 M* N; Q
    R1 = -1;
: g, O$ i1 X9 }3 Y% @' h1 d$ T    R0 = MAX(R0, R1);
& Q! b+ p  A7 @    (3)for循环中的条件跳转0 U0 t6 b) m: D& `4 Q8 h2 c; n
    for
2 p: z3 [# b' I  d( R    {$ [- U4 P+ V# x/ \, _2 ~
        if{...}else{...}1 Q: d' l) d1 l/ D
    }3 Z) e: S; H+ h" c( k) B
    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。$ \4 Q* a" V% ?$ x/ s
    优化后:0 ~4 @) H- i  Q# ^& d/ H
    if( X7 e+ c6 ^7 t' c* [
    {
6 J9 z( s+ F. |: |3 V) J/ G        for{...}
) u7 S! J7 i7 k* {! P  U    }+ D) O& T) L# z7 y$ e/ `  X& B
    else
7 H9 k! m) L2 R. {- ^, {    {
- N+ a, {- J: Z        for{...}
' I/ _7 r1 e: v& C# ^    }. |6 {6 O/ ~+ Q5 B. [+ b9 ?
    (4)使用断言指令来避免条件跳转
. W% N6 u6 L% h  ^, A    if(A)
& v( d- Y8 I3 u  E0 H0 Y, z    {4 B* R$ p6 Y$ e: ?2 P
        X = exp1;# _6 t8 v( F5 E" V3 R
     }
& n, X6 [8 u8 R  {0 A$ E    else8 p: s, ^% g; o# D3 B$ F
    {
6 D. n6 L/ V; _* p1 ^/ ~        X = exp2;# K/ w" m& X: l( M% ?
    }    
7 q' w* k" C; D7 ^- X9 ?    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。* C2 ~8 A& w$ B# H4 f! h9 _
    优化后:
" O2 q4 n, c2 g/ S, A    X = exp1;0 o, y5 {9 ?# V  a$ S
    if(!A)
) T- \' V* C8 v- N    {
; \  O: S- c) ?0 v* {        X = exp2;& t( O/ p, ]9 E0 {& l
    }
% B$ D8 k8 L7 t: J4 {, B0 z$ b    (5)除法(取模)操作
$ Z* V3 K/ M1 E3 Y1 |/ }    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。- }% u0 J$ h$ N+ R) z1 F% S
    除数为2的N次方时可采用右移法。, n5 B1 k- [  D6 H: A, k4 [) [
    如为提高性能,可采取查表的方式,这样会损失精度。* T6 H) Z$ F% a9 U! X% g
    隐藏的除法:
0 u4 W. p& h5 `! @        for(i = start; i < finish; i += step)+ X* |, X, p0 ^4 G) r" N
        此时编译器会looper = (finish - start) / step 得到次数。! d. J) C/ T# }; [+ h
    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)
0 ]% T6 T$ {; _5 P+ I5 c        if(x / y > a / b), _* u; @5 m8 A% z2 e
        可转换为:( `- r( w7 w( Z% G+ J# {
        if(x * b  > a * y)
. ?+ A) J3 I; T0 `, t& f- e. d7 `    (6)数据类型: z; p0 Y8 d* o4 D
    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。4 v$ ?1 m6 D( B/ ]# n8 V( |: Q
    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)2 o+ Z% G+ y1 R2 r
    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。
# d: \7 {7 f; _* P1 {9 O1 t' z    要做控制类,条件跳转时,32bit的操作是比较合适的。
9 |" \% F8 Y7 r    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。8 H3 v1 X& T6 s
    (7)Memory分配
# W3 i; L9 @, s2 }    将运算比较频繁的数据和程序段放入片内Memory,开启cache。* C. z5 q- J* v# H6 \5 G& {. {( {
    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank& T+ P' ]: W* A' x) d% {
    (8)开启仿真软件的编译优化选项+ s9 E! v; ]% P0 B
    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。
; T4 v. g2 p; o$ z" y/ |4 N4 a    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。0 z# W% O, e8 e1 |& S0 V9 h
  六、总结
3 ~9 t0 U) Y7 |# L  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。$ D* s" H- S! f
  快速入门的步骤如下:- x8 c4 \8 G" \6 P% p
  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

162

主题

614

帖子

1255

积分

四级会员(40)

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

积分
1255
2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!
  P, [  Y( F1 a感谢感谢!

156

主题

503

帖子

1186

积分

四级会员(40)

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

积分
1186
3#
发表于 2016-6-1 16:26 | 只看该作者
6 B! n" N6 I2 K- c0 P. }4 p
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:42 , Processed in 0.057095 second(s), 32 queries , Gzip On.

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

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

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