第5章TMS320C54x汇编语言程序设计5.5重复操作程序’C54x的重复操作是使CPU重复执行一条指令或一段指令。可以分为单指令重复和块程序重复。实现重复操作的指令:RPT——重复下条指令;RPTZ——累加器清0,并重复下条指令;RPTB——块重复指令。使用RPT、RPTZ能重复下一条指令;而RPTB用于重复代码块若干次。利用重复指令可实现比BANZ指令更快的循环程序。第5章TMS320C54x汇编语言程序设计5.5重复操作程序利用RPT和RPTZ可重复执行紧随其后的一条指令。重复次数由该指令的操作数决定,并且等于操作数加1。若要重复执行N+1次,则重复指令中应规定重复次数为N。该数值保存在16位重复计数器RC中,可通过RPT或RPTZ指令加载。一条指令的最大重复次数为65536。由于要重复的指令只需要取指一次,对于多周期指令,采用重复操作后,可使多周期指令变成单周期指令,提高运行速度。5.5.1单指令重复操作第5章TMS320C54x汇编语言程序设计5.5.1单指令重复操作【例5.5.1】对数组进行初始化,使x[8]={0,0,0,0,0,0,0,0}。.bssx,8STM#x,AR1LD#0,ARPT#7STLA,*AR1+.bssx,8STM#x,AR1RPTZA,#7STLA,*AR1+注意:①对x[8]中的8个元素置0,重复次数为7,即执行1次STLA,AR1+指令后,再重复执行7次;②RPTZ指令设定重复次数后,再对累加器清零。第5章TMS320C54x汇编语言程序设计5.5.1单指令重复操作在执行重复操作期间,除了RS外所有中断被禁止,直到重复循环完成。’C54x能响应HOLD信号,若HM=0,CPU继续执行重复操作,若HM=1,则暂停重复操作。第5章TMS320C54x汇编语言程序设计5.5重复操作程序5.5.2块程序重复操作对于整个程序块需要重复操作时,可采用程序块重复操作。用于块程序重复操作指令为RPTB和RPTBD。程序块的长度由块程序重复指令RPTB的操作数来确定,而重复次数由块重复计数器BRC来决定。通常RPTB的操作数为程序块的结束地址,而重复次数可用STM指令对BRC进行设定。第5章TMS320C54x汇编语言程序设计5.5.2块程序重复操作块重复操作的特点:①程序块的起始地址RSA是RPTB指令的下一行;②块结束地址REA由RPTB指令的操作数规定;③对程序块进行重复操作时,不论程序块多长,重复次数多大,所用的机器周期为0;④与单指令重复操作不同,块重复操作可以响应中断。第5章TMS320C54x汇编语言程序设计5.5.2块程序重复操作块程序重复指令的特点是对任意长程序段的循环开销为0。循环由ST1状态寄存器的块重复标志位(BRAF)和紧跟在ST1状态寄存器后面的存储器映像寄存器控制。循环过程:①将块重复标志位BRAF置1,激活块程序重复循环;②将一个取值在0~65535范围里的循环次数N加载到BRC;③块重复指令把块重复的起始地址放在块重复开始地址寄存器RSA中;④块重复指令把块重复的末地址放在块重复结束地址寄存器REA中。第5章TMS320C54x汇编语言程序设计5.5.2块程序重复操作【例5.5.2】对数组x[8]中的每一元素加1。.bssx,8begin:LD#1,16,BSTM#7,BRCSTM#x,AR4RPTBnext-1ADD*AR4,16,B,ASTHA,*AR4+next:LD#0,B…;设置数组空间;立即数1送入BH;设置重复次数,BRC=7,循环8次;数组首地址x送入AR4;设置循环结束地址;数组数据左移16位与BH相加;存入数组结果,并修改地址;B清0注意①块结束地址REA通常取程序块最后一条指令的下一条指令地址-1;②重复次数为7次③RPTB指令可以响应中断。第5章TMS320C54x汇编语言程序设计5.5重复操作程序5.5.3循环嵌套循环嵌套是程序编制中常用的技巧,可以用来简化较为复杂的程序。块程序重复指令RPTB所用的寄存器有:BRC——重复计数器;RSA——起始地址寄存器;REA——结束地址寄存器。RPT重复操作可以和块重复操作RPTB以及循环操作BANZ进行嵌套,实现多重嵌套。第5章TMS320C54x汇编语言程序设计【例5.5.2】三重循环嵌套程序。STM#L-1,AR7;2T1st:外部STM#M-1,BRC;2TRPTB2nd-1;4T中间中间RPT#N-1;1T内部中间中间2nd:外部外部BANZ1st,*AR7-;4T内层中层外层第5章TMS320C54x汇编语言程序设计5.5.3循环嵌套三重循环嵌套结构:内层中层外层——RPT——RPTB——BANZ——执行N次——执行M次——执行L次循环嵌套的开销循环操作指令重复次数机器周期内层单程序重复操作RPTN1中层块程序重复操作RPTBM4+2外层循环操作BANZL4N+2第5章TMS320C54x汇编语言程序设计5.6数据块传送程序可以用于数据传送的指令有10条,分别可以实现数据存储器之间、数据存储器和MMR之间、程序存储器和数据存储器之间、程序存储器和数据存储器之间的数据块传送等。这些指令传送速度比加载和存储指令快,传送数据不需要通过累加器,可以寻址程序存储器,与RPT指令相结合可以实现数据块传送。第5章TMS320C54x汇编语言程序设计5.6数据块传送程序1.数据传送指令用于数据传送指令可分为四类:(1)数据存储器之间的数据传送MVDKSmem,dmadMVKDdmad,SmemMVDDXmem,Ymem2字2周期2字2周期1字1周期第5章TMS320C54x汇编语言程序设计1.数据传送指令(2)数据存储器与MMR之间的数据传送MVDMdmad,MMRMVMDMMR,dmadMVMMMMRx,MMRy2字2周期2字2周期1字2周期(3)程序存储器和数据存储器之间的数据传送MVPDpmad,SmemMVDPSmem,pmadREADASmemWRITASmem2字3周期2字4周期1字5周期1字5周期第5章TMS320C54x汇编语言程序设计1.数据传送指令(4)从PA口读/写数据PORTRPA,SmemPORTWSmem,PA2字2周期2字2周期数据传送指令的特点①传送速度比加载和存储指令要快;②数据传送不通过累加器;③可寻址程序存储器;④与RPT结合,可实现数据块传送。第5章TMS320C54x汇编语言程序设计2.程序存储器至数据存储器的数据传送重复执行MVPD指令,可以实现程序存储器至数据存储器的数据传送,在系统初始化过程中十分有用。【例5.6.1】数组x[8]={0,1,2,3,4,5,6,7}初始化。.bssx,8.dataTBL:.word0,1,2,3,4,5,6,7.textSTART:STM#x,AR5RPT#7MVPDTBL,*AR5+……第5章TMS320C54x汇编语言程序设计3.数据存储器之间的数据传送在数字信号处理时,经常需要将数据存储器中的一批数据传送到数据存储器的另一个地址空间。【例5.6.2】进行N点FFT运算时,为节约存储空间要用到原位计算,将数组X[16]赋到数组Y[16],计算一个蝶形后,所得输出数据可以立即存入原输入数据所占用的存储单元。.bssx,16.bssy,16…STM#x,AR2STM#y,AR3RPT#15MVDDAR2+,*AR3+第5章TMS320C54x汇编语言程序设计5.7小数运算程序在定点DSP芯片中,采用定点数进行数值运算时,若操作数采用整型数,则DSP芯片给定的字长(一般16位)决定了整型数的最大范围。通常,定点DSP采用小数乘法。其原因:①乘法器为16位,对于大于16位的数据难以实现乘法递推,且乘积占用存储资源大;②小数乘法时,既可以存储32位乘积,也可以存储高16位乘积,可用较少的资源保存结果;③小数乘法便于乘法递推。第5章TMS320C54x汇编语言程序设计5.7小数运算程序1.数的定标采用小数运算时,设定小数点在16位中的位置称为定标。小数点在16位数中的位置不同,可以表示不同大小和不同精度的小数。数的定标通常有Q表示法,如Q0,Q1,…,Q15。Q越大,可以表示的数的范围越小,但精度越高。在具体的定点程序中,必须根据具体情况适当选择合适的定标。第5章TMS320C54x汇编语言程序设计5.7小数运算程序2.小数的表示方法’C54x采用基于2的补码小数表示形式。每个16位数用1个符号位(最高位)、i个整数位、15-i个小数位来表示。采用2的补码小数(Q15格式),其位权值为:MSB…………LSB-1.2-12-22-3……2-15例如:(Q8格式?)00000010.10100000——21+2-1+2-3=2.625第5章TMS320C54x汇编语言程序设计2.小数的表示方法基于2的补码小数表示方法:16位2的补码小数(Q15格式),数值范围-1~+1将十进制小数乘以32768,并将整数乘积转换成16进制数。正数:乘以32768,整数转换成16进制数;负数:其绝对值乘以32768,整数取反加1。第5章TMS320C54x汇编语言程序设计2.小数的表示方法如:1——7FFFH0.5——4000H0.25——2000H0——0000H-0.25——E000H-0.5——C000H-1——8000H1×32768=7FFFH0.5×32768=4000H0.25×32768=2000H0×32768=0000H(0.25×32768)补=E000H(0.5×32768)补=C000H(1×32768)补=8000H注意:汇编时,不能直接写成十进制小数。如:0.907——.word32768*907/1000第5章TMS320C54x汇编语言程序设计5.7小数运算程序3.小数乘法与冗余符号位小数乘法实例:0.625(-0.125)=-0.0781250100(0.5)1000(-0.375)×0100000001001100(-0100)1110100(-0.01875)第5章TMS320C54x汇编语言程序设计3.小数乘法与冗余符号位乘积:-0.01875=11101007位二进制扩展第8位(符号位)后,乘积:111101000=-0.09375出错原因:两带符号数相乘,其结果带有2个符号位。Sxxx(Q3格式)Syyy(Q3格式)×SSzzzzzz(Q6格式)解决办法:运算结果左移一位,消去多余符号位。可通过对FRCT位置1,乘法器自动将乘积结果左移一位。如:11101000左移1位:11010000结果:-0.01875第5章TMS320C54x汇编语言程序设计3.小数乘法与冗余符号位在小数乘法编程时,应事先设置FRCT位,如:SSBXFRCTMPY*AR2,*AR3,ASTHA,@Z完成了Q15*Q15=Q15的小数乘法。第5章TMS320C54x汇编语言程序设计【例5.7.1】编制计算的程序41iiixaya1=0.3a2=0.2a3=-0.4a4=0.1x1=0.6x2=0.5x3=-0.1x4=-0.2.bssa,4.bssx,4.bssy,1.datatable:.word3*32768/10.word2*32768/10.word-4*32768/10.word1*32768/10.word6*32768/10.word5*32768/10.word-1*32768/10.word-2*32768/10axy第5章TMS320C54x汇编语言程序设计【例5.7.1】编制计算的程序41iiixaya1=0.3a2=0.2a3=-0.4a4=0.1x1=0.6x2=0.5x3=-0.1x4=-0.2axy.textstart:SSBXFRCTSTM#x,AR1RPT#7MVPDtable,*AR1+0.30.2-0.40.10.60.5-0.1-0.2STM#x,AR2STM#a,AR3RPTZA,#3MAC*AR2+,*AR3+,ASTHA,@y0.3done:Bdone第5章T