其中asm(" ")是指直接插入并执行一个汇编指令,以便加速处理。这种加入汇编陆衡指令的办法仅仅适用于一郑宽些特定用途,不能随意使早丛做用,否则可能破坏程序参数。
DSP(digital singnal processor)是一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号,再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,源源超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色DSP既是Digital Signal Processing的缩写(数字信号处理的理论和方法)或者是Digital Signal Processor(用于数字信号处理的可编程微处理器)的缩写。我们所说的DSP技术,则一般指将通用的或专用的DSP处理器用于完成数字信号处理的方法和技术。
DSP的有以下特点:
DSP处理器采用哈佛结构和改进的哈佛结构。
哈佛结构就是将程序代码和数据的存储空间分开,各有自己的地址和数据总线。之所以采用哈佛结构,是为了并行进行指令和数据处理,从而可以大大地提高运算辩磨拿的速度。为了进一步提高信号处理的效率,在哈佛结构的基础上,又加以改善。使得程序代码和数据存储空间之间可以进行数据的传输,称为改善的哈佛结构。
采用流水技术。
流水技术是将各指令的各个步骤重叠起来执行。DSP处理器所采用的将程序存储空和数据存储空间游段的地址与数据总线分开的哈佛结构,为采用流水技术提供了很大的方便。
为了提高DSP处理器的运算速度,它们无例外地设置了硬件乘法器,以及MAC(乘并且累加)一类的指令。
DSP处理器都为DMA单独设置了完全独立的总线和控制器,这是和通用的CPU很不相同,其目的是在进行数据传输是完全不影响CPU及其相关总线的工作。
在DSP处理器中,设置了专门的数据地址发生器来产生所需的数据地址。数据地址的产生与CPU的工作是并行的,从而节省CPU的时间,提高信号的处理速度。
DSP处理器为了自身工作的需要和外部环境的协调工作。往往都设置了丰富的外设。如时钟发生器。定时器等。
定点DSP处理器和浮点DSP处理器。定点DSP中经常要考虑溢出问题,在浮点DSP基本上可以不考虑。与定点DSP处理器相比,浮点DSP处理器的速度更快,尤其是作浮点运算。在实时性要求很到的场合。往往考虑浮点DSP处理器。而浮点DSP处理器的价格比较高,开发难度更大携搭。
DSP的用途
2000主要用于控制:供电,光网络等。5000则是通讯和静态图像处理:视频产品,数字无线电等。而6000是数字通信和图像处理:移动通信,打印机,数字扫描仪等。
#include "myapp.h"#include "ICETEK-VC5509-EDU.h"
#include "scancode.h"
/腊老槐/ :-- Define Timer 0 's Registers ---//
ioport unsigned int *tim0
ioport unsigned int *prd0
ioport unsigned int *tcr0
ioport unsigned int *prsc0
// :-- End of Define -----------------//
void InitMcBSP() //函数声明
unsigned int uN,nCount,nCount1//定义外部变量
main() //主程序
{
unsigned char dbScanCode,dbOld //定义内部变量
dbScanCode=dbOld=0
nCount=nCount1=0
PLL_Init(20) //初始化PLL
SDRAM_init() //初始化SDRAM
InitCTR() //初始化CTR
InitMcBSP() //初始化McBSP
uN=60
CTRGR=1
InitInterrupt() //初始化中断
TIME_init() //初始化定时器
while ( 1 )
{
if ( nCount1==0 )
{
dbScanCode=GetKey() //读取键盘输入的信轮友息
if ( dbScanCode!=dbOld ) //如果键盘输入信息改变,执行
{
dbOld=dbScanCode
if ( dbScanCode==SCANCODE_9 )
break
else if ( dbScanCode==SCANCODE_7 )
PCR1|=2
else if ( dbScanCode==SCANCODE_8)
PCR1&=0x0fffd
else if ( dbScanCode==SCANCODE_1 )
uN=60
else if ( dbScanCode==SCANCODE_2 )
uN=40
else if ( dbScanCode==SCANCODE_3 )
uN=20
else if ( dbScanCode==SCANCODE_4 )
uN=10
else if ( dbScanCode==SCANCODE_5 )
uN=0
}
}
}
CloseCTR() //关显示器
exit(0)
}
void InitInterrupt(void)
{
// 设置中断控制寄存器
IVPD=0x80
IVPH=0x80
IER0=0x10
DBIER0 =0x10
IFR0=0xffff
asm(" BCLR INTM")
}
void interrupt Timer() //中断响含悉应函数
{
nCount++nCount%=100
if ( nCount>uN ) PCR2|=4
else PCR2&=0x0fffb
nCount1++nCount1%=5120
}
void InitMcBSP()
{
// IOPin: McBSP2.FSR S22
//SPCR1.RRST_=0,PCR.RIOEN=1,PCR.FSRM=1,PCR.FSRP=0/1
SPCR1_2&=0x0fffe
PCR2|=0x1400
// IOPin: McBSP1.CLKX S14
//SPCR2.XRST_=0,PCR.XIOEN=1,PCR.CLKXM=1,PCR.CLKXP=0/1
SPCR2_1&=0x0fffe
PCR1|=0x2200
}
void TIME_init(void)
{
tim0 = (unsigned int *)0x1000
prd0 = (unsigned int *)0x1001
tcr0 = (unsigned int *)0x1002
prsc0 = (unsigned int *)0x1003
*tcr0 = 0x04f0
*tim0 = 0
*prd0 = 0x0100
*prsc0 = 2
*tcr0 = 0x00e0
}
涉及到外设部分就得看具体的DSP型号了,查查数据手册吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)