1、随着 3G 技术的发展,要求处理器的速度越来越高,体积越来越小,DSP 的发展正好能满足这一发展的要求。因为,传统的其它处理器都有不同的缺陷:MCU 的速度较慢;CPU体积较大,功耗较高;嵌入 CPU 的成本较高。 DSP 的发展,使得在许多速度要求较高,算法较复杂的场合,取代 MCU 或其它处理器,而成本有可能更低。数字化的时代已经来临,对 DSP 专业人才的需求也越来越大,如今 DSP 技术和 DSP 应用已经成为当今嵌入式系统应用领域中最热门的技术,是高校、科研院所和高新技术企业的DSP 软件、硬件开发人员的新的课题。很多高校开设了 DSP 专业,很多相关专业也增设了DSP 课程,更有许
2、多业内人士在准备给自己充电的时候选择了学习 DSP。在这里,笔者就根据个人的一些经验和体会向初学者介绍一些学习方法和途径:一、选择培训有条件的朋友可以选择参加培训班,聪明的学员会做好两手准备:一是带着问题听培训,这就要求你必须提前熟悉教材,以便在听课时与老师和其他学员交流。二要珍惜老师和同学们的交流机会和以后的联系方式,一般的培训班讲师们和同学都会留下他们的联系方式,以后遇到了问题也能找行家求援了。其实培训班的意义就在于解决问题和建立今后的交流平台。在这里向大家推荐一些比较专业的培训中心:上海闻亭公司培训中心、飓风数字系统(北京)培训中心、浙江大学微系统专业技术培训中心、深圳爱华人才培训中心等
3、等。二、选对教材目前,跟 DSP 相关的教材充斥着电子图书市场,选对入门教材很关键。在这里向大家推荐个人认为比较好的书目:江思敏主编的TMS320LF240xDSP 硬件开发教程 、彭启琮等主编的DSP 的发展与应用 、朱铭锆等主编的DSP 应用系统设计 、邬可军、朱铭锆等主编的DSP 实时多任务操作系统设计与实现 、刘和平等主编的TMS320LF240xDSP C 语言开发应用 、何苏勤主编的TMS320C2000 系列 DSP 原理与应用技术 等都是比较好的教材。对于教材,我想说的是,不在于通读,初学者应该选择适合自己的教材,然后精读。 三、有自己的操作平台由于 DSP 是一门实践性很强的
4、专业,所以要想快速精通,就必须有自己的操作平台。这样既可以增强动手能力,也可以节约很多时间。所以,对于初学者来说,选择一款性价比较高的教学套件很重要。1、支持 DSP 软件开发及教学实验电机控制算法开发的评估板选择。在这里向大家推荐性能好,价格超低的评估板。CY-SOM2407 评估板,市场价只有 300 元。其硬件组成是:TMS320LF2407A 芯片 30/40MHZ;片上 32K words Flash 存储器;板上 64K words 程序存储器;板上 64K words 数据存储器;RS232 串口;单电源供电( 5V) ;符合 IEEE11.49.1标准 JTAG 接口;软件包括
5、:板上资源的测试程序、存储器测试程序、 RS232 串口测试程序、对 Flash 的编程插件“SD Flash”、支持 TI 的 CCS 软件。2、仿真器的选择。目前市场上的仿真器种类繁多,性能、价钱差别很大。建议大家选择CY-XDS510USB2.0 JTAG DSP 仿真器。因为这款仿真器采用高速版本 USB2.0 标准接口,即插即用,传输速度可达 480MB/S,向下兼容 USB1.1 主机;采用标准 JTAG 仿真接口,不占用用户资源;特别接口安全保护设计,支持全系列有 JTAG 接口的芯片;体积特小,便携方便;性能卓越 ,仿真速度快,支持 RTDX 数据交换;支持 Windows98
6、/NT/2000/XP 操作系统;支持 TI CCS2.X、支持 CCS3.1 集成开发环境,支持 C 语言和汇编语言;实现对F28x/F240x/F24x/F20x 的 Flash 可靠编程;支持 RTDX 数据交换;自动适应目标板 DSP 电压;设计独特,完全克服目标板掉电后造成的系统死机;完全解决目标板掉电后不能重起CCS 的问题;安装简单,运行稳定;最重要的是,价格低廉,才 1100 多。在这里把我的经验和体会介绍给大家,就是希望各位同行们能少走些弯路,早日成为高手。PS:我这里还有一些学习资料,有兴趣的同行们可以留下你们的邮箱,我再发给你们。初学者:DSP 网络下载开发学习板 (附图
7、)(附图) haia2004 2005-3-7 16:07:46具有独特的网络下载功能,下载迅速,可以不需要仿真器就可以下载程序运行,对于学习 DSP 来说,真可以省掉一大笔费用。学习板组成: DSP: TMS320VC5402PGE100 ,有 100MIPS 的运算能力. 以太网芯片:RTL8019AS, 通信速率为 10M,DSP 的 CPU 占用也很小。 TLC320AIC23:TI 公司出品支持最高达 96K 采样率的语音 AD/DA。 与 DSP 的 HPI 接口的 W78E54,另外 DSP 的程序也是存放在 W78E54 内。 数据 RAM: 64k * 16bit-12ns.
8、 标准 JTAG 插座,能连接各种型号的 TI 的 DSP 的仿真器。 板载 5V、3.3V、1.8V 稳压芯片,有外接电源插座,可以接 9V-20V 的交、直流电源, 四层板工艺,运行稳定可靠。 物理特性:110mm95mm提供的资料:1 提供原理图和及 DSP 的 TCPIP 协议中、协议的 C 源代码,提供你开发DSP 以太网的捷径。2 提供 WAVE 文件播放的源程序。3 提供如何把 DSP 的程序装载在 W78E54 中的工具以及如何 BOOT 的方法。4 提供示例程序,告诉你怎样运行一个工程文件,怎样下载运行5 提供通过以太网播放 WAV 的 WINDOWS C 程序和 DSP 的
9、程序。6 入门级的模板程序:最简单的发光二极管闪烁的程序,采用时间中断编程,。包括最重要的 CMD(命令文件),CPU 寄存器定义的头文件,中断向量表的样板文件, 例程的详细使用说明,万丈高楼平地起,一切都可以从这里开始。6 全部资料的光盘。0731-4552122DSP 的特点对于没有使用过 DSP 的初学者来说,第一个困惑就是 DSP 其他的嵌入式处理器究竟有什么不同,它和单片机,ARM 有什么区别。事实上,DSP 也是一种嵌入式处理器,它完全可以完成单片机的功能。唯一的重要的区别在于 DSP 支持单时钟周期的“乘- 加”运算。这几乎是所有厂家的 DSP 芯片的一个共有特征。几乎所有的 D
10、SP 处理器的指令集中都会有一条 MAC 指令,这条指令可以把两个操作数从 RAM 中取出相乘,然后加到一个累加器中,所有这些操作都在一个时钟周期内完成。拥有这样一条指令的处理器就具备了DSP 功能。具有这条指令就称之为数字信号处理器的原因在于,所有的数字信号处理算法中最为常见的算术操作就是“乘-加”。这是因为数字信号处理中大量使用了内积,或称“点积”的运算。无论是 FIR 滤波, FFT,信号相关,数字混频,下变频。所有这些数字信号处理的运算经常是将输入信号与一个系数表或者与一个本地参考信号相乘然后积分(累加) ,这就表现为将两个向量(或称序列)进行点积,在编程上就变成将输入的采样放在一个循
11、环 buffer 里,本地的系数表或参考信号也放在一个 buffer 里,然后使用两个指针指向这两个 buffer。这样就可以在一个 loop 里面使用一个 MAC 指令将二者进行点积运算。这样的点积运算对与处理器来说是最快的,因为仅需一个始终周期就可以完成一次乘加。了解 DSP 的这一特点后,当我们设计一个嵌入式系统时,首先要考虑处理器所实现的算法中是否有点积运算,即是否要经常进行两个数组的乘加, (记住数字滤波,相关等都表现为两个数组的点积)如果有的话,每秒要做多少次,这样就能够决定是否采用 DSP,采用多高性能的 DSP 了。浮点与定点浮点与定点也是经常是初学者困惑的问题,在选择 DSP
12、 器件的时候,是采用浮点还是采用定点,如果用定点是 16 位还是 32 位?其实这个问题和你的算法所要求的信号的动态范围有关。定点的计算不过是把一个数据当作整数来处理,通常 AD 采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个 16 位的 AD 去采样一个 0 到 5V的信号,那么 AD 输出的整数除以 216 再乘以 5V 就是对应的电压。在定点 DSP 中是直接对这个 16 位的采样进行处理,并不将它转换成以小数表示的电压,因为定点 DSP 无法以足够的精度表示一个小数,它只能对整数进行计算。而浮点 DSP 的优势在于它可以把这个采样得到的整数转换成小数表示的
13、电压,并不损失精度(这个小数用科学记数法来表示) ,原因在于科学记数法可以表示很大的动态范围的一个信号,以 IEEE754 浮点数为例,单精度浮点格式: 31 1 位符号 30-238 位指数 22-0023 位小数 这样的能表示的最小的数是+-2-149,最大的数是+-(2-223)*2127.动态范围为20*log(最大的数/ 最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度。原因在于定点处理处理的信号的动态范围有限,比如 16 位定点 DSP,可以表示
14、整数范围为 1-65536,其动态范围为20*log(65536/1)=96dB.对于 32 定点 DSP,动态范围为 20*log(232/1)=192dB,远小于 32 位 ieee 浮点数的 1667.6dB,但是,实际上 192dB 对绝大多数应用所处理的信号已经足够了。由于 AD 转换器的位数限制,一般输入信号的动态范围都比较小,但在 DSP 的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的 DSP。另外就是浮点的DSP 更易于编程,定点 DSP 编程中程序员要不断调整中间结果的 P,Q
15、 值,实际就是不断对中间结果进行移位调整和舍入。DSP 与 RTOSTI 的 CCS 提供 BIOS,ADI 的 VDSP 提供 VDK,都是基于各自 DSP 的嵌入式多任务内核。DSP 编程可以用单用 C,也可以用汇编,或者二者结合,一般软件编译工具都提供了很好的支持。我不想在这里多说 BIOS,VDK 怎么用这在相应的文档里说的很详细。我想给初学者说说 DSP 的 RTOS 原理。用短短几段话说这个复杂的东西也是挑战!_其实 DSP 的 RTOS 和基于其他处理器的通用 RTOS 没什么大的区别,现在几乎人人皆知的 uCOSii 也很容易移植到 DSP 上来,只要把寄存器保存与恢复部分和堆
16、栈部分改改就可以。一般在用 BIOS 和 VDK 之前,先看看操作系统原理的书比较好。uCOS 那本书也不错。BIOS 和 VDK 其实是一个 RTOS 内核函数集,DSP 的应用程序会和这些函数连接成一个可执行文件。其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个 scheduler 函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行。然后在此基础上写几个用于任务间通信的函数就可以了,比如 event,message box,等等。RTOS 一般采用抢先式的任务调度方式,举例说当任务 A 等待的资源 availab
17、le 的时候,DSP 会执行一个任务调度函数 scheduler,这个函数会检查当前任务是否比任务 A 优先级低,如果是的话,就会把它当前挂起,然后把任务 A 保存在堆栈里寄存器值全部 pop 到DSP 处理器中(这就是所谓的任务现场恢复) 。接着 scheduler 还会把从堆栈中取出任务A 挂起时的程序执行的地址,pop 到 PC,使任务 A 继续执行。这样当前任务就被任务 A抢先了。使用 RTOS 之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口。一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,
18、类似于 C 语言中的 main 函数。一个任务创建的时候,RTOS 会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样。一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS 就会从其堆栈中弹出其入口地址开始执行。有一个疑问是,不使用 RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行。那么,这种常用的方法与使用 RTOS 相比有什么区别呢?其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已。这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个 LED) ,只要他不主
19、动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如 DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁 LED 的函数执行完毕。这样就使整个 DSP 处理的优先次序十分不合理。而在使用了RTOS 之后,当一个重要的事件发生时,中断处理会进入 RTOS,并调用 scheduler,这时scheduler 会让处理这一事件的任务抢占 DSP 处理器(因为它的优先级高) 。而哪个闪烁LED 任务即使晚执行几毫秒都没任何影响。这样整个 DSP 的调度策略就十分合理。RTOS 要说的内容太多,我只能讲一下自己的一点体会吧DSP 与正(余)弦波在 DSP 的
20、应用中,我们经常要用到三角函数,或者合成一个正(余)弦波。这是因为我们喜欢把信号通过傅立叶变换映射到三角函数空间来理解信号的频率特性。信号处理的一些计算技巧都需要在 DSP 软件中进行三角函数计算。然而三角函数计算是非线性的计算,DSP 并没有专门的指令来求一个数的正弦或余弦。于是我们需要用线性方法来近似求解。一个直接的想法是用多项式拟合,这也正是大多数 DSP C 编译器提供正余弦库函数所采用的方法。其原理是把三角函数向函数空间1,x,x2,x3上投影,从而获得一系列的系数,用这些系数就可以拟合出三角函数。比如,我们在0,pi/2区间上拟合 sin,只需在 matlab 中输入以下命令:x=
21、0:0.05:pi/2;p=polyfit(x,sin(x),5)就得到 5 阶的多项式系数:p =0.00581052047605 0.00580963216172 -0.171938656853600.00209002716293 0.99969270087312 0.00000809543448于是在0,pi/2区间上:sin(x)= 0.00000809543448+0.99969270087312*x+ 0.00209002716293*x2-0.17193865685360*x3+0.00580963216172*x4+0.00581052047605*x5于是在 DSP 程序中,
22、我们可以通过用乘加(MAC )指令计算这个多项式来近似求得 sin(x)当然如果用定点 DSP 还要把 P 这个多项式系数表用一定的 Q 值来改写成定点数。这样的三角函数计算一般都需要几十个 cycle 的开销。这对于某些场合是不能容忍的另一种更快的方法是借助于查表,比如,我们将0,pi/2分成 32 个区间,每个区间长度就为 pi/64,在每个区间上我们使用直线段拟合 sin 曲线,每个区间线段起点的正弦值和线段斜率事先算好,存在 RAM 里,这样就需要在在 RAM 里存储 64 个常数:32 个起点的精确的正弦值(事先算好): s32=0,sin(pi/64),sin(pi/32),sin(pi/16).32 个线段的斜率: f32=0.049,.对于输入的每一个 x,先根据其大小找到所在区间 i,通常 x 用定点表示,一般取其高几位就是系数 i 了,然 后通过下式即可求出 sin(x):sin(x)= s*f这样一般只需几个 CYCLE 就可以算出正弦值,如果需要更高的精度,可以将区间分得更细,当然,也就需 要更多的 RAM 去存储常数表。事实上,不仅三角函数,其他的各种非线性函数都是这样近似计算的。