找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

DSP学习经验

[复制链接]

171

主题

616

帖子

1306

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
大学毕业至今,做了三年的DSP开发,将稍许经验记录下来,分享一下。
- G) }: p+ y& Q  一、弄清DSP相关资源的来源及熟读手册
% {3 A8 E* |6 r8 g  一般主要来源于DSP芯片厂商的官方网站,虽然现在的DSP芯片厂商都提供了中文的官方网站浏览,但我建议还是上英文的网站,其一,有些资源在中文网站上没有(关于这点,我个人认为可能是中文这边的资源未及时上传),其二,一般资料很少有中文版,中文和英文版网站上下载的其实是同一个版本;再就是,要熟悉DSP芯片厂商的官方网站,开发时允分利用官方提供的资源及支持能大大地提高开发效率;最后要注意的是,一般DSP芯片厂商会开放一个技术交流论坛,里面的管理员一般都是DSP芯片厂商的开发工程师,可以以发贴的形式获取他们的技术支持。
$ H4 [  `/ D) v  还有一处资源的来源,就是跟DSP芯片厂商有合作的第三方公司(国内),这类公司跟DSP芯片厂商有很好的接触,一般相关的DSP芯片,他们都会先行做成教育开发板,这点当然主要用于教学,所以他们会有相关的中文资料及相应的demo程序,根据这点,可以很好的借鉴他们的经验及参考他们的资料及程序,其次,他们还会出售自制的仿真器,价格比原厂的会便宜,功能上肯定没有原厂出售的仿真器全面,但足以应对基本的项目开发。
6 H7 Y' [9 @6 ]  第三处仅供参照,占据国内市场最大的两家DSP厂商TI和ADI在中国都开设的相应级别的DSP培训课程,但费用昂贵,一般都是公司派遣前去学习。
' B  b/ Q( ]$ k) A4 l% J2 d  资源主要包含:3 G; t) \8 _: x
    Datasheet(数据手册,主要大体介绍一下DSP芯片的功能,内部结构及外设,软件及硬件一些简单介绍,主要作用是可以很快速的了解这款DSP)
( F4 P. G$ z' z$ |/ ~, c; G    Software Tool Manuals(这个手册主要介绍的DSP时钟、存储器、电源管理等等及所有外设的使用及注意事项,其实就是寄存器的配置,完全可以称之为DSP使用手册)8 ~: f" k4 t8 |. Z3 v
    Hardware Tool Manuals(这个手册主要是官方提供的原理图PCB的绘制)、Program Manuals(这个手册主要介绍编译器及内置C库的使用,汇编指令的使用及汇编语法的介绍,官方提供的仿真软件的使用)
# T* J: `$ T4 [% H3 z! k     Engineer to Engineer Note(工程师笔记,这个其实就是DSP芯片自己的工程师在开发这款DSP时所写的笔记,如果你有某个地方未明白,看相应的工程师笔记是最合适的). w7 N# n6 Y* Z9 H2 J
    Program Examples(主要是针对DSP不同的外设,官方提供的程序例子,包含C及汇编). j) e, G+ n4 w3 i( F6 W  S
  二、官方仿真软件及仿真器的使用(如不使用,可暂时跳过,因为有些DSP可基于开源的操作系统进行开发,例如uClinux)" `- A# z/ ], q- h& H
  使用仿真软件的方法其实很简单,一般这种软件都设计成类似VC这种,你逐个去试每个菜单下的选项,此时你如配合Examples去使用,更能加深理解,不过我建议,做DSP软件开发,先简单看一下Datasheet、Software Tool Manuals和Program Manuals这三个文档再开始熟悉仿真软件的使用,当然在你熟悉时,肯定需要去不停的再去看这些文档的。仿真器的使用并没有什么需要注意的,一般的仿真器都做了仿呆处理,所以不会插反,仿真器一般都是配合仿真软件使用。(有一点要提醒的是一般DSP开发是基于C语言,如果不会C语言,请先学习C语言)
2 X% F" E5 G7 Q9 {8 n  K- L* \( b  三、DSP最小系统的配置
# P7 Q2 A. `7 _  这部分就正式开始使用DSP了,最小系统主要指DSP的时钟及存储器系统,这时你需要对照着Software Tool Manualsh去仔细看里面的介绍及相关寄存器的配置,结合Examples及Engineer to Engineer Note,如果程序写完后,测试时钟其实很简单,用示波器直接去测量,看测量出来的时钟是否是你配置的那个数,紧接着就是测试存储器,这个测试必须写一段简单的小程序,其实主要就是测试数据总线是否能正常工作,如果在配置最小系统时出现问题,一般问题有二,一是寄存器未正确配置,解决方法是结合Examples及Engineer to Engineer Note仔细看手册,看例程,二是可能开发板上的硬件线路出了问题,解决方法是结合原理图,看线路上是否存在短路的问题,DSP工作电压是否正常等,这步可和硬件工程师一起去查。: I$ E! I- [4 v5 V  P9 W9 [
  四、DSP外设的使用/ S$ a2 i+ Q3 K$ |8 \3 {- ~" S( e' \
  其实这部分和配置最小系统一样,只不过某些外设上可能连接了其它的芯片,不同的功能连接的芯片不一样,此时你需要去看这些芯片的资料,然后开始编写代码,然后再测试,测试方法根据不同的功能也会不同,不过DSP开发最常用的就是使用示波器,如有音视频方面的,可借助摄像头,显示屏等等之类的;如中间开发遇到问题,方法还是一样,结合Examples及Engineer to Engineer Note仔细看手册,看例程,有一点要注意,千万不能怀疑不能实现,要对自己有信心。) I/ E9 h* }# l, V7 O. M
  五、DSP优化
( ~2 m+ \8 p. G7 y* E. f- D- }  其实到这一步,你已经完全可以使用DSP了,接下来,你需要加深熟悉DSP的整个内部结构,主要包含有几个多少位的MAC,有几个多少位的ALU,有几个多少位的数据寄存器等等,还有外部数据总线上连接了哪些外设,内部数据总线是怎么连接的,并且这些数据总线是多少位,这些在Datasheet会有一张很清楚的DSP结构图,还有DSP的整个Memory Map是怎样的,片上有多少Data Memory,有多少Program Memory等等,了解这些其实就是让你知道DSP的运算性能到底可以达到多少,哪些外设会通过外部数据总线传输数据,DSP内部的寄存器是怎么传输数据的,通过这些可以帮助你解决你在开发中遇到的问题,不过最主要的是帮助你对已经编写完成的代码进行优化,我个人认为的优化方法有以下几种:6 v6 N% ]9 u% ]$ K' O/ p
  1、一般编写代码首先是用C,基于C层面优化的方法,我如下举例说几种:3 ]5 I8 l" F: D
    (1)优化循环# M/ ]  X; ?. _3 M5 B' S+ o
    for(i = 0;i < max;i ++)( P6 e5 @5 J0 l5 H
     {' ]3 j/ E" s& a% P* {' B. x
        for(j = 0; j < max; j ++)1 {, I! o, ]7 O7 I
        {) ~7 {# P8 _- w
            float sum = 0.0;
: [# R8 S0 U9 f! ^3 @( O' U            for(k = 0; k < max; k ++)
, Z1 Q1 Z6 y1 {- R' ]) T8 U2 M            {; h1 p4 u! ^- ~* J" T+ `' D- Y
                sum += input[i * max + k] * input[j * max + k];
. @% r- z1 a% n9 x            }
2 ?2 c8 R4 H! s            cover[i * max + j] = sum / max;$ \  p* ]" Z6 @8 @. [/ d8 W- L
        }4 B& S0 n% z6 q1 p7 a) p
    }
. Q# z% ?) ]  A  P) ~  l, T    实例,如input[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16},得出的cover如下:  ]# ?- O4 w3 I; ]! v8 Q
     7    17   27   377 w! d4 g  m& a: ~( f
     17  43   69   95* Y- n$ f1 X% c& k/ k" ~3 J
     27  69  111  153
0 h+ A5 Z, @/ o! p     37  95  153  211
0 G1 ?8 ^. Q) p  P4 P1 p3 l+ E    图示:" K; R$ g# n# U  L6 ]- l7 S
    * E4 _9 t& m, B$ r" [
    原理:只需要得到左上角或右上角即可,然后半个矩阵赋值给另半个矩阵即可得到整个矩阵。
. ]; @) p1 ?6 j4 {2 }7 m8 c$ W    算法优化后:4 o0 x, Z$ E  o+ r/ M" d4 U
    for(i = 0; i < max; i ++)
