第四章DSP的软件系统结构与设计主要内容:概述C54XDSP指令系统公共目标文件格式(COFF)汇编语言程序设计C语言程序设计汇编和C语言混和编程§4.1概述C54x软件设计有3种方法:用C语言开发全汇编语言开发C和汇编语言混合编程开发(主流)采用C和汇编语言混合编程必须遵循一些有关的规则。§4.1.1汇编软件开发过程§4.1.2C语言软件开发过程§4.2指令系统及汇编程序编写汇编语言软件结构指令系统汇编语言程序编写实例§4.2.1汇编语言软件结构若用户要建立一个汇编项目,项目必须包括以下文件(以建一个项目example为例):vectors.asm;定义复位、中断矢量源文件example.asm;主体源程序。c5402.cmd;根据用户选用的C54X具体型号定义存储空间,并为用户段分配空间。c5402.h;定义C549内部控制及状态寄存器。汇编源程序结构由各种段组成:.bss未初始化段,为变量保留空间.text已初始化段,用户程序代码.data已初始化段,为某段存储空间初始化数据自定义段:用.usect或.sect建立的用户自定义段例4.1:计算STM#x,AR1ST#1,*AR1+汇编源文件(.asm)汇编器目标文件(.obj)链接器可执行的公共目标文件(.out)软件仿真器硬件仿真器C源文件(.c)汇编器目标文件(.obj)链接器可执行的公共目标文件(.out)软件仿真器硬件仿真器C编译器汇编源文件ST#2,*AR1+ST#3,*AR1+ST#4,*AR1+ST#5,*AR1STM#x,AR1STM#4,AR2LD#0,ALOOP:ADD*AR1+,ABANZLOOP,*AR2-STLA,yherebhere.end§4.2.2指令系统汇编指令语法格式:标号:助记符源操作数,目的操作数;注释例:Start:LD#9,DP;9→DP§4.2.2.1寻址方式立即寻址绝对寻址累加器寻址直接寻址间接寻址存储器映象寄存器寻址堆栈寻址指令部分寻址缩略语说明见书P74表3.1.1立即寻址就是在指令字中包括立即操作数。短立即数寻址(单字指令)就是包含的立即数是3、5、8或9位。例如:RPT#99;将下一条指令循环100次LD#0h,DP;将0装入数据页指针ADD#0ffh,A;将0ffh加给AccA编码为单字:长立即数寻址(双字指令)就是包含的立即数是16位。例:ADD#1234h,A;将#1234h加给AccA绝对寻址就是在指令中包含所要寻址的存储单元的16位地址,16位地址可以用其所在单元的地址标号或16位符号常数来表示。绝对寻址例如:数据存储器地址寻址:MVKDsample,*AR5;将数据存储器Sample地址单元中的数据传送到由AR5寄存器所指向的数据存储器单元中。这里的sample是一个符号常数,代表一个数据存储单元的地址。绝对寻址程序存储器地址寻址:MVPDtable,*AR5;将程序存储器标号为table地址单元中的数据传送到由AR5所指向的数据存储器单元中。这里的table是一个地址标号,代表一个程序存储器单元的地址。绝对寻址端口地址寻址:PORTRPA,Smem;从PA端口读入一个数据,将其存放在数据存储器Smem单元。PORTWSmem,PA;将数据存储器Smem单元中的数据写到PA端口。这里的PA是I/O端口地址的标号。绝对寻址*(lk)寻址:用一个符号或一个常数来确定数据存储器中的一个地址。LD*(BUFFER),A把地址为BUFFER的数据单元中的数据装到AccA中,BUFFER是个符号常数。累加器寻址就是利用累加器的数值作为地址来读写程序存储器。只有两条指令:READASmemWRITASmemREADA,把累加器A所确定的程序存储器单元中的一个字,传送到数据存储器单元Smem中。WRITA,把数据单元Smem中的一个字,传送到累加器A确定的程序存储器单元。直接寻址就是指令中包含数据存储器地址的低7位。这7位地址作为偏移地址值,与基地址值(数据页指针DP或堆栈指针SP)一起构成16位数据存储器地址。优点:可以在不改变DP或SP的情况下,随机地寻址128个存储单元。直接寻址:DP指针直接寻址TMS320C54的数据存储器分为512页,每页128字。设置一个数据页指针DP(DataPointer),用9-bit指向一个数据页,再加上一个7-bit的页内偏移地址,形成16-bit的数据地址。例如:LD#4,DP;指向页4(0200h-027Fh)ADD9h,A;将数据页4中地址9h的数据加给AccA直接寻址:SP指针直接寻址就是选择SP的16位地址加上指令中的7位地址,形成16位的数据存储单元的地址。例如:(SP)=1000H,执行SSBXCPL;设置SP指针直接寻址方式LD1H,A;将数据存储器1001h单元数据加载到AccAADD2H,A;将数据存储器1002h单元数据加到AccA间接寻址就是按照存放在某个辅助寄存器中的16位地址寻址的。8个辅助寄存器(AR0--AR7),由一个辅助寄存器指针(ARP3-bit)来指定。辅助寄存器算术单元(ARAU)作16-bit无符号数运算,决定一个新的地址,装入辅助寄存器中的一个。AR0--AR7的内容相当灵活,可以装入立即数,加上立即数,减去立即数;也可以从数据存储器装入地址;还可以作以下的变址寻址:间接寻址将该AR的内容加1或减1,再寻址(循环常用)将该AR的内容加上或减去AR0的内容,再寻址。将该AR的内容逆向进位加上或减去AR0的内容,再寻址具体寻址形式见书78页表3.1.5。间接寻址例如:ADD*,8,A;将当前辅助寄存器所指的地址里的数据,左移8-bit后加给AccAADD*+,8,A,AR4;数据左移,加给AccA后,当前辅助寄存器中的地址加1,然后选择辅助寄存器AR4作为当前辅助寄存器间接寻址ADD*0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器ADD*BR0+,8,A;执行加法后,将AR0的值加给当前辅助寄存器,但反向进位间接寻址:位倒序寻址功能正向进位与反向进位:间接寻址:位倒序寻址功能位倒序寻址:AR0=100AR1=000按AR1寻址后,将AR0加给AR1,反向进位规则。间接寻址:循环寻址功能许多算法,如卷积,相关和FIR滤波等,都需要在存储器中实现一个循环缓冲器。在这些算法中,一个循环缓冲器就是一个包含了最近的数据的滑动窗口。当新的数据来到时,缓冲器就会覆盖最早的数据。循环缓冲器实现的关键是循环寻址的实现。C54x间接寻址中提供了循环寻址的方式,以%表示。间接寻址定义循环缓冲器大小寄存器(BK)来确定循环缓冲器的大小。用循环缓冲器的有效基地址(EFB)和尾地址(EOB)来组成循环地址。step是加到辅助寄存器,或从辅助寄存器中减去的值。存储器映射寄存器(MMR)寻址存储器映射寄存器寻址用来修改存储器映射寄存器而不影响当前数据页指针(DP)或堆栈指针(SP)的值。存储器映射寄存器寻址既可以在直接寻址中使用,又可以在间接寻址中使用存储器映射寄存器(MMR)寻址有两种产生MMR地址方法:采用直接寻址方式时,高9位数据存储器地址被置0(但不改变DP、SP值),利用指令中的低7位地址访问数据存储器。采用间接寻址方式时,高9位数据存储器地址被置0,按照当前辅助寄存器中的低7位地址访问数据存储器。即:MMR寻址只能访问数据存储器0页资源,不考虑DP、SP的直接寻址方式。存储器映射寄存器(MMR)寻址只有8条指令:LDMMMR,dstMVDMdmad,MMRMVMDMMR,dmadMVMMMMRx,MMRyPOPMMMRPSHMMMRSTLMsrc,MMRSTM#1k,MMRMMR寻址特点:①寻址速度快,对MMR执行写操作开销小;②可直接利用MMR的名称快速访问数据存储空间的0页资源;③只能寻址数据空间的0页单元。用途:主要用于不改变DP、SP的情况下,修改MMR中的内容。堆栈寻址系统堆栈用来在中断和子程序期间自动存放程序计数器。它也能用来存放额外的数据项或传递数据值。处理器使用一个16-bit的存储器映射寄存器—堆栈指针来对堆栈寻址,它总是指向存放在堆栈中的最后一个元素。堆栈寻址SP:是16位的专用寄存器,指示出栈顶在数据存储空间的位置,系统复位后,SP初始化为0h,使得堆栈由0000h开始,程序设计时可以重设SP值。注意:C54x的堆栈是从高地址向低地址方向生长,因此,在压入操作时,先减小SP后将数据压入堆栈;在弹出操作时,先从堆栈弹出数据后增加SP值。堆栈寻址例如:SP=3FFH,CPU执行一条调用子程序指令,程序计数器PC进栈,这时,PC值压入数据存储器3FEH中。4条指令:PSHDsmemPSHMMMRPOPDsmemPOPMMMR关于指令的几点说明11、、只只能能使使用用绝绝对对寻寻址址和和累累加加器器AA寻寻址址程程序序空空间间。。22、、只只能能使使用用绝绝对对寻寻址址寻寻址址II//OO空空间间33、、寻寻址址数数据据空空间间可可以以使使用用多多种种寻寻址址方方式式,,指指令令中中的的SSmmeemm、、xxmmeemm、、yymmeemm、、llmmeemm用用来来寻寻址址数数据据空空间间。。§4.2.2.2C54x指令系统:具体指令C54x指令系统共有129条指令,由于操作数的寻址方式不同,派生至205条。主要有以下几类:数据传送指令算术运算指令逻辑运算指令程序控制指令并行操作类指令重复操作指令具体指令请参见书上P84,大家可以自学汇编指令。关于移位的说明主要是为了完成数据存储器和累加器中数据的定标。指令中的移位数表示:二进制补码,正值为左移,负值为右移,有三种形式:1、立即数:shift(5位,-16~+15)shft(4位,0~15)2、ST1中的ASM位:5位,-16~+153、暂存器T的低六位TS:-16~+31注意:关于条件操作数cond的说明数据传送指令(装载与存储)1、装载指令(LD)目的操作数:A、B、T、DP、ARP、ASM源操作数:数据存储器,立即数(AR1)=200H,(200H)=FFEDH,SXM=0,(A)=000000FFFFHLD*AR1A;(A)=000000FFEDHLD*AR1,8,A;(A)=0000FFED00HLD*AR1,-4,A;(A)=0000000FFEH思考:上例中,若SXM=1时,结果各是多少课堂练习:若AR1)=200H,(200H)=FFEDH,(201H)=0FEEH,SXM=0,CPL=0,(IMR)=FFFFH,(A)=000000FFFFH,请问执行下列每条语句时A各是多少?2、装载指令(ST)目的操作数:数据存储器单元,MMR,程序存储器单元,I/O空间源操作数:A,B,T,TRN,立即数题目:(AR1)=200H,(200H)=FFEDH,(A)=000000FFFFH解答:STHA,8,*AR1;(200H)=00FFHSTLA,*AR1;(200H)=FFFFHST#65,*AR1;(200H)=65STM#201H,AR1;(AR1)=201HST#0,*AR1;(201H)=0LD#1,DP;(DP)=1ST#F000H,20H;(A0H)=F000H§4.2.3汇编语言程序的编写常用的伪指令:.title:允许汇编器在每页顶部打印标题。.text:指定.text后面的为可执行代码即程序。.bss:指定.bss后面的变量为未初始化段的内容。.data:指定.data后面的代码为初始化数据段。.sect:定义初始化段,可包含可执行代码或数据.usect:为未初始化的命名段保留空间,与.bss类似。.word:指定.word后面的数据为16位宽。.byte:指定.byte后面的数据为8位宽。.set:赋值,将值赋给符号。.equ:同.set。.end:终止汇编。.def:指定定义在当前模块中,但可以被其他模块使用。.ref:指明在当前模块使用,但在其他模块中定义。.include