1)选好自己的工具和平台学DSP当然首先要选择一款DSP(这里主要说TI的DSP,AD公司的不熟这里就不说了)。如果是个人学习的话主要看个人需要和应用场合,比如做图像处理那当然首推TI6000了,初学者不必将DSP分出三六九等,各个系列没有明显的优劣,但有明确的应用领域,2000偏接口控制,5000偏语音,6000适合做大数据量信号处理,比如图像、雷达等等。初学者最好有个开发板,不然无异于纸上谈兵,2000、5000的开发板相对便宜,6000的就比较昂贵。
就上手容易度来说,我个人觉得6000更易上手,6000的结构较2000、5000明了清晰,硬件上的条条框框比较少,你不需要看很多的硬件结构资料就能着手编程,这个大概是技术的进步吧。不过还是这句话,应用场合决定你的选择。
2)自己先动手
初学者如果会C语言语法,在看过一些资料后就可以着手写自己的第一个程序,如果写不出来,看看TI最初级的例程,完成自己第一个程序。我给我们单位新同事做6000培训的时候,给他们的第一个题目就是写一个程序让LED灯不停闪烁,这个灯可能接在GPIO上或者通过EMIF译码与FPGA配合控制(后者可能更有意义),更进一步的程序是控制闪烁的频率。我比较喜欢让他们用GPIO和EMIF,它们可能是6000里最简单和用的最多的外设了,它们是初学者最早要攻克的堡垒。
初学者往往对硬件结构和软件的配合没有概念,对片内存储空间、片外存储空间、片上外设这些概念没有实在的理解,这些概念需要自己的反复的思考、反复的实验、反复的体会才能最终搞清楚,这些弄明白了你也就入门了。
初学者比较忌讳看太多和太复杂的例程,看得太多你的思绪会比较乱,看得太复杂你会心浮气躁,复杂的例程一般它都有相对复杂的编程结构,这个初学者是很难体会到的,所以刚开始不要看,等你写了20到30个程序的时候再试着看相对复杂的例程。
3)多动手
这个不用多说了,光看不练假把式。
4)片上外设
这里拿DM642来说,我把常用的外设由简单到复杂排个序:GPIO-TIMER-EDMA-EMIF-I2C-MCASP-VideoPort-EMAC、MDIO,MCASP我没用过,不过看过资料感觉不复杂,我给初学者的建议是先把前面4个学清楚,可以先学GPIO这个真的是简单,刚开始不要急着用CSL,用汇编或是C写个程序让某个GPIO脚上输出波形,这样有助于理解片上外设以及有关的概念。前面4个明白了后面的具体用到再学,这个时候你可以看TI相应的例程,拿来用就可以。
5)汇编、C和线性汇编
现在开发6000的标准流程是先用C写,C的好处很多这里不说了,有太多的**在论述,不过对于准备做优化的同志们来说,汇编不会也不行,用汇编相对于C更助于你理解6000的架构,很多初学者对C语言中用指针对某个空间操作不理解,用汇编写的话相对要好理解的多。
大家不必对汇编心存畏惧,其实它也很简单,只不过它比较晦涩,用它开发整个系统的时间上的花费太多,不过关键算法的优化有时还是离不开它,TI目前还提供线性汇编,它是汇编和C的折中,兼备汇编的效率和C的易开发性。
汇编和C都只是工具,关键还是你对架构的理解和编程理念,所以选择哪个都有道理,通过工具去探索架构而已。我个人觉得初学者主要应学习C,毕竟它是主流,可以用汇编写4-5个小程序,熟悉它的语法就行,日后用它做优化也不会什么都不知道,而且也助于对硬件架构的理解。
结束
就写这么多了,一家之言,里面有很多废话,希望对初学者有点帮助,抛砖引玉,也希望高手们多多写出自已的经验。
优化一起放过来了~~~
关于优化我的经验是这样的:
一、首先考虑从系统结构上优化,比如尽量减少待处理数据的无谓搬移,考虑你DSP片内存储量和每次处理数据量对系统结构优化,这部分的优化应该最早做;
二、其次从算法层面上着手,看采用的算法有没有更好更简单的计算方法,算法是否有某种对称性,可否采用更合适的数据结构等等,这方面的优化比程序上的优化更明显;
三、如果算法层面暂时无更好的优化办法,看看软件结构能否优化。
比如:
1)多层的循环结构能否减层。我经常看到这样的程序:
for(i = 0; i++; i< A)
for(j = 0; j++ j< B)
{
E[j] = C[j] - D[j];
}
这个可以优化成:
for(i = 0; i++; i<A*B)
{
E = C - D;
}
2) 关键循环结构中的条件、跳转指令应尽量避免,哪怕会增加一些循环次数,循环中没有条件指令优化器更容易优化;
3)关键循环不要调用子函数
其它还有一些,具体可以看看手册,手册上讲的很清楚
四、结合DSP系统的硬件结构优化
1)看你处理的数据是放在片内还是片外,如果放在片外的话这个建议将数据分块分批倒入片内处理,类似于流水结构;
2)针对外部数据可对L2 cache优化
五、结合DSP优化器、指令系统等进行优化
这部分可以详细的看TI的手册,大概有这几个方法:
1)优化选项,-o3 -pm 取消-g 等等这些选项,如果你的软件结构很好,那么它们的优化效果很明显;
2)加一些优化指示符指导优化,这部分看手册,包括存储地址无关性,SIMD(单指令多数据处理)等等;
3)用一些专用指令,比如6000提供饱和加、溢出减指令,可以不必用条件判断;
4)如果效果还是不好,用线性汇编改写你的程序,将你的优化思想用线性汇编表述出来,一般到地步就可以了;
5)如果线性汇编优化未能尽显你的优化思想,那就汇编吧,优化器不会再帮助你优化,完全是你自己控制程序了,自己做软件流水吧;
这部分需要有比较丰富的优化经验和扎实的优化功底,多多积累,多看资料。
最后要重点说下:
优化是没有止境的,在对程序对细致优化前要对程序每个部分测试下时间,对非常耗时的部分做优化,一但满足你的要求就可以,不要为了优化而优化,我们应该有更重要的东西要学,不要陷在优化上而不能自拔!!
|