- h' [$ q, ?$ w) B0 R    {
5 B6 K& O7 V) o$ w; U% K        for(j = i; j < max; j ++)                  // 减少一半循环. W* f9 I) o* L( P
        {* s. l2 e; }) {
            float sum = 0.0;0 H, Q* O0 e) L) B% n& Y, ?
            for(k = 0; k < max; k ++)% J$ e6 _  o9 K' Y/ z+ D
            {
) [! S/ i; f/ v3 G  \7 K1 ^2 I) Y* G                sum += input[i * max + k] * input[j * max + k];
, v# p% Z% G+ o" `" i9 G! g! Q  o            }
* a0 k# S) ~) [. L6 B1 ^; o) a            cover[i * max + j] = sum / max;  v" h! X/ Q( K  z/ m3 R
            if(i != j)                    // 可加可不加,消除中线上的重复赋值
7 L! `9 ^* w% y# `! G            {2 f/ ^2 r) @+ r0 i
                cover[j *max + i] = sum / max;       // 赋值给另半个矩阵
( ^2 D. @) @. Z            }) k2 R/ T1 u( C/ `: N
        }
0 y% h. }2 y+ _5 p    }
2 I7 ~0 ~+ a+ X2 m- U  Y    (2)条件跳转(使用条件跳转会在流水线中浪费更多的周期)( _4 O- i, B4 a0 ^  |3 K$ Y1 w
    k = k -1;# ]* H5 M9 C" b% @" D2 E* H
    if(k < -1)
) E' w8 B; J  Z4 R1 C9 Y    {8 h# s& o7 K: E. H4 K* V
        k = -1;. o$ ~, [6 H, B5 [) K
    }7 ]* \! g  g: F, H* a, s
    原理:C语言中的max函数在编译的过程中实际上实现的是DSP中的MAX指令。
% _/ t: |& z: D  u  a    优化后:  f' r5 \/ q4 \
    k = max(k-1, -1);
( p/ H9 x4 I/ d+ E( C9 j# f    转换成汇编后:1 D. w9 F5 x: _
    R0 += -1;    // R0 == k;: j) L% C  `% q) B8 X2 J/ o2 w7 H
    R1 = -1;
