TMS320C54x的软件开发.ppt

上传人:牧羊曲112 文档编号:6522020 上传时间:2023-11-08 格式:PPT 页数:57 大小:253.50KB
返回 下载 相关 举报
TMS320C54x的软件开发.ppt_第1页
第1页 / 共57页
TMS320C54x的软件开发.ppt_第2页
第2页 / 共57页
TMS320C54x的软件开发.ppt_第3页
第3页 / 共57页
TMS320C54x的软件开发.ppt_第4页
第4页 / 共57页
TMS320C54x的软件开发.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《TMS320C54x的软件开发.ppt》由会员分享,可在线阅读,更多相关《TMS320C54x的软件开发.ppt(57页珍藏版)》请在三一办公上搜索。

1、第4章 TMS320C54x的软件开发,4.1 TMS320C54x软件开发过程 4.2 汇编语言程序的编写方法4.3 汇编伪指令和宏指令4.4 公共目标文件格式COFF4.5 汇编源程序的编辑、汇编和链接4.6 汇编语言程序设计4.7 C语言与汇编混合编程,4.6 汇编语言程序设计 基本程序设计分为3大类:(1)程序的控制与转移。(2)数据块传送程序。(3)算术运算类程序。,4.6.1 程序的控制与转移包括:分支转移 子程序操作(调用与返回程序)循环控制(重复操作)这些指令都将影响程序计数器(PC),会造成把一个不是顺序增加的地址加载到PC。表43P111,条件:有一些指令只有当一个条件或多

2、个条件得到满足时才能执行。如条件分支转移或条件调用、条件返回指令。表4-4P112。多重条件:BC pmad,cond,cond,cond,当这条指令的所有条件得到满足时,程序才能转移到pmad。不是所有条件都能构成多重条件,某些条件的组合如表4-5所示。-P113,1.分支转移 根据条件判断改写PC值,使程序发生分支转移。两种形式:有条件分支转移和无条件转移。常用指令:BD、BACCD;BCD、BANZDBACC:Branch to Location Specified by Accumulator BANZ:Branch on Auxiliary Register Not Zero 合理地

3、设计延迟转移指令,可以提高程序的效率。应当注意,紧跟在延迟指令后面的两个字,不能是造成PC不连续的指令(如分支转移、调用、返回或软件中断指令)。,【例4.11】条件分支转移指令BC举例。BC new,AGT,AOV;若累加器A0且溢出,则转至new,否则往下执行 单条指令中的多个条件是“与”的关系。如果需要两个条件相“或”,只能写成两条指令。如上一条指令改为“若累加器A大于0或溢出,则转移至new”,可以写成如下两条指令BC new,AGTBC new,AOV,【例4.12】计算.bss x,5;为变量分配6个字的存储空间.bss y,1 STM#x,AR1;AR1指向x STM#4,AR2;

4、设AR2初值为4 LD#0,Aloop:ADD*AR1+,A BANZ loop,*AR2-;当AR2不为0时转移,AR2-1AR2 STL A,y 本例中用AR2作为循环计数器,设初值为4 AR2取值为4,3,2,1,0,CH4_7,2.调用与返回指令 当调用子程序或函数时,DSP就会中断原先的程序,转移到程序存储器的其他地址继续运行。调用时,下条指令的地址被压入堆栈,以便返回时将这个地址弹出至PC,使中断的程序继续执行。两种形式:无条件调用与返回,有条件调用与返回。常用指令:CALLD、CALAD、CCD、RETD、RCDCALA:Call to accumulator addressCC

5、:Conditional callRC:Conditional return,例如(堆栈设置后)CALL pmad;(SP)-1SP,(PC)+2TOS,pmadPC RET;(TOS)PC,(SP)+1SP堆栈:16位堆栈指针(SP)寻址的软件堆栈。堆栈是一个特殊的存储区域,遵循先进后出的原则,当向堆栈中压入数据时,堆栈从高地址向低地址增长,堆栈指针SP始终指向栈顶。堆栈用法:压入操作:SP先减1,然后再将数据压入栈顶。弹出操作:数据弹出后,再将SP加1。,堆栈设置:size.set100stack.usect“STK”,size;自定义一个名为STK的保留空间,共100个单元 STM#st

