Ⅰ 在DSP中如何打开中断使能寄存器
第一:不同的外设有各自不同的中断控制寄存器,可以对该设备对应的中断进行使能或者禁止!请查阅相关外设说明。第二:中断在PIE寄存器里需要进行使能,共12组。在这12组里找到你所使用的中断进行使能。第三:有对中断进行全局使能或者禁止的命令。基本就在这三个地方进行设置!
Ⅱ dsp中的FFT是如何实现信号的倒序输入
DSP处理器与通用处理器的比较
考虑一个数字信号处理的实例,比如有限冲击响应滤波器(FIR)。用数学语言来说,FIR滤波器是做一系列的点积。取一个输入量和一个序数向量,在系数和输入样本的滑动窗口间作乘法,然后将所有的乘积加起来,形成一个输出样本。
类似的运算在数字信号处理过程中大量地重复发生,使得为此设计的器件必须提供专门的支持,促成了了DSP器件与通用处理器(GPP)的分流:
1 对密集的乘法运算的支持
GPP不是设计来做密集乘法任务的,即使是一些现代的GPP,也要求多个指令周期来做一次乘法。而DSP处理器使用专门的硬件来实现单周期乘法。DSP处理器还增加了累加器寄存器来处理多个乘积的和。累加器寄存器通常比其他寄存器宽,增加称为结果bits的额外bits来避免溢出。
同时,为了充分体现专门的乘法-累加硬件的好处,几乎所有的DSP的指令集都包含有显式的MAC指令。
2 存储器结构
传统上,GPP使用冯.诺依曼存储器结构。这种结构中,只有一个存储器空间通过一组总线(一个地址总线和一个数据总线)连接到处理器核。通常,做一次乘法会发生4次存储器访问,用掉至少四个指令周期。
大多数DSP采用了哈佛结构,将存储器空间划分成两个,分别存储程序和数据。它们有两组总线连接到处理器核,允许同时对它们进行访问。这种安排将处理器存贮器的带宽加倍,更重要的是同时为处理器核提供数据与指令。在这种布局下,DSP得以实现单周期的MAC指令。
还有一个问题,即现在典型的高性能GPP实际上已包含两个片内高速缓存,一个是数据,一个是指令,它们直接连接到处理器核,以加快运行时的访问速度。从物理上说,这种片内的双存储器和总线的结构几乎与哈佛结构的一样了。然而从逻辑上说,两者还是有重要的区别。
GPP使用控制逻辑来决定哪些数据和指令字存储在片内的高速缓存里,其程序员并不加以指定(也可能根本不知道)。与此相反,DSP使用多个片内存储器和多组总线来保证每个指令周期内存储器的多次访问。在使用DSP时,程序员要明确地控制哪些数据和指令要存储在片内存储器中。程序员在写程序时,必须保证处理器能够有效地使用其双总线。
此外,DSP处理器几乎都不具备数据高速缓存。这是因为DSP的典型数据是数据流。也就是说,DSP处理器对每个数据样本做计算后,就丢弃了,几乎不再重复使用。
3 零开销循环
如果了解到DSP算法的一个共同的特点,即大多数的处理时间是花在执行较小的循环上,也就容易理解,为什么大多数的DSP都有专门的硬件,用于零开销循环。所谓零开销循环是指处理器在执行循环时,不用花时间去检查循环计数器的值、条件转移到循环的顶部、将循环计数器减1。
与此相反,GPP的循环使用软件来实现。某些高性能的GPP使用转移预报硬件,几乎达到与硬件支持的零开销循环同样的效果。
4 定点计算
大多数DSP使用定点计算,而不是使用浮点。虽然DSP的应用必须十分注意数字的精确,用浮点来做应该容易的多,但是对DSP来说,廉价也是非常重要的。定点机器比起相应的浮点机器来要便宜(而且更快)。为了不使用浮点机器而又保证数字的准确,DSP处理器在指令集和硬件方面都支持饱和计算、舍入和移位。
5 专门的寻址方式
DSP处理器往往都支持专门的寻址模式,它们对通常的信号处理操作和算法是很有用的。例如,模块(循环)寻址(对实现数字滤波器延时线很有用)、位倒序寻址(对FFT很有用)。这些非常专门的寻址模式在GPP中是不常使用的,只有用软件来实现。
6 执行时间的预测
大多数的DSP应用(如蜂窝电话和调制解调器)都是严格的实时应用,所有的处理必须在指定的时间内完成。这就要求程序员准确地确定每个样本需要多少处理时间,或者,至少要知道,在最坏的情况下,需要多少时间。
如果打算用低成本的GPP去完成实时信号处理的任务,执行时间的预测大概不会成为什么问题,应为低成本GPP具有相对直接的结构,比较容易预测执行时间。然而,大多数实时DSP应用所要求的处理能力是低成本GPP所不能提供的。
这时候,DSP对高性能GPP的优势在于,即便是使用了高速缓存的DSP,哪些指令会放进去也是由程序员(而不是处理器)来决定的,因此很容易判断指令是从高速缓存还是从存储器中读取。DSP一般不使用动态特性,如转移预测和推理执行等。因此,由一段给定的代码来预测所要求的执行时间是完全直截了当的。从而使程序员得以确定芯片的性能限制。
Ⅲ dsp中有句话”存储器映射寄存器”是什么意思
dsp中有句话“存储器映射寄存器”,英语是
memory
mapped
register
不过这个东西并非dsp独有,单片机和其他32位嵌入式控制器都有此概念。
需要注意的是英语的表述,其实汉语的翻译是有些问题的。memory
mapped
是用来形容register的。因此,正确的翻译应该是-存储器映射的寄存器。一字之差,就有很大区别。因为”存储器映射寄存器“让人感觉是一种操作,象一个动词。其实应该是一个名词,就是一个寄存器,只是这个寄存器的地址被存储器映射了。
首先是寄存器的概念,寄存器不是存储器(内存),存储器是指通用的ram,寄存器则是有专门用途的
映射存储寄存器
ram。寄存器不能随便写数据。同时位置(硬件上)与通用的ram(存储器)不在一起。
存储器映射,就是把存储器的地址给寄存器用,你要找这个寄存器,就用这个存储器地址,然后单片机会帮你”映射“到你想找的寄存器。
物理上这个寄存器不属于内存(memory),但在逻辑地址上它属于内存。这样做的好处应该是能够用要使用访问内存的指令访问寄存器,使操作方式多样化,同时整个存储系统的地址也相对统一。
Ⅳ dsp寄存器溢出后寄存器的值是多少
根据数字信号处理算法的特点,对芯片内部结构进行了特定的优化;它主要应用是实时地实现各种数字信号处理算法。其中滤波运算的特点是大量的乘加运算;频繁的访问存储器;FFT运算的特点是碟形运算,码位倒置以及大量的乘加、减运算,其中样本按码位倒置的顺序排列,DSP处理器应具有对应的寻址方式,否则读取样本将花费大量的时间频繁的访问存储器,读取系数和样本,保存结果。大多数信号处理算法都是由滤波、变换、卷积和相关等一些基本的运算构成;
很多信号处理任务都要求在限定的时间内完成,即是信号处理的实时性要求。
Ⅳ DSP 如何将寄存器变量定位到存储器物理地址
将寄存器变量定位到存储器物理地址方法如下
unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00
unsigned char temp_B@0x100; //定义无符号变量temp_B,强制其地址为0x100
@tiny unsigned char temp_C; //定义无符号变量temp_C,由编译器自动在地址小于0x100的RAM中为其分配一个地址
@near unsigned char temp_D; //定义无符号变量temp_D,由编译器自动在地址大于0xFF的RAM中为其分配一个地址
另外也可以采用伪指令"pragma"将函数或者变量定义到指定的section中,例如:
#pragma section [name] // 将下面定义的未初始化变量定义到.name section中
Unsigned char data1;
Unsigned int data2;
Ⅵ 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的寄存器定义
你把光标放在gpiodataregs上,然后地下就会出现一个小框,点那个小框就转到定义了,好像叫system control文件
Ⅷ 三角波比较DSP软件实现方法 epwm寄存器怎么设
参考TI的datasheet或者参考国内学者翻译过来的一些DSP教程。一般顺序是:先配置时间基准TB寄存器;再配置控制寄存器CTR;再配置PWM脉冲生成方式,CMPA和CMPB;然后配置死区设置DB,最后在配置终端触发方式。
Ⅸ C语言中结构体和共用体怎样运用在DSP的寄存器定义上
cmd配置文
在软件上的运用主要是使用了位定义和寄存器文件结构方法
而寄存器文件结构的空间分配就压使用#gragma DATA_SECTTION(symbol,"section name")
在C++语言中编程方式为:
#gragma DATA_SECTION("section name")
共同体的使用
位区定义方法允许用户直接对寄存器的某位进行操作,但有时还是需要将整个寄存器作为一个值操作。
为此引入共同体,使寄存器的各位可以作为一个整体操作。
位区和寄存器文件结构方法有以下优点:
1TI公司为用户提供写好的文件结构和位区定义,可以在其网站下载
2使用位区方便编写代码,可读性强,易于升级。
3位区定义可以充分利用CCS编译器的自动代码输入功能,方便用户输入代码。
4方便CCS的Watch窗口观察变量。
还有位区的代码大小以及运行效率说不完了等等
Ⅹ 在CCS中如何查看DSP片上外设的寄存器内容啊
复制寄存器,然后右键“Add to watch window”,仿真即可查看