3 \( Y6 H! s, ^% e) X! p    R0 = MAX(R0, R1);
6 ~+ {$ @- o7 E; @; y: H9 G    (3)for循环中的条件跳转) n4 W  p* @) p  N; B
    for$ Z& y/ u1 A9 R! H' w; c5 Y
    {5 M8 p3 R8 f% B5 z: [: T4 i) E3 b
        if{...}else{...}  k+ g* v& B: K" f8 Q$ U
    }& {8 S, [* [' ~' I
    原理:减少频繁的条件跳转,当然并不是所有的情况都可以这样做。
, n) n1 Y. J9 {! B$ u+ u    优化后:
! a7 g! V0 P5 e6 h" r# z    if
$ x/ I5 e$ D, S+ D( B    {
- g, ]. m4 b  D, e        for{...}
( _8 n& J# P, p; n& Q    }8 ~2 @! `. [* S, M, [. A5 |, V
    else
1 i) E, w* U$ R    {
6 H4 H! I/ {3 @3 d, u( T        for{...}
" c& n) n. E+ V2 H3 g9 ?    }; G- [( x9 S- T! C& B, U
    (4)使用断言指令来避免条件跳转, B. V/ t0 \: h6 i8 ^
    if(A)) \3 [! _+ T. |( M+ H" P
    {
, i" K" A7 T% Z$ e+ t/ W" P        X = exp1;  G, x8 `9 [& s
     }
1 q( j& ^. {, _0 s* n' m    else5 @  W  N- |; Y% d) `
    {
1 e' x2 p% Y/ @% V! a* G- `        X = exp2;
; I- I( d6 {( y    }    
$ h( b, d1 h  B, q1 H    原理:使用断言指令IF(CC) REG = REG,只会消耗一个周期。
  V1 ^/ X$ C0 V    优化后:
5 U7 q6 \+ C% C: I! k    X = exp1;
9 y1 k, ^  B- J$ a  @    if(!A)/ S. L5 r& \; a5 \+ s0 d& A; V
    {
# u8 R9 c( w5 @! D1 ]        X = exp2;
* l' N1 u. N- X6 o* l    }
  j; B; D; K( c9 t7 w    (5)除法(取模)操作6 \- R9 ?1 [! Y" p1 V  s
    一般DSP中不支持除法,除法操作是通过仿真的方式来进行实现,有两种,分为低精度和高精度,但都需要相大多的周期。9 v4 G5 z4 ~, i
    除数为2的N次方时可采用右移法。
7 l) j. g2 T" Z1 r  G1 T    如为提高性能,可采取查表的方式,这样会损失精度。7 E5 ^, _5 x1 U% g0 C1 M3 a
    隐藏的除法:( G' b+ j; }9 i  j- a) |8 [
        for(i = start; i < finish; i += step)6 S- K8 s: n3 {7 `7 T7 J! H
        此时编译器会looper = (finish - start) / step 得到次数。
! Q* X9 y) L" K, D4 ^+ k. T    巧妙利用不等式法测:(不过可能会产生溢出,要小心使用)# V1 t7 Q. e( D# |2 o, V7 N
        if(x / y > a / b)
1 @/ Z: H4 F' n        可转换为:3 `. [( j! X( o8 m
        if(x * b  > a * y)
5 k( e+ M( @& `( v    (6)数据类型: X& U, X/ S* X4 ^% Q- {( W
    对于定点DSP而言,对于浮点的操作是用仿真的方式实现的,会消耗很多周期,所以在定点DSP上对于浮点数一般是做定点化的处理,常用的方法我举一个例子:2.5 * a,其实可以转换成80 * a >> 5,不过在定点化时需要注意防溢出。
# B" N# i4 t. ]' W$ B  \    对于64位数据,也是用仿真的方式实现的,会消耗很多周期。(一般最大仅支持32位数据)
# v1 I2 C# w/ D0 u    做数字信号处理操作时,如FFT,16bit的操作是比较合适的。0 Z) B2 s. v) P1 _1 C, X8 f6 d- p
    要做控制类,条件跳转时,32bit的操作是比较合适的。
1 y- x$ U* m% u, B    如你的DSP的MAC是16位的,做乘法时,尽量定义成16bit数据。2 H' ~. h0 b( n/ q3 `# x$ R5 s
    (7)Memory分配
! Q  ^: h1 p* n0 m; [: P5 q# b( q    将运算比较频繁的数据和程序段放入片内Memory,开启cache。
; l5 f0 b5 q9 K! ]+ `    如DSP能对SDRAM的不同4个bank可以同时访问,此时你可以将需要同时运算的数据放入不同的bank- {: d& C/ n& m2 F4 M; d
    (8)开启仿真软件的编译优化选项
' k% ?8 h' p) D2 p    在菜单相应的地方勾上即可,但值得注意时,开启自动编译优化选项后,可能会使执行的结果发生变化,所以需要测试对比一下未开编译优化选项之前的执行结果,一般来说,这个很方便,比较常用。: @# m6 H5 s8 Y7 U8 D4 p$ M
    以上8种是我常用到的优化方法,当然基于C层面算法类的优化还有很多种,这个需要慢慢积累,总结一下,一般来说先对C层面进行结构上的优化(上面的1-6均属于),然后进行Memory分配,开启仿真软件的编译优化选项,将运算频繁的程序段用汇编实现,当然如果性能满足要求,就没必要利用汇编了。9 ]- ?0 h4 B: K% [9 _4 G! b, p
  六、总结
, N5 f) J* k# F& f( |  我认为学习DSP软件开发没有什么捷径,我花了大量的文字在“弄清DSP相关资源的来源及熟读手册”上,实际上是想说,懂得获取资源是很关键的,只有熟悉手册才能完全去使用你所要开发的DSP芯片,其次DSP的主要特点就是高性能,能做一些算法类的运算,所以DSP的优化是相当重要的,关于算法优化的方法有很多种,基本可分为C结构上的优化及利用DSP的特点来进行优化,优化的学习是日易积累的,所以就要多看看相关的资料了。  G- ?  c3 ~1 L% L/ l  Q- d. v" b
  快速入门的步骤如下:: x4 R( s1 n4 u
  准备一开发板,简单熟悉一下手册及仿真软件,对照着例程看手册,然后再改例程,看是否能按你的意愿去实现,最小系统和每个外设都熟悉一边,恭喜你,你入门了,待续。。。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

162

主题

614

帖子

1255

积分

四级会员(40)

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

积分
1255
2#
发表于 2016-5-16 13:51 | 只看该作者
楼主很用心啊!
. a# k' U% K( U/ k感谢感谢!

156

主题

503

帖子

1186

积分

四级会员(40)

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

积分
1186
3#
发表于 2016-6-1 16:26 | 只看该作者

; C: k8 c4 N1 {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-21 03:15 , Processed in 0.055159 second(s), 31 queries , Gzip On.

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

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

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