6、ack+size,SP;将这个保留空间的高地址+1(#stack+size)赋给SP,作为栈底。,stack+0,stack+size-1,3.重复操作(3条指令)RPT(重复下条指令)、RPTZ(累加器清0并重复下条指令)RPTB(块重复指令)。(1)重复执行单条指令含义:RPT或RPTZ允许重复执行紧随其后的那一条指令。重复次数:如重复执行n次,则重复指令中计数值为n1。说明:与BANZ指令进行循环相比,效率要高得多。特别是对于那些乘法累加和数据传送的多周期指令(如MAC、MVDK、MVDP和MVPD等),在执行一次之后就变成了单周期指令,大大提高了运行速度。,【例4.13】对数组进行初始

7、化。x5=0,0,0,0,0主要程序(部分)如下:.bss x,5 STM#x,AR1 LD#0,A RPT#4 STL A,*AR1+或者.bss x,5 STM#x,AR1 RPTZ A,#4 STL A,*AR1+,(2)块程序重复操作RPTB含义:RPTB将重复操作的范围扩大到任意长度的循环回路。重复次数:先加载到块重复计数器(BRC)。循环开始地址(RSA):是RPTB指令的下一行;结束地址(REA):由RPTB指令的操作数规定。特点:对任意长的程序段的循环开销为0;其本身是一条2字4周期指令;RPT指令一旦执行,不会停止操作,即使有中断请求也不响应;而RPTB指令是可以响应中断的。

8、,【例4.14】对数组x5中的每个元素加1。.bss x,5begin:LD#1,16,B STM#4,BRC;BRC赋值为4 STM#x,AR4 RPTB next-1;next-1为循环结束地址 ADD*AR4,16,B,A STH A,*AR4+next:LD#0,B 用next1作为结束地址是恰当的。如果用循环回路中最后一条指令(STH指令)的标号作为结束地址,若最后一条指令是单字指令也可以,若是双字指令,就不对了。,(3)循环的嵌套(三重循环嵌套、开销-p116),问题:外层循环为何不采用RPTB实现?,1st:,1,4.6.2 数据块传送程序共有4种类型(10条指令):(1)程序存

9、储器数据存储器(MVPD,MVDP)。(2)数据存储器数据存储器(MVDK,MVKD,MVDD)。(3)数据存储器MMR(MVMD、MVDM,MVMM)(4)程序存储器(由ACC寻址)数据存储器(READA,WRITA)MVDP Smem,pmad MVMD MMR,dmadMVDD Xmem,Ymem MVMM MMRx,MMRyMVDK Smem,dmad READA Smem,这些指令的特点如下:传送速度比加载和存储指令要快;传送数据不需要通过累加器;可以寻址程序存储器;与RPT相结合时,都变成单周期指令,可以实现数据块传送。,【例4.15】编写一段程序,首先对数组x20赋值,再将数据存

10、储器中的数组x20复制到数组y20。.title“exp15.asm”.mmregs STACK.usect“STACK”,30h.bss x,20.bss y,20.data table:.word 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20.defstart.text,Start:STM#x,AR1 RPT#19 MVPD table,*AR1+;从程序存储器传送到数据存储器;程序存储器指针自动下移 STM#x,AR2 STM#y,AR3 RPT#19 MVDD*AR2+,*AR3+;从数据存储器传送到数据存储器end:B end.

11、end,MVDD Xmem,Ymem注意:双操作数指令只能用辅助寄存器AR2AR5进行间接寻址获得操作数,/exp15.cmd*/链接命令 vectors.obj exp15.obj-o exp15.out-m exp15.map-e startMEMORY PAGE 0:EPROM:org=0E000hlen=01F80h VECS:org=0FF80hlen=00080h PAGE 1:SPRAM:org=00060hlen=00030h DARAM:org=00090hlen=01380h,SECTIONS.vectors:VECSPAGE 0.data:EPROMPAGE 0.text

12、:EPROMPAGE 0.bss:SPRAMPAGE 1.STACK:DARAMPAGE 1 实现20个数据先从EPROM的0E000Hh0E013h传送到数据存储器SPRAM的0060h0073h单元,实现数据的初始化,再从0060h0073h单元传送到0074h0087h单元,实现数据搬移,其示意图如图4.7所示。注意,实际看到的是十六进制数。,4.6.3 算术运算类程序单字运算(16位)长字运算(32位)小数运算浮点运算双操作数乘法DSP表示整数时,分为有符号数和无符号数两种格式。DSP表示小数时,其符号和上面整数的表示一样,但是必须注意如何安排小数点的位置。,单字运算【例4.16】试编

13、一程序,计算 的值,并找出4项乘积(i=1,2,3,4)中的最大值,放入累加器A中。.title“exp16.asm”.mmregsSTACK.usect“STACK”,10h;堆栈的设置.bss a,4;为变量分配10个字的存储空间.bss x,4.bss y1,1.bss y2,1.def start.data table:.word 1,5,3,4.word 8,6,7,2.text,start:STM#0,SWWSR;插入个等待状态 STM#STACK+10h,SP;设置堆栈指针 STM#a,AR1 RPT#7 MVPD table,*AR1+CALL SUM;调用乘累加子程序 CAL

14、L MAX;调用求最大值子程序end:B endSUM:STM#a,AR3 STM#x,AR4 RPTZA,#3 MAC*AR3+,*AR4+,A STLA,y1;变量y1存放乘累加的值;STLA,*(y1)RET,MAX:STM#a,AR1 STM#x,AR2 STM#2,AR3 LD*AR1+,T MPY*AR2+,A;第一个乘积在累加器A中loop:LD*AR1+,T MPY*AR2+,B;其他乘积在累加器B中 MAX A;累加器A和B比较,选大的存在A中 BANZ loop,*AR3-;此循环中共进行3次乘法和比较 STL A,y2;变量y2存放的最大值;STL A,*(y2)RET.

15、end,CH4_8,2.长字运算 可以利用长操作数(32位)进行长字运算。长字指令如下:长字运算指令DADD、DSUB、DRSUB等(见表3.10P69);(2)长字存储和装入指令DST、DLD(见表3.20、3.21P79-80)。除DST指令(存储32位数要用E总线2次,需要2个机器周期)外,其余都是单字单周期指令,也就是在单个周期内同时利用C总线和D总线,得到32位操作数。,32位乘法运算:只能利用16位乘法指令完成。X1 X0 S U*Y1 Y0*S U-X0*Y0 U*U Y1*X0 S*U X1*Y0 S*U Y1*X1 S*S-W3 W2 W1 W0 S U U U3条乘法指令:

16、UU:MPYU Smem,dst;dst=U(T)*U(Smem)SU:MACSU Xmem,Ymem,Src;Src=U(Xmem)*S(Ymem)+SrcSS:MAC Xmem,Ymem,Src;Src=S(Xmem)*S(Ymem)+Src,【例4.18】编写计算W64=X32Y32的程序。.title“exp18.asm”.mmregs.bss x,2;32位占2字空间.bss y,2;32位占2字空间.bss w0,1.bss w1,1.bss w2,1.bss w3,1.def start.data table:.word 10h,20h,30h,40h.text,CH4-11,s

17、tart:STM#0,SWWSR LD#50H,DP STM#x,AR1 RPT#3 MVPD table,*AR1+;初始化x,y STM#x,AR2 STM#y,AR3 LD*AR2,T;T=x0 MPYU*AR3+,A;A=x0y0(UU)STL A,w0;w0=(x0y0低16位),LD A,-16,A;A右移16位,A高位A低位 MACSU*AR2+,*AR3-,A;A+=y1x0(SU)MACSU*AR3+,*AR2,A;A+=x1y0(SU)STL A,w1;w1=A LD A,-16,A;A右移16位,A高位A低位 MAC*AR3,*AR2,A;A+=x1y1(SS)STL A

18、,w2;w2=A的低16位 STH A,w3;w3=A的高16位end:B end.end,结果W1=0A00h,测试数据(低位先存,和DSP长字整数的表示不同):x:00200010hy:00400030h 00200010 00400030 00000300 00000600 00000400 00000800 000008000A000300 W3=0000,W2=0800,W1=0A00,W0=0300,编写计算W64=X32Y32的程序给程序设置新的测试数据:.word 0 x0400,0 x0000,0 xFFFD,0 xFFFF;x=64,y=-3执行结果:W3=FFFF,W2=

19、FFFF,W1=FFFF,W0=F400FFFF,FFFF,FFFF,F400是-192的补码表示192的原码0000,0000,0000,0C00H,3.小数运算两个16位整数相乘:乘积总是“向左增长”。这意味着多次相乘后乘积将会很快超出定点器件的数据范围。两个小数相乘:乘积总是“向右增长”。这就意味着超出定点器件数据范围的将是不太感兴趣的部分。,1)小数的表示方法采用2的补码表示小数:最高位为符号位,数值范围从1+1(Q15格式)。MSB LSB 0/1(符号位).2-1 2-2 2-15,如:0100,0000,0000,0000B=4000H=0.5 0110,0000,0000,00

