找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

DSP学习经验

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。: ~; Y1 @: [$ Q$ z- [
  一、弄清DSP相关资源的来源及熟读手册
% n: Y5 S* t* R0 f  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。
/ z. J) O% R: H  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。) h5 g) A: \4 F7 X. X4 |5 d
  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。+ O1 c4 t+ d* ~% \
  资源主要包含:
3 ?7 K- V+ d7 N0 L    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)
' x, C. D9 o; u3 z) T; d& i    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)8 o" q5 M6 H4 N1 C! M
    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用)
  I: D6 P. y" i, S     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的)
! `/ v' w* x6 ~8 E' S    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编)  o/ a. U1 T2 C" c
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux)& K8 ]( B- Q0 H  ?
  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言)+ w1 I! ?6 C' G: c
  三、DSP最小系统的配置& M- I1 _! D7 I5 w# G1 {
  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。
5 x- K; `4 [9 _9 Y6 V  B7 f2 a  四、DSP外设的使用
- d, f! a% A: r/ D6 c# \  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。4 K( f" r0 i+ n8 [3 Q# l+ Z
  五、DSP优化
" K  g4 ^" `- d  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:! j, ]$ R7 B2 ^+ N9 c- x/ c; u
  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:: y: p7 _9 |6 g# ^: ^
    (1)优化循环
( y8 ?4 D1 G( m    for(i = 0;i < max;i ++)
) ^) a, m3 i" a6 {$ m     {# s5 {! B. v3 g  f7 ]% y& o% b5 R. G
        for(j = 0; j < max; j ++)
4 u( M" y* Z1 {0 p) Q4 d3 J        {
8 o6 A& @  `$ i            float sum = 0.0;; k2 J, d+ A% i! ^: _6 H
            for(k = 0; k < max; k ++)! K) C5 c9 J0 ]5 t3 S4 o
            {3 j% f, M: t) r# n1 R
                sum += input[i * max + k] * input[j * max + k];
6 w8 L  p" f0 E            }
. f6 y) F. e: [) |+ Q  p+ W            cover[i * max + j] = sum / max;+ f0 i4 u5 g$ v, D' z! U0 O2 Q2 o# N
        }- k- R8 p8 C/ J9 I; o4 x! P! r
    }
$ I' B& Q" x! a6 e8 \    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:5 P. c2 L' m1 H
     7    17   27   37
% F' n. U4 K2 b/ I5 B; Q9 d+ [. Z     17  43   69   95
) h0 U5 A2 f) o6 A" u& v  X     27  69  111  153; g' ~8 C. S# `* A. `/ t) D/ k4 ^
     37  95  153  2118 l- g- y% V# S8 m
    图示:
/ S& u7 C8 |0 x1 F2 c& q    4 |' M# w) i, X! Q5 V: A. l
    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。! X. i. L- @- w, E' V
    算法优化后:4 S; z# S/ z  a. j, O0 M
    for(i = 0; i < max; i ++)
