㈠ 怎么学dsp编程
接手别人的程序的话,看懂没有用的,自己建立个工程,一点一点自己写一写程序,就有感觉了。和DSP相关的芯片的话,拿着原理图找图上的芯片的datasheet看。DSP有很多模块,我是习惯用到哪块看哪块,不然太多了……DSP的编程和单片机差不多,都是配置寄存器,看懂寄存器都在完成什么配置,就能写出基本的驱动程序了,然后逻辑方面和VC上差不多。不过,调试DSP和PC机上程序最大的不一样就是,它是硬件相关的,调试的时候有问题,既可能是软件是问题,也可能是硬件问题,反正总是要拿着示波器慢慢找~~
㈡ 请问DSP编程软件是什么,,应该用什么编程语言
DSP的编程软件是CCS开发平台,编程语言一般是C语言。
CCS有两种工作模式:
1、软件仿真器模式:可与DSP芯片分离,并在PC上模拟DSP指令集和工作机制,主要用于早期算法的实现和调试。
2、硬件在线编程模式:可以在DSP芯片上实时运行,结合硬件开发板的在线编程和调试应用程序。
CCS的开发系统主要由以下组件构成:
1、TMS320C54x集成代码生成工具。
2、CCS集成开发环境。
3、DSP / BIOS实时内核插件及其应用程序接口API。
4、RTDX插件,用于实时数据交换和相应的程序接口API。
5、TI以外的第三方提供的各种应用程序模块插件。
(2)dsp编程扩展阅读:
dsp编程中双重循环、多重循环的优化:
1、将多个循环分成单层循环以减少循环数;
例如,在双循环中,一个周期仅使用一个乘法器。 分成单层环路后,两个乘法器可以使用一个周期,充分利用DSP乘法器资源,运算速度也将提高。
2、循环次数少的放在外层循环,循环次数多的放在内存循环;
3、二维数组的双循环:二维数组的行循环置于外循环,列循环置于内循环;
4、避免在循环内进行乘法和除法运算:将循环内的乘法和除法运算尽可能移至循环外,并用加法代替。
㈢ 单片机和DSP在编程方面,有哪些不同
用51单片机,编程时,也要注意存储单元的分配。
DSP对数据处理的规模,要远远大于51单片机,时常要扩充芯片。
所以,存储空间,弄不好,就会越界。
51单片机的数据,要少的多,难得使用扩充芯片。
DSP开发,对象一般是声音、图像等,重要的是算法。
一般要先掌握《数字信号处理》、离散傅里叶变换、卷积等等知识。
51单片机,主要是逻辑处理,有中学的知识,就够用了。
另外,两者的编程软件、下载方法、调试方法,都有不同。
㈣ 关于dsp编程
到网站上下载一些例程,一般是关下各个模块的配置及使用子程序,入口很有帮助!
㈤ DSP学习入门
DSP学习入门:
DSP的特点 :
对于没有使用过DSP的初学者来说,第一个困惑就是DSP其他的嵌入式处理器究竟有什么不同,它和单片机,ARM有什么区别.事实上,DSP也是一种嵌入式处理器,它完全可以完成单片机的功能.。
唯一的重要的区别在于DSP支持单时钟周期的"乘-加"运算.这几乎是所有厂家的DSP芯片的一个共有特征.几乎所有的DSP处理器的指令集中都会有一条MAC指令,这条指令可以把两个操作数从RAM中取出相乘,然后加到一个累加器中,所有这些操作都在一个时钟周期内完成.拥有这样一条指令的处理器就具备了
DSP功能:
具有这条指令就称之为数字信号处理器的原因在于,所有的数字信号处理算法中最为常见的算术操作就是"乘-加".这是因为数字信号处理中大量使用了内积,或称"点积"的运算.无论是FIR滤波,FFT,信号相关,数字混频,下变频.所有这些数字信号处理的运算经常是将输入信号与一个系数表或者与一个本地参考信号相乘然后积分(累加),这就表现为将两个向量(或称序列)进行点积,在编程上就变成将输入的采样放在一个循环buffer里,本地的系数表或参考信号也放在一个buffer里,然后使用两个指针指向这两个buffer.这样就可以在一个loop里面使用一个MAC指令将二者进行点积运算.这样的点积运算对与处理器来说是最快的,因为仅需一个始终周期就可以完成一次乘加.
了解DSP的这一特点后,当我们设计一个嵌入式系统时,首先要考虑处理器所实现的算法中是否有点积运算,即是否要经常进行两个数组的乘加,(记住数字滤波,相关等都表现为两个数组的点积)如果有的话,每秒要做多少次,这样就能够决定是否采用DSP,采用多高性能的DSP了.
浮点与定点 :
浮点与定点也是经常是初学者困惑的问题,在选择DSP器件的时候,是采用浮点还是采用定点,如果用定点是16位还是32位?其实这个问题和你的算法所要求的信号的动态范围有关.
定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压.在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算.
而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,
单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数
这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.动态范围为20*log(最大的数/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度.原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20*log(65536/1)=96dB.对于32定点DSP,动态范围为20*log(2^32/1)=192dB,远小于32位ieee浮点数的1667.6dB,但是,实际上192dB对绝大多数应用所处理的信号已经足够了。
由于AD转换器的位数限制,一般输入信号的动态范围都比较小,但在DSP的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的DSP.另外就是浮点的DSP更易于编程,定点DSP编程中程序员要不断调整中间结果的P,Q值,实际就是不断对中间结果进行移位调整和舍入.。
DSP与RTOS:
TI的CCS提供BIOS,ADI的VDSP提供VDK,都是基于各自DSP的嵌入式多任务内核.DSP编程可以用单用C,也可以用汇编,或者二者结合,一般软件编译工具都提供了很好的支持.我不想在这里多说BIOS,VDK怎么用这在相应的文档里说的很详细.我想给初学者说说DSP的RTOS原理.用短短几段话说这个复杂的东西也是挑战!
其实DSP的RTOS和基于其他处理器的通用RTOS没什么大的区别,现在几乎人人皆知的uCOSii也很容易移植到DSP上来,只要把寄存器保存与恢复部分和堆栈部分改改就可以.一般在用BIOS和VDK之前,先看看操作系统原理的书比较好.uCOS那本书也不错.
BIOS和VDK其实是一个RTOS内核函数集,DSP的应用程序会和这些函数连接成一个可执行文件.其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个scheler函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行.然后在此基础上写几个用于任务间通信的函数就可以了,比如event,message box,等等.
RTOS一般采用抢先式的任务调度方式,举例说当任务A等待的资源available的时候,DSP会执行一个任务调度函数scheler,这个函数会检查当前任务是否比任务A优先级低,如果是的话,就会把它当前挂起,然后把任务A保存在堆栈里寄存器值全部pop到DSP处理器中(这就是所谓的任务现场恢复).接着scheler还会把从堆栈中取出任务A挂起时的程序执行的地址,pop到PC,使任务A继续执行.这样当前任务就被任务A抢先了.
使用RTOS之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口.一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,类似于C语言中的main函数.一个任务创建的时候,RTOS会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样.一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS就会从其堆栈中弹出其入口地址开始执行.
有一个疑问是,不使用RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行.那么,这种常用的方法与使用RTOS相比有什么区别呢?其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已.这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个LED),只要他不主动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁LED的函数执行完毕.这样就使整个DSP处理的优先次序十分不合理.而在使用了RTOS之后,当一个重要的事件发生时,中断处理会进入RTOS,并调用scheler,这时scheler 会让处理这一事件的任务抢占DSP处理器(因为它的优先级高).而哪个闪烁LED任务即使晚执行几毫秒都没任何影响.这样整个DSP的调度策略就十分合理。
㈥ dsp 用什么编程
CCS
CCS有两种工作模式:
1、软件仿真器模式:可以脱离DSP芯片,在PC机上模拟DSP的指令集和工作机制,主要用于前期算法实现和调试。
2、硬件在线编程模式:可以实时运行在DSP芯片上,与硬件开发板相结合在线编程和调试应用程序。
CCS的开发系统主要由以下组件构成:
① TMS320C54x集成代码产生工具;
② CCS集成开发环境;
③ DSP/BIOS实时内核插件及其应用程序接口API;
④ 实时数据交换的RTDX插件以及相应的程序接口API;
⑤ 由TI公司以外的第三方提供的各种应用模块插件。
(6)dsp编程扩展阅读
dsp编程中双重循环、多重循环的优化:
(1)多重循环拆成单层循环,减少循环层数;
例如,双重循环内一个cycle只使用了一个乘法器,拆成单层循环后,一个cycle可使用2个乘法器,充分利用DSP乘法器资源,同时运算速度也会加快;
(2)循环次数少的放在外层循环,循环次数多的放在内存循环;
(3)二维数组的二重循环:二维数组的行循环放在外层循环,列循环放在内层循环;
(4)避免循环内部的乘除运算:循环内部的乘除运算尽量移到循环外部以及用加法替代。
㈦ DSP 编程方法
因为课题需要,所以跟dsp打上了交道。大概从今年的8月份开始了解dsp。
那个时候中文书籍好像不是很多,就从网上下载ti的一些基本手册和几本大
黄皮书。因为以前基本没接触过,所以没搞dsp之前觉得dsp好深奥好难,看
了一段时间书以后,开始使用ccs仿真一些程序。现在回头看看ccs的软仿真
一般只能仿真算法的对错,对于算法的效率和其他一些性能的仿真基本没有
什么意义。可惜刚上手的时候我对这个不太清楚,就一直在ccs的软仿真上
浪费了太多时间,总想通过ccs下的profiler观测值来提高程序效率,结果
和后来在实际板子上跑出来的效果大相径庭。大概到了国庆假期结束,开始
画电路板,11月初拿到电路板开始漫长的调试过程。早听人说过调硬件是一
件很苦恼又很无奈的事,因为好多问题没有道理可讲。第一块板子是一块小
的实验板,制版焊接到调试一次通过,我就感觉调试硬件没什么特别难的。
结果后来的事实让我体验到了调试硬件的艰苦。第二块板子也很快做完了,
结果上电后总进不去ccs。折腾了两天,挨个管脚测,后来又和第一次做得
板子进行比较,发现一些中断引脚没有拉高,估计可能是这方面的原因。把
这些中断管脚拉高以后,ccs顺利进去了。后来又遇到了很多问题,每次都要
花上两三天时间才能把问题找出来。到现在电路基本能跑起来,但还有些不太
稳定,原因还需要慢慢琢磨。
在调试过程中,能多找一些身边的高手问就尽量找,这样有两个好处,一
能节省你的时间,二可以从高手那里得到一些经验。其次如果电路在调试过程
中老出问题,先检查程序,确认程序没有问题以后,在查硬件电路,这样一个
顺序效率比较高。再就是多留意一下bbs上的信息,有的信息可能现在对你
没多少用处,但是可能在以后会用到。
还有一些具体经验,以后有时间在总结了 *^_^*
学习DSP可能需要时间很长,不是短期可以解决的。
我的建议:
1。看网上资料;
2。用DSK来练手;
3。如果你连硬件经验都没有,那就得先练焊板子,哈哈
4。找人请教
我的唯一感受,如果你想学深些的话:
1.多看TI的pdf,多多宜善,权威而且全面
2.硬件上,多做项目,包括单片机的、一般电路的都行
3.软件上,一般的编程不说了,编译原理之类的对混合编程很有帮助的
4.其它东西,就是那些随着DSP的出现才流行的东西,如DSP/BIOS,CPLD技术等
其实也没什么诀窍,我现在还是照着上面学,离目标还差得远
㈧ DSP编程软件
做DSP MATLAB是首选,它提供很多强大的工具箱,有很多分析用到的函数,可以以多种形式输出结果,用c的话还要自己去写很多函数,耗费时间太长,一般只适合做某个算法的验证。
㈨ 新手学习DSP的C语言编程,请高手指点:
C6713没用过,我用过TMS320F2812的芯片。建议你先熟悉一下CCS开发环境,然后再认真的看代码。TI的DSP,封装了很多的头文件,没有必要全部都要看看头文件里是怎么写的。最好先把整个程序的运行流程看懂。然后结合芯片手册,看看每一步怎么做的,是如何通过配置寄存器、如何使用外设等等。关键还是看芯片手册。等熟悉了之后,再深入看头文件啥的。
㈩ DSP编写程序
这几句是将FLASH中的程序COPY到RAM中运行,通常的目的是加快程序的运行速度,通常有两种情况需要这样去操作:
1、程序中对基要求比较高的函数,如中断;
2、程序需要对FLASH进行操作,这时就要把程序先复制到RAM中运行然后才能对FLASH操作。
RamfuncsLoadStart、RamfuncsLoadEnd、RamfuncsRunStart这三个变量是在CMD文件中创建的,创建方式如下:
LOAD_START(RamfuncsLoadStart),
LOAD_END(RamfuncsLoadEnd),
RUN_START(RamfuncsRunStart),
分别表示了装载函数的首地址,装载函数的结束地址和装载函数的运行地址;
执行完MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);后,便将FLASH中相关的程序COPY到了RAM中,之后的程序运行时,只要调用FLASH中RamfuncsLoadStart地址开始的相关函数,系统都会自动地指向RAM中相应的函数入口地址运行。
求采纳为满意回答。