20、00B=6000H=0.75,汇编语言程序中,十进制小数的表示:小数0.123.Word 32768*123/1000,2)小数乘法中的冗余符号位问题:两个带符号小数相乘,将出现得到的积带有两位符号位。解决冗余符号位的办法:在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移1位,消去了两个带符号数相乘时产生的冗余符号位。小数乘法编程时:应当先设置FRCT位:SSBX FRCT MPY*AR2,*AR3,A STH A,Z,例:0.5*0.5,在程序中设定状态寄存器ST1中的FRCT(小数方式)位为1,在乘法器将结果传送至累加器时就能自动地左移

21、1位,消去了两个带符号数相乘时产生的冗余符号位。,0100B 0100B-00010000B,消除冗余符号位后的结果为:00100000B-0.25,【例4.19】编制计算 的程序段,其中数据均为小数。.title“exp19.asm”.mmregsSTACK.usect“STACK”,10H.bss a,4.bss x,4.bss y,1.data table:.word 1*32768/10.word 2*32768/10.word-3*32768/10.word 4*32768/10.word 8*32768/10.word 6*32768/10.word-4*32768/10.word

22、-2*32768/10,CH4-12,start:SSBX FRCT;小数方式位FRCT1,结果自动左移1位 STM#a,AR1 RPT#7 MVPD table,*AR1+;初始化ai,xi STM#x,AR2 STM#a,AR3 RPTZ A,#3 MAC*AR2+,*AR3+,A STH A,y;乘积向右增长,丢弃低16位乘积结果end:B end.end计算结果为y=1eb7h=0.23996。,4.双操作数乘法含义:允许在一个机器周期内通过两个16位数据总线(C总线和D总线)寻址两个数据和系数,图4.9。特点:用间接寻址方式获得操作数,且辅助寄存器只能用AR2AR5 寻址方式:*AR

