浅谈如何学习DSP软件开发(dsp怎么学)

浅谈如何学习DSP软件开发(dsp怎么学),第1张

对于学习DSP重要的是理清外设的工作构架,相应的寄存器如何设置,没有必要对寄存器花太多的时间去研究,用的时候能找到(寄存器的名称都是英文的缩写,很好理解的)

学习DSP,先找本中文教材入个门,之后你会发现好多地方、尤其是真正要用的,往往也是最复杂的地方书上都找不到,更谈不上做什么项目了,这时候就要开始深入研究DataSheet,以及官网的源代码示例有了之前的中文教材基础看起来就快多了;学习DSP重要的不是会编程,而是算法的研究(Matlab/Simulnk仿真就不

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动态范围为20log(最大的数/最小的数)=16676dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20log(65536/1)=96dB对于32定点DSP,动态范围为20log(2^32/1)=192dB,远小于32位ieee浮点数的16676dB,但是,实际上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的应用程序会和这些函数连接成一个可执行文件其实实现一个简单的多任务内核并不复杂,首先定义好内核的各种数据结构,然后写一个scheduler函数,功能是从所有就绪任务中(通过查找就绪任务队列或就绪任务表)找出优先级最高的任务,并恢复其执行然后在此基础上写几个用于任务间通信的函数就可以了,比如event,message box,等等

RTOS一般采用抢先式的任务调度方式,举例说当任务A等待的资源available的时候,DSP会执行一个任务调度函数scheduler,这个函数会检查当前任务是否比任务A优先级低,如果是的话,就会把它当前挂起,然后把任务A保存在堆栈里寄存器值全部pop到DSP处理器中(这就是所谓的任务现场恢复)接着scheduler还会把从堆栈中取出任务A挂起时的程序执行的地址,pop到PC,使任务A继续执行这样当前任务就被任务A抢先了

使用RTOS之后,每个任务都会有一个主函数,这个函数的起始地址就是该任务的入口一般每个任务的主函数里有一个死循环,这个循环使该任务周期地执行,完成一部分算法模块的功能,其实这个函数跟普通函数没任何区别,类似于C语言中的main函数一个任务创建的时候,RTOS会把这个函数入口地址压入任务的堆栈中,好象这个函数(任务)刚发生过一次中断一样一旦这个新创建任务的优先级在就绪队列中是最高的,RTOS就会从其堆栈中d出其入口地址开始执行

有一个疑问是,不使用RTOS,而是简单使用一个主循环在程序中调用各个函数模块,一样可以实现软件的调度执行那么,这种常用的方法与使用RTOS相比有什么区别呢其实,使用主循环的方法不过是一种没有优先级的顺序执行的调度策略而已这种方法的缺点在于,主循环中调用的各个函数是顺序执行的,那么,即使是一个无关紧要的函数(比如闪烁一个LED),只要他不主动返回,也会一直执行直到结束,这时,如果发生一个重要的事件(比如DMA buffer full 中断),就会得不到及时的响应和处理,只能等到那个闪烁LED的函数执行完毕这样就使整个DSP处理的优先次序十分不合理而在使用了RTOS之后,当一个重要的事件发生时,中断处理会进入RTOS,并调用scheduler,这时scheduler 会让处理这一事件的任务抢占DSP处理器(因为它的优先级高)而哪个闪烁LED任务即使晚执行几毫秒都没任何影响这样整个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中相应的函数入口地址运行。

以上就是关于浅谈如何学习DSP软件开发(dsp怎么学)全部的内容,包括:浅谈如何学习DSP软件开发(dsp怎么学)、DSP学习入门、DSP编程中的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10133736.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存