C28x系列DSP寻址方式详解

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C28x系列DSP寻址方式详解1.TMS320C2000TMS320C2000系列包括C24x和C28x系列。C24x系列建议使用LF24xx系列替代C24x系列,LF24xx系列的价格比C24x便宜,性能高于C24x,而且LF24xxA具有加密功能。C28x系列主要用于大存储设备管理,高性能的控制场合。2.TMS320C3xTMS320C3x系列包括C3x和VC33,主要推荐使用VC33。C3x系列是TI浮点DSP的基础,不可能停产,但价格不会进一步下调。3.TMS320C5xTMS320C5x系列已不推荐使用,建议使用C24x或C5000系列替代。4.TMS320C5000TMS320C5000系列包括C54x和C55x系列。其中VC54xx还不断有新的器件出现,如:TMS320VC5471(DSP+ARM7)。C55x系列是TI的第三代DSP,功耗为VC54xx的1/6,性能为VC54xx的5倍,是一个正在发展的系列。C5000系列是目前TIDSP的主流DSP,它涵盖了从低档到中高档的应用领域,目前也是用户最多的系列。5.TMS320C6000TMS320C6000系列包括C62xx、C67xx和C64xx。此系列是TI的高档DSP系列。其中C62xx系列是定点的DSP,系列芯片种类较丰富,是主要的应用系列。C67xx系列是浮点的DSP,用于需要高速浮点处理的领域。C64xx系列是新发展,性能是C62xx的10倍。6.OMAP系列是TI专门用于多媒体领域的芯片,它是C55+ARM9,性能卓越,非常适合于手持设备、Internet终端等多媒体应用。感谢作者总结C28x系列DSP有四种基本寻址方式:直接寻址-16位的寄存器DP用作,固定页指针(段指针),DP中存放当前变量所在页的首地址,指令中的6位或7位二进制数给出变量的偏移量(段偏移量)。用于访问固定地址的数据结构,如片上外设或C/C++中的全局变量和静态变量。栈寻址-通过使用栈指针SP访问变量,在C28x中栈是从低地址向高地址增长的,SP始终指向下一个可用的空栈单元。SP值减去指令中6位二进制数给出的偏移量为变量地址,或者该偏移量给出分别在压栈(或出栈)操作时SP需要后加(或先减)的量。间接寻址-32位的辅助寄存器XAR0~XAR7用作通用32位数据指针。指令可以进行直接的后加、先减/后减,或者通过三位二进制立即数给出对哪个寄存器操作,也可以用另外一个16位辅助寄存器内容给出当前用的寄存器。寄存器寻址-直接对寄存器内容操作,寄存器可以是操作的源或目的地。这就使得C28x架构可以直接进行寄存器对寄存器的操作。DSP其它的寻址方式:数据/程序/IO空间立即寻址-存储器地址操作数直接嵌入在指令中。程序空间间接寻址-某些指令可以使用某个间接指针来访问程序空间。因为C28xCPU中存储器之一致的,因此这种寻址模式可以完成在同一条指令中同时读两个操作数的操作。说明:寻址模式由指令中的八位编码给出,状态寄存器ST1中的寻址模式选择位AMODE给出了编译器所使用的编码方式。AMODE=0-复位时默认的寻址模式,也是C28x的C/C++编译器使用的默认模式。但某些寻址方式C2xLP器件不兼容,此时段偏移量由六位二进制数给出(C2xLP器件是七位的),因此仅支持部分C2xLP器件的间接寻址方式。AMODE=1-包含了C2xLP器件全兼容的寻址模式。此时段偏移量为七位二进制数给出,支持C2xLP器件所有的寻址方式。注意:(1)C28x器件和C2xLP器件间接寻址指令的不同在于,C28x的指令中辅助寄存器指针是隐含的,也就是指令中标明了对哪个寄存器操作。而在Cx2LP的指令中,对哪个寄存器操作是由3位的辅助寄存器指针ARP(在ST1中)给出的,并且可以同时给出下一条指令要使用辅助寄存器指针(第三个操作数);(2)在C28x的指令中,目的操作数总是在源操作数的左边。请看下例:假如要完成这样的操作,把XAR4所指的数据读出加到AL中,随后把XAR4的内容加一,C28x的指令为:ADDAL,*XAR4++;C2xLP的指令可以为:ADDAL,*++(此时ARP=4)。而C2xLP的指令ADDAL,*++,ARP5则在完成上述操作的同时,把ARP的内容更新为5,即令ARP指向ARP5。具体的区别请参见TI的文档spru430d中第五章的表5-1。操作符*和@的作用:*表示取后面的变量值或寄存器的内容作为地址,取该地址所指向的存储空间的内容作为操作数。@表示直接取后面的变量值或寄存器的内容作为操作数。如何改变编译器的处理模式:编译器总是默认为AMODE=0,通过两种方式改变编译器的处理方式,一种是命令行参数法,当使用-v28时使编译器默认为AMODE=0模式,当使用-v28-m20时默认为AMODE=1模式。另一种是源文件中指定法,如下面的文件(假设编译器命令行参数为-v28);文件开始.........SETCAMODE;AMODE位置一.lp_amode;通知编译器检查C27x/C28x的语法,该段代码只能用AMODE=1的寻址方式.........CLRCAMODE;AMODE位清零.c28_amode;通知编译器检查C28x的语法,该段代码只能用AMODE=0的寻址方式.........;文件结束DSP指令实例:DSP直接寻址(只能寻址C28x的低4M数据地址空间):(1)@6位二进制立即数方式,适用于AMODE=0,地址高10位为0,地址次高16位为DP的低16位,地址低6位为6位二进制立即数,可寻址DP以上的0到63字的地址范围:;VarA和VarB在同一个长度为64字的分页中,VarC和VarD同在另外一个长度为64字的分页中MOVWDP,#VarA;把变量VarA所在页的首地址载入段指针DP中ADDAL,@VarA;把变量VarA的内容加到AL中MOV@VarB,AL;把AL的内容写进变量VarB中MOVWDP,#VarC;SUBAL,@VarC;MOV@VarD,AL;(2)@7位二进制立即数方式,适用于AMODE=1,地址高10位为0,地址次高15位为DP的低15:1位,地址低7位为7位二进制立即数,可寻址DP以上的0到127字的地址范围:SETCAMODE.lp_amodeMOVWDP,#VarAADDAL,@@VarAMOV@@VarB,ALMOVWDP,#VarCSUBAL,@@VarCMOV@@VarD,AL栈寻址(只能寻址C28x的低64k数据地址空间):(2)*-SP[6位二进制立即数]方式,适用于AMODE=0,高16位地址为0,低16位地址为SP-6位二进制立即数,SP不变,可寻址低于SP的0到63个字地址范围:ADDAL,*-SP[5];栈顶减5个字所指向的内容(16位)加到AL中,SP不变MOV*-SP[8],AL;AL的内容(16位)写到栈顶减8个字所指向的位置,SP不变ADDLACC,*-SP[12];栈顶减12个字所指向的内容(32位)加到ACC中,SP不变MOVL*-SP[34],ACC;ACC的内容(32位)写到栈顶减32个字所指向的位置,SP不变(2)*SP++方式,适用于AMODE=x,16位操作时SP=SP+1,32位操作时SP=SP+2,高16位地址为0,低16位地址为SP:MOV*SP++,AL;AL的内容(16位)压入栈顶MOVL*SP++,P;P的内容(32位)压入栈顶(3)*--SP方式,适用于AMODE=x,16位操作时SP=SP-1,32位操作时SP=SP-2,高16位地址为0,低16位地址为SP:ADDAL,*--SP;栈顶内容弹出并加到AL中(16位)MOVLACC,*--SP;栈顶内容弹出到ACC中(32位)C28x间接寻址:(1)*XARn++方式,适用于AMODE=x,ARP=n,32位地址为XARn,16位操作时XARn=XARn+1,32位操作时XARn=XARn+2:MOVLXAR2,#Array1;载入Array1的首地址到XAR2中MOVLXAR3,#Array2;载入Array2的首地址到XAR3中MOV@AR0,#N-1;载入循环计数N到AR0中Loop:MOVLACC,*XAR2++;载入XAR2指向的内容到ACC中,XAR2后加1MOVL*XAR3++,ACC;ACC的内容写入XAR3指向的地址,XAR3后加1BANZLoop,AR0--;循环到AR0==0,AR0后加1(2)*--XARn方式,适用于AMODE=x,ARP=n,32位地址为XARn,16位操作时XARn=XARn-1,32位操作时XARn=XARn-2:MOVLXAR2,#Array1+N*2;载入Array1的末地址到XAR2中MOVLXAR3,#Array2+N*2;载入Array1的末地址到XAR2中MOV@AR0,#N-1;载入循环计数N到AR0中Loop:MOVLACC,*--XAR2;XAR2先减1,载入XAR2所指向的内容到ACC中MOVL*--XAR3,ACC;XAR3先减,ACC内容写入XAR3所指的位置BANZLoop,AR0--;循环到AR0==0,AR0后加1(3)*+XARn[AR0或(AR1)]方式,适用于AMODE=x,ARP=n,32位地址为XARn+AR0(或AR1),XAR0(或XAR1)的低16位作为无符号数加到XARn中,忽略高16位,可能会产生到XARn高16位的溢出:MOVWDP,#Array1Ptr;指向Array1Ptr的段MOVLXAR2,@Array1Ptr;载入Array1的首地址到XAR2中MOVBXAR0,#16;AR0=16,AR0H=0MOVBXAR1,#68;AR1=68,AR1H=0MOVLACC,*+XAR2[AR0];把Array1[16]和Array1[68]内容互换,首先载入Array1[16]内容到ACCMOVLP,*+XAR2[AR1];把Array1[68]内容到PMOVL*+XAR2[AR1],ACC;写入ACC内容到Array1[68]MOVL*+XAR2[AR0],P;写入P内容到Array1[16],完成互换(4)*+XARn[3位二进制立即数]方式,适用于AMODE=x,ARP=n,32位地址为XARn+无符号3位二进制立即数,*XARn等价于*+XARn[0]:MOVWDP,#Array1Ptr;指向Array1Ptr的段MOVLXAR2,@Array1Ptr;载入Array1的首地址到XAR2MOVLACC,*+XAR2[2];把Array1[2]和Array1[5]内容互换,首先载入Array1[2]内容到ACCMOVLP,*+XAR2[5];把Array1[5]内容到PMOVL*+XAR2[5],ACC;写入ACC内容到Array1[5]MOVL*+XAR2[2],P;写入P内容到Array1[2],完成互换循环间接寻址:DSP寄存器寻址:(1)32位操作,使用寄存器@ACC,@XT,@P,@XARn,当@ACC作为目的操作数时,可能会影响Z,N,V,C,OVC标志位。(2)16位操作,使用寄存器@AL,@AH,@PL,@PH,@TH,@SP,@ARn,当@AL或@AH作为目的操作数时,可能会影响Z,N,V,C,OVC标志位。对应的高16位或低16位不受影响。数据/程序/IO空间立即寻址:(1)*(16位二进制立即数)方式,地址的高16位为0,低16位为16位二进制立即数。当该指令连续使用时,每次地址都会后加。只能寻址低64k数据空间。可用指令:MOVloc16,*(0:16bit);[loc16]=[0:16bit]MOV*(0:16bit),loc16;[loc16]=[0:16bit](2)*(PA)方式,地址的高16位为0,低16位为PA中的16位二进制立即数。当该指令连续使用时,每次地址都会后加。该模式寻址时,在访问IO空间时,IO选通信号被置位。用数据地址线访问IO空间。可用指令:OUT*(PA),loc16;I

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功