23、n、*ARn+、*ARn-、*ARn+0%。比较p57,62指令码格式(2)占用的程序空间小。(3)运行的速度快。双操作数MAC形式的指令有4种,表4-7p126。,【例4.21】求解 的程序段p127。程序(部分)如下:STM#a,AR2 STM#x,AR3 RPTZ A,#19;1个机器周期 MAC*AR2+,*AR3+,A;1个机器周期 STH A,y STL A,y+1效果:单操作数需(3N+4+1)T(例4.20)双操作数需(2N+4+1)T(例4.20)使用MAC 的双操作数只需要(N+2)T(例4.21),5.浮点运算1)浮点数的表示方法 浮点数由尾数和指数两部分组成.定点数=尾

24、数2(指数)浮点数的尾数和指数可正可负,均用补码表示。指数的范围从831。例如,定点数0 x2000(0.25)用浮点数表示时,尾数为0 x4000(0.5),指数为1,即 0.25=0.521,2)定点数转换为浮点数(3条指令)EXP src功能:提取指数。计算src的指数值并存放于T寄存器中。指数值通过计算src的冗余符号位数并减8得到,冗余符号位数等于去掉40位src中除符号位以外的有效位所需左移的位数。累加器src中的内容不变。指数的数值范围是831。例如:EXP A,0CH=1100B,所以累加器A中左端有8*4+2=34位为1,去除1位符号位,冗余符号位=33,指数=33-8=25

25、=0019H,ST T,EXPONENT 将保存在T寄存器中的指数存放到数据存储器的指定单元中。NORM src,dst 将src中有符号数左移TS位,结果存放在dst中得到尾数。该指令常与EXP指令结合使用,完成归一化处理。例如:NORM A,3)浮点数转换为定点数:按指数值将尾数右移(指数为负时是左移),【例4.22】编写浮点乘法程序,完成x1x20.3(0.8)的运算。要求包括将定点数转换成浮点数、浮点乘法,最后再将浮点数转换成定点数。程序中保留10个数据存储单元:x1(被乘数)el(被乘数的指数)m1(被乘数的尾数)x2(乘数)e2(乘数的指数)m2(乘数的尾数)product(乘积)