& F% |+ }* T: O    {
7 F% L- P1 |  y% u! k4 {8 H        for(j = i; j < max; j ++)                  // 减少一半循环- r5 F/ r4 I- q6 P! G8 ^- E
        {2 l: z% D5 b& d2 K
            float sum = 0.0;% u" I- w- s% j& m8 s0 r% @( R3 J
            for(k = 0; k < max; k ++)
" e3 p& H# o# B- p1 R. ^4 a+ [            {
, P5 m- b5 R( ^7 A* B                sum += input[i * max + k] * input[j * max + k];7 k; e8 m- H6 P+ j6 `2 N0 f
            }
7 A+ o7 k* l: O- o  b( K            cover[i * max + j] = sum / max;
, m% ]5 c/ v* X/ ?. }            if(i != j)                    // 可加可不加,消除中线上的重复赋值
! K0 J7 y. ^$ W! I) F            {
. }) ]. O7 R+ T                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵
  |% V) ^, Y! ?# [7 o* n            }3 E' j/ l% x1 v0 f) ~# I, {: J
        }
) v5 n/ g1 g! R" [2 O1 S    }4 R: P. ~. ^+ W' w1 g- N3 {
    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)
* S0 k4 G, C7 l1 i! z$ _1 b# U    k = k -1;) x9 x& y/ C  ]; h; F" u4 @, }0 |
    if(k < -1)
% [! T. q8 Y: H8 g8 R7 m4 J% M1 R$ y    {
9 B1 L/ v  k; [# D9 d) \6 U        k = -1;
; P) j+ x3 I" d+ u    }7 ?4 p& W: l) N9 T$ o1 S- b
    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。1 @0 b9 Y* k( _1 P; V. F9 ?
    优化后:& E" i" U$ r. f' o" U
    k = max(k-1, -1);# R0 u6 L8 q* B
    转换成汇编后:3 W) s4 d4 s% ~. ]# P  `/ y9 [/ ]6 A: V
    R0 += -1;    // R0 == k;$ [. T8 q  M9 @: d, A
    R1 = -1;; g5 b- d! N" m. @1 g: y9 u$ ?
    R0 = MAX(R0, R1);
9 f' \" L2 t* v/ ]# b$ T    (3)for循环中的条件跳转6 I$ r5 ~# D. l% u, k; {2 b7 g
    for
. \/ l% o+ e8 {) @. E! b7 O; C    {6 ]" j2 o- |8 W0 {8 y+ l
        if{...}else{...}
' d) Z! l' ?1 v" v! G8 P    }- V9 P2 S% A/ ^8 I8 c+ ?) L! V, E
    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。1 C/ j" h, c( O
    优化后:
0 w9 F0 P3 ]) j+ |    if
3 Y3 L6 g/ ?# q& b3 {0 J: h$ a2 N    {
! q2 ~( t5 u$ ~        for{...}* f7 R* `2 [% Y& \0 ]
    }. Z2 Q! b( n6 v" E, o: W2 ^
    else2 Y. r% z& z  t6 P+ Q7 Q8 o# I
    {& }  W5 i3 m2 ^( ]8 l0 K! L, h
        for{...}( [; c$ y1 B  U' S0 @
    }2 @" \! {, F# m0 y
    (4)使用断言指令来避免条件跳转. ^/ r& S2 `- k. q2 r8 N
    if(A)
% A6 F0 U3 E+ l; r    {8 ^" C( q0 y# B
        X = exp1;  F5 B: i! t8 L0 l
     }
9 U- o4 E; W  Z6 s3 }" k( T    else+ h' |% ~3 t$ X  h4 v* G  @, d
    {
6 Q1 X7 W  z: u  |        X = exp2;3 H! y/ F* @# N8 s5 R! w# \
    }    ( Z! k% X& L" P, U
    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。
; B* M1 l. g! `! X8 m+ b    优化后:
2 ^2 I" V" H+ u3 }    X = exp1;. t/ v' e; L% |3 u+ C
    if(!A)( s# k# U3 v7 t, L) h4 y& ~
    {
; T! i4 @1 Q7 [        X = exp2;
2 q6 k0 X! s5 P- A% _; H% q: E    }; x) O; A* l, z: s, Z& D
    (5)除法(取模)操作# f2 |7 w) b. C/ ^
    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。' ^# t" d$ |% m$ O/ a
    除数为2的N次方时可采用右移法。7 i: ?9 c: j; `
    如为提高性能,可采取查表的方式,这样会损失精度。
3 |; u0 }' p) \8 v    隐藏的除法:
& {* E; U! l/ f0 l        for(i = start; i < finish; i += step)3 J0 O: I# L/ k) G
        此时编译器会looper = (finish - start) / step 得到次数。0 I, `' M5 x+ S7 W
    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)0 I3 b( J* S7 d. k
        if(x / y > a / b)) c( M$ D2 A3 W
        可转换为:  N+ q/ d3 Q9 c- |, }& A: j
        if(x * b  > a * y)  l+ B& G/ j# M; b4 N2 ~  y  {
    (6)数据类型$ i- o/ [8 C; Q4 D- Y# T& t5 M0 ]
    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。
1 S, p1 U3 I5 y$ h    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)2 P" _+ O0 ~' L) O* R! l
    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。  u* b( v) j! W: \& @
    要做控制类,条件跳转时,32bit的操作是比较合适的。1 l& j( V; _, l' A/ `% `9 g
    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。* m% b( O, |( @4 ~) q+ \
    (7)Memory分配
) t8 Q+ x( I. y1 A5 k    将运算比较频繁的数据和程序段放入片内Memory,开启cache。
% M) ^; {7 _0 _7 B    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank8 `  b2 X# V; ~
    (8)开启仿真软件的编译优化选项( b+ @. n4 \& v: r
    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。; S& z  _7 ~* ~- S  e1 Y
    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。2 g* L& I5 D# s* o! h
  六、总结- D  J+ _2 d  Z4 y8 t( o5 E& Y
  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。9 V, Y( D+ G7 }3 h, f* T
  快速入门的步骤如下:
$ B0 s* c. J$ P& F0 d  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

159

主题

527

帖子

1197

积分

四级会员(40)

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

积分
1197
4#
发表于 2016-6-2 15:28 | 只看该作者
谢谢O(∩_∩)O哈哈~谢谢O(∩_∩)O

156

主题

503

帖子

1186

积分

四级会员(40)

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

积分
1186
3#
发表于 2016-6-1 16:26 | 只看该作者
' p6 U5 y6 U6 W
haohao

162

主题

614

帖子

1255

积分

四级会员(40)

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

积分
1255
2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!2 x; Q4 L1 R$ Y3 [( A
感谢感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-3-11 15:43 , Processed in 0.059273 second(s), 32 queries , Gzip On.

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

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

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