26、ep(乘积的指数)mp(乘积的尾数)temp(暂存单元),.title“exp22.asm”.defstartSTACK:.usect“STACK”,100.bssx1,1.bssx2,1.bssel,1.bssm1,1.bsse2,1.bssm2,1.bssep,1.bssmp,1.bssproduct,1.bsstemp,1.datatable:.word3*3276810.wotd-8*3276810.text,start:STM#STACK+100,SP;设置堆栈指针SP MVPDtable,x1;将x1和x2传送至数据存储器 MVPDtable+1,x2 LDx1,16,A;将xl规

27、格化为浮点数 EXP A STT,el;保存x1的指数 NORMA STHA,ml;保存x1的尾数 LDx2,16,A;将x2规格化为浮点数 EXPA ST T,e2;保存x2的指数 NORM A STH A,m2;保存x2的尾数 CALL MULT;调用浮点乘法子程序done:B done,MULT:SSBX FRCT SSBX SXM LD e1,A;指数相加 ADD e2,A STL A,ep;乘积指数ep LD ml,T;尾数相乘 MPY m2,A;乘积尾数存放在累加器A中 EXP A;对尾数乘积规格化 ST T,temp;规格化时产生的指数temp NORM A STH A,mp;保

28、存乘积尾数mp LD temp,A;修正乘积指数 ADD ep,A;(ep)+(temp)A STL A,ep;保存乘积指数ep,;将浮点乘积转换成定点数NEG A;乘积指数反号,并加载到T寄存器 STL A,temp LD temp,T LD mp,16,A;再将尾数存到AH NORM A;将尾数按TS移位 STH A,product;保存定点乘积 RET.end最后得到0.3(0.8)乘积浮点数为:尾数0 x8520;指数0 x0002。乘积的定点数为0 xEl48,对应的十进制数等于0.23999。,用C语言和汇编语言混合编程方法主要有以下3种:独立编写C程序和汇编程序,分开编译或汇编形

29、成各自的目标代码模块,然后用链接器将C模块和汇编模块链接起来。直接在C程序的相应位置嵌入汇编语句。(3)对C程序进行编译生成相应的汇编程序,然后对汇编程序进行手工优化和修改。,4.7 C语言与汇编混合编程,汇编程序和C程序互相调用 灵活性较大,采用这种方法,C程序可以调用汇编程序,并且可以访问汇编程序中定义的变量。同样,汇编程序也可以调用C程序或访问C程序中定义的变量。但用户必须自己维护各汇编模块的入口和出口代码,自己计算传递的参数在堆栈中的偏移量,工作量稍大,但能做到对程序的绝对控制。,在C程序中直接内嵌汇编语句可以在C程序中实现C语言无法实现的一些硬件控制功能,如修改中断控制寄存器、中断标

30、志寄存器等。嵌入格式:asm(“汇编语句”)括号中的汇编语句必须以标号、空格、tab、分号开头,这和通常的汇编编程的语法一样。不要破坏C环境,因为C编译器并不检查和分析嵌入的汇编语句。插入跳转语句和标号会产生不可预测的结果。汇编语句不要改变C程序中变量的值。不要在汇编语句中加入汇编器选项而改变汇编环境。,混合编程应遵循的规则和详细的接口规范,1、寄存器规则,在C语言中,状态标志的缺省数值如下表所示。,辅助寄存器AR1、AR6、AR7、ST0,ST1由被调用函数保护,而AR0、AR2、AR3、AR4、AR5可以自由使用,变量和函数命名规则,无论是变量还是函数,在C语言和汇编中均需要 说明为全局的

31、。在C语言中需要有准确的函数原 型说明。,在C语言中保持“自然”的命名,而在汇编语言中 该名字需加一个下划线作为前缀。,例:在C程序中定义,被汇编程序引用C程序部分:extern void timer(void);int gScale;汇编部分:.global _gScale.global _timer,例:在汇编程序中定义,在C程序中调用汇编程序部分:.global _testpara_testpara:PSHM AR1 STM#para,AR1C程序部分:extern void testpara(int a,int b,int c);void main(void)int x=10,y=20,z=30;testpara(1,2,3);testpara(x,y,z);,CH4_9,参数1在A中,作业,P130-131:1,9,10,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号