1、第1章 绪论 1.1 数字信号处理概述 1.2 数字信号处理器概述1.1 数字信号处理概述 1.1.1 数字信号处理系统的构成 1.1.2 数字信号处理的实现 1.1.3 数字信号处理的特点 返回首页1.1.1 数字信号处理系统的构成图1-1 典型的数字信号处理系统返回本节1.1.2 数字信号处理的实现(1)在通用的微机上用软件实现。(2)利用特殊用途的DSP芯片来实现。(3)利用专门用于信号处理的通用DSP芯片来实现。(4)用FPGA/CPLD用户可编程器件来实现。返回本节1.1.3 数字信号处理的特点 与模拟系统(ASP)相比,数字系统具有如下特点:(1)精度高(2)可靠性高(3)灵活性大
2、(4)易于大规模集成(5)可获得高性能指标 返回本节1.2 数字信号处理器概述 1.2.1 DSP芯片的种类 1.2.2 TMS320 DSP系列 1.2.3 DSP芯片的主要特点 1.2.4 DSP芯片的应用 返回首页1.2.1 DSP芯片的种类DSP芯片可以按照以下3种方式进行分类。1按基础特性分2按数据格式分3按用途分返回本节1.2.2 TMS320 DSP系列 通用DSP芯片的代表性产品包括TI公司的TMS320系列、AD公司ADSP21xx系列、MOTOROLA公司的DSP56xx系列和DSP96xx系列、AT&T公司的DSP16/16A和DSP32/32C等单片器件。TI的三大主力
3、DSP产品系列为C2000系列主要用于数字控制系统;C5000(C54x、C55x)系列主要用于低功耗、便携的无线通信终端产品;C6000系列主要用于高性能复杂的通信系统。C5000系列中的TMS320C54x系列DSP芯片被广泛应用于通信和个人消费电子领域。返回本节1.2.3 DSP芯片的主要特点1哈佛结构2多总线结构 3指令系统的流水线操作4专用的硬件乘法器5特殊的DSP指令6快速的指令周期7硬件配置强 NN+1N+2N+3N-1NN+1N+2N-2N-3N-1N-2NN+1N-1N时钟取指译码取操作数执行图1-2 四级流水线操作 返回本节1.2.4 DSP芯片的应用(1)信号处理(2)通
4、信(3)语音(4)图形/图像(5)军事(6)仪器仪表(7)自动控制(8)医疗(9)家用电器返回本节第2章 TMS320C54x数字信号处理器硬件结构 2.1 TMS320C54x的特点和硬件组成框图 2.2 TMS320C54x的总线结构 2.3 TMS320C54x的存储器分配 2.4 中央处理单元(CPU)2.5 TMS320C54x片内外设简介 2.6 硬件复位操作 2.7 TMS320VC5402引脚及说明2.1 TMS320C54x的特点和硬件组成框图 TMS320C54x的主要特性如下所示:CPU 先进的多总线结构。40位算术逻辑运算单元(ALU)。17位17位并行乘法器与40位专
5、用加法器相连。比较、选择、存储单元(CSSU)。指数编码器可以在单个周期内计算40位累加器中数值的指数。双地址生成器包括8个辅助寄存器和两个辅助寄存器算术运算单元(ARAU)。返回首页存储器 64 K字程序存储器、64 K字数据存储器以及64 K字I/O空间。在C548、C549、C5402、C5410和C5420中程序存储器可以扩展。指令系统 单指令重复和块指令重复操作。块存储器传送指令。32位长操作数指令。同时读入两个或3个操作数的指令。并行存储和并行加载的算术指令。条件存储指令。从中断快速返回指令。在片外围电路(如图2-1所示)软件可编程等待状态发生器。可编程分区转换逻辑电路。带有内部振
6、荡器。外部总线关断控制,以断开外部的数据总线、地址总线和控制信号。数据总线具有总线保持器特性。可编程定时器。并行主机接口(HPl)。电源 可用IDLEl、IDLE2和IDLE3指令控制功耗,以工作在省电方式。可以控制关断CLKOUT输出信号。在片仿真接口 具有符合IEEEll49.1标准的在片仿真接口(JTAG)。速度 单 周 期 定 点 指 令 的 执 行 时 间 为25/20/15/12.5/10-ns(40 MIPS/50 MIPS/66 MIPS/80 MIPS/100 MIPS)。返回本节图2-1 TMS320C54x DSP的内部硬件组成框图1图2-1 TMS320C54x DSP
7、的内部硬件组成框图22.2 TMS320C54x的总线结构 TMS320C54x DSP采用先进的哈佛结构并具有八组总线,其独立的程序总线和数据总线允许同时读取指令和操作数,实现高度的并行操作。采用各自分开的数据总线分别用于读数据和写数据,允许CPU在同一个机器周期内进行两次读操作数和一次写操作数。独立的程序总线和数据总线允许CPU同时访问程序指令和数据。返回首页2.3 TMS320C54x的存储器分配 2.3.1 存储器空间 2.3.2 程序存储器 2.3.3 数据存储器 2.3.4 I/O存储器返回首页2.3.1 存储器空间 TMS320C54x存储器由3个独立的可选择空间组成:程序空间、
8、数据空间和I/O空间。程序存储器空间包括程序指令和程序中所需的常数表格;数据存储器空间用于存储需要程序处理的数据或程序处理后的结果;I/O空间用于与外部存储器映象的外设接口,也可以用于扩展外部数据存储空间。保留(OVLY=1)外部(OVLY=0)0000H007FH0080H片内DRAM:16K(OVLY=1)外部(OVLY=0)3FFFH4000H保留(OVLY=1)外部(OVLY=0)0000H007FH0080H片内DRAM:16K(OVLY=1)外部(OVLY=0)3FFFH4000H程序空间:页0程序空间:页0FF7FHFF80HFFFFHFF7FHFF80HFFFFHEFFFHF0
9、00HFEFFHFF00H片外中断矢量(外部)中断矢量(片内)片外片内ROM:4K保留存储器映象寄存器0000H005FH0080H片内DRAM:16K3FFFH4000H数据空间FF7FHFF80HFFFFH片外EFFFHF000HFEFFHFF00H片内ROM(DROM=1)外部(DROM=0)保留(DROM=1)外部(DROM=0)0060H007FH暂存器SPRAMMP/MC=1(微处理器模式)MP/MC=0(微型计算机模式)图2-2 TMS320VC5402存储器分配图Page 064KPage1:低16K外部Page1:高48K外部1 0000H1 3FFFH1 4000H0 00
10、00H0 FFFFH1 FFFFHPage2:低16K外部Page2:高48K外部2 0000H2 3FFFH2 4000H2 FFFFH.Page15:低16K外部Page15:高48K外部F 0000HF 3FFFHF 4000HF FFFFHXPC=0XPC=1XPC=2XPC=15图2-3 C5402扩展程序存储器图返回本节2.3.2 程序存储器 通过MP/和OVLY位的设置,可以实现对片内存储器(ROM、RAM)的配置,即哪些片内存储器映象在程序存储器空间。器件复位时,复位、中断和陷阱中断的向量映象在地址FF80H开始的程序存储器空间。然而,复位后这些向量可以被重新映象在程序存储器空
11、间任何128字页的开始。这样,可以把向量表移出引导ROM,并重新配置其地址。返回本节2.3.3 数据存储器 通过对处理器方式状态寄存器PMST的DROM位的设置,将片内ROM配置在数据存储器空间(DROM=1),这样,可以用指令将片内ROM作为数据存储器中的数据ROM来读取。复位时,DROM位被清0。64K字的数据存储器空间包括数据存储器映象寄存器,0000H001FH是常用的CPU寄存器地址,0020H005FH是片内外设寄存器的地址。表2-1 表2-1 存储器映象寄存器名称地址说明IMR0中断屏蔽寄存器IFR1中断标志寄存器STO6状态寄存器0STl7状态寄存器1名称地址说明AL8累加器A
12、低16位AH9累加器A高16位AGAH累加器A最高8位BLBH累加器B低16位BHCH累加器B高16位BGDH累加器B最高8位TREGEH暂存器TRNFH状态转移寄存器AR0710H17H辅助寄存器 SP18H堆栈指针BK19H循环缓冲大小BRC1AH块重复计数器RSA1BH块重复起始地址寄存器名称地址说明REA1CH块重复终止地址寄存器PMST1DH处理器方式状态寄存器XPC1EH扩展程序计数器TIM24H定时器0寄存器PRD25H定时器0周期寄存器TCR26H定时器0控制寄存器 SWWSR28H软件等待状态寄存器BSCR29H分区转换控制寄存器SWCR2BH软件等待状态控制寄存器HPIC2
13、CH主机接口控制寄存器TIM130H定时器1寄存器PRD131H定时器1周期寄存器TCR132H定时器1控制寄存器GPIOCR3CH通用I/O控制寄存器,控制主机接口和TOUTlGPIOSR3DH通用I/O状态寄存器,主机接口作通用I/O时有用返回本节2.3.4 I/O存储器 除程序存储器空间和数据存储器空间外,C54x系列器件还提供了I/O存储器空间,利用I/O空间可以扩展外部存储器。I/O存储器空间为64K字(0000hFFFFh),有两条指令PORTR和PORTW可以对I/O存储器空间操作,读写时序与程序存储器空间和数据存储器空间有很大不同。返回本节2.4 中央处理单元(CPU)CPU的
14、基本组成如下:CPU状态和控制寄存器 40位算术逻辑单元(ALU)40位累加器A和B 桶形移位寄存器 乘法器/加法器单元 比较、选择和存储单元(CSSU)指数编码器返回首页1算术逻辑单元(ALU)和累加器 TMS320C54x使用40位算术逻辑单元(ALU)和两个40位累加器(ACCA和ACCB)来完成算术运算和逻辑运算,且大多数都是单周期指令。ALU功能框图如图2-4所示。图2-4 ALU功能框图2桶形移位寄存器 如图2-5所示为桶形移位寄存器的功能框图。桶形移位寄存器的输入可以为:从DB获得的16位操作数;从DB和CB获得的32位操作数;从累加器A或B获得的40位操作数。桶形移位寄存器的输
15、出连到ALU或经过MSW/LSW(最高有效字/最低有效字)写选择单元至EB总线。图2-5 桶形移位器的功能框图3乘法器/加法器单元 C54x CPU有一个1717位的硬件乘法器,与40位的专用加法器相连,可以在单周期内完成一次乘法累加运算。其功能框图如图2-6所示。乘法器的输出经小数/整数乘法(FRCT)输入控制后加到加法器的一个输入端,加法器的另一个输入端来自累加器A或B。加法器还包括零检测器、舍入器(二进制补码)及溢出/饱和逻辑电路。图2-6 乘法器/加法器单元功能框图4比较、选择和存储单元(CSSU)比较、选择和存储单元(CSSU)是专门为Viterbi算法设计的加法/比较/选择(ACS
16、)操作的硬件单元,其功能框图如图2-7所示。CSSU支持均衡器和信道译码器所用的各种Viterbi算法。Viterbi算法示意图如图2-8所示。图2-7 比较、选择和存储单元(CSSU)功能框图图2-8 Viterbi算法示意图5指数编码器 指数编码器用于支持单周期指令EXP的专用硬件。在EXP指令中,累加器中的指数值能以二进制补码的形式(-831)存储在T寄存器中。指数值定义为前面的冗余位数减8的差值,即累加器中为消除非有效符号位所需移动的位数。当累加器中的值超过32位时,指数为负值。6CPU状态和控制寄存器 TMS320C54x有三个状态和控制寄存器,分别为状态寄存器ST0、状态寄存器ST
17、1和处理器方式状态寄存器PMST。ST0和ST1包括各种工作条件和工作方式的状态,PMST包括存储器配置状态和控制信息。状态寄存器ST0的位结构如图2-9所示,表2-2所示是ST0的说明。图2-9 状态寄存器ST0位结构1513121110980ARPTCCOVAOVBDP表2-2 状态寄存器ST01514131211109876540BRAFCPLXFHMINTM0OVMSXMC16FRCTCMPTASM图2-10 状态寄存器ST1的位结构表2-3 状态寄存器ST1(1)表2-3 状态寄存器ST1(2)1576543210IPTRMP/MCOVLYAVISDROMCLKOFFtSMULtSS
18、Tt图2-11 处理器方式状态寄存器PMST的位结构表2-4 状态寄存器PMST返回本节2.5 TMS320C54x片内外设简介1通用I/O引脚2定时器3时钟发生器4主机接口(HPI)5串行口6软件可编程等待状态发生器7可编程分区转换逻辑返回首页2.6 硬件复位操作复位期间,处理器进行以下操作:PMST中的中断向量指针IPTR设置成1FFH。PMST中的MP/位设置成与引脚MP/状态相同的值。PC设置为FF80H。扩展程序计数器XPC清0。无论MP/状态如何,将FF80H加到地址总线。返回首页 数据线变为高阻态,控制线处于无效状态。产生信号。ST1中的中断方式位INTM置1,关闭所有可屏蔽中断
19、。中断标志寄存器IFR清0。产生同步复位信号(),初始化外围电路。下列状态位置成初始值 ARP=0 CLKOFF=0 HM=0 SXM=1 ASM=0CMPT=0INTM=1TC=1 AVIS=0CPL=0OVA=0XF=1 BRAF=0 DP=0OVB=0 C=1DROM=0OVLY=0 C16=0FRCT=0OVM=0 如果MP/=0,程序从片内ROM开始执行,否则,从片外程序存储器开始执行。返回本节2.7 TMS320VC5402引脚及说明图2-12 TMS320VC5402的引脚 1返回首页图2-12 TMS320VC5402的引脚2表2-5 TMS320VC5402引脚说明1表2-5
20、 TMS320VC5402引脚说明2表2-5 TMS320VC5402引脚说明3表2-5 TMS320VC5402引脚说明4表2-5 TMS320VC5402引脚说明5表2-5 TMS320VC5402引脚说明6表2-5 TMS320VC5402引脚说明7返回本节表2-5 TMS320VC5402引脚说明8第3章 TMS320C54x的数据寻址方式 3.1 立即寻址 3.2 绝对寻址 3.3 累加器寻址 3.4 直接寻址 3.5 间接寻址 3.6 存储器映象寄存器寻址 3.7 堆栈寻址TMS320C54x DSP提供以下7种基本数据寻址方式。(1)立即数寻址(2)绝对地址寻址(3)累加器寻址(
21、4)直接寻址(5)间接寻址(6)存储器映射寄存器寻址(7)堆栈寻址表3-1 寻址指令中用到的缩写符号及其含义缩写符号含义Smem16位单数据存储器操作数Xmem在双操作数指令及某些单操作数指令中所用的16位双数据存储器操作数,从DB总线上读出Ymem在双操作数指令中所用的16位双数据存储器操作数,从CB总线上读出;在读同时并行写的指令中表示写操作数dmad16位立即数数据存储器地址(065535)pmad16位立即数程序存储器地址(065535)PA16位立即数I/O口地址(065535)src源累加器(A或B)dst目的累加器(A或B)lk16位长立即数3.1 立即寻址 在立即寻址方式中,指
22、令中包括了立即操作数。一条指令中可对两种立即数编码,一种是短立即数(3、5、8或9位),另一种是16位的长立即数。短立即数指令编码为一个字长,16位立即数的指令编码为两个字长。立即数寻址指令中在数字或符号常数前面加一个“”号,来表示立即数。返回首页3.2 绝对寻址 3.2.1 数据存储器(dmad)寻址 3.2.2 程序存储器(pmad)寻址 3.2.3 端口地址(PA)寻址 3.2.4 长立即数*(lk)寻址返回首页3.2.1 数据存储器(dmad)寻址 使用数据存储器寻址的指令有:MVDK Smem,dmadMVDM dmad,MMR MVKD dmad,SmemMVMD MMR,dmad
23、 数据存储器寻址使用符号(符号地址)或一个表示16位地址的立即数来指明寻址的数据存储单元的16位绝对地址。例如:MVKD SMAPLE,*AR5;返回本节3.2.2 程序存储器(pmad)寻址 使用程序存储器寻址的指令有:FIRS Xmem,Ymem,pmadMACD Smem,pmad,srcMACP Smem,pmad,srcMVDP Smem,pmadMVPD pmad,Smem 程序存储器(pmad)寻址使用符号(符号地址)或一个表示16位地址的立即数来给出程序空间的地址。例如,把程序存储器中标号为TABLE单元中的值复制到AR7所指定的数据存储器中去,指令可写为:MVPD TABLE
24、,*AR7;返回本节3.2.3 端口地址(PA)寻址 使用端口地址的指令有:PORTR PA,Smem PORTW Smem,PA 端口地址(PA)寻址使用一个符号(符号地址)或一个表示16位地址的立即数来给出外部I/O口地址。例如:PORTR FIFO ,*AR5;返回本节3.2.4 长立即数*(lk)寻址 长立即数*(lk)寻址用于所有支持单数据存储器操作数(Smem)的指令。长立即数*(lk)寻址使用一个符号(符号地址)或一个表示16位地址的立即数来指定数据存储空间的一个地址。例如,把数据空间中地址为BUFFER单元中的数据传送到累加器A,指令可写为:LD *(BUFFER),A返回本节
25、3.3 累加器寻址 累加器寻址是用累加器中的数值作为一个地址读写程序存储器。共有两条指令可以采用累加器寻址:READA Smem WRITA Smem返回首页3.4 直接寻址 在直接寻址方式中,指令中包含数据存储器地址(dma)的低7位,这7位dma作为地址偏移量,结合基地址(由数据页指针DP或堆栈指针SP给出)共同形成16位的数据存储器地址。使用这种寻址方式,用户可在不改变DP或SP的情况下,对一页内的128个存储单元随机寻址。采用这种寻址方式的好处是指令为单字指令,数据存储器地址(dma)的低7位放在指令字中(如图3-1、3-2所示)。返回首页图3-1 DP作为基地址的直接寻址方式图3-2
26、 SP作为基地址的直接寻址方式返回本节3.5 间接寻址 3.5.1 单操作数寻址 3.5.2 双操作数寻址返回首页3.5.1 单操作数寻址 表3-2列出了单数据存储器(Smem)操作数间接寻址类型。特殊的间接寻址方式有:1循环寻址2倒序寻址(如表3-3所示)表3-2 单数据存储器操作数间接寻址类型表3-3 位倒序寻址返回本节3.5.2 双操作数寻址 双数据存储器操作数间接寻址类型为*ARx、*ARx-、*ARx+、*ARx+0%。所用辅助寄存器只能是AR2、AR3、AR4、AR5。其特点是:占用程序空间小,运行速度快,在一个机器周期内通过两个16位数据总线(C和D)读两个操作数。指令中Xmem
27、表示从DB总线上读出的16位操作数,Ymem表示从CB总线上读出的16位操作数。返回本节3.6 存储器映象寄存器寻址 存储器映象寄存器寻址用于修改存储器映象寄存器(MMR)中的内容,而不影响当前数据页指针DP和当前堆栈指针SP。由于这种方式不需要修改DP和SP,对寄存器的写操作开销最小。存储器映象寄存器寻址可用于直接寻址和间接寻址。返回首页3.7 堆栈寻址 当发生中断或子程序调用时,系统堆栈自动保存PC值。堆栈也可以用于保存和传递其他数据。堆栈由高地址向低地址增长,处理器使用16位的存储器映象寄存器堆栈指针(SP)对堆栈进行寻址,SP总是指向压入堆栈的最后一个数据。返回首页 有4条使用堆栈寻址
28、的指令:PSHD 把一个数据存储器数据压入堆栈;PSHM 把一个存储器映象寄存器中的值压入堆栈;POPD 从堆栈中弹出一个数据至数据存储器单元;POPM 从堆栈中弹出一个数据至存储器映象寄存器。返回本节第4章 TMS320C54x汇编指令系统 4.1 指令系统中的符号和缩写 4.2 指令系统4.1 指令系统中的符号和缩写表4-1 指令系统中的符号和缩写返回首页返回本节4.2 指令系统 4.2.1 算术运算指令 4.2.2 逻辑运算指令 4.2.3 程序控制指令 4.2.4 加载和存储指令返回首页4.2.1 算术运算指令 C54x的算术运算指令包括加法指令、减法指令、乘法指令、乘累加指令与乘法减
29、法指令、双字/双精度运算指令及专用指令。分别如表4-2、表4-3、表4-4、表4-5、表4-6、表4-7所示。表4-2 加法指令 表4-3 减法指令表4-4 乘法指令表4-5 乘加和乘减指令 表4-6 双精度(32位操作数)指令表4-7 专用指令返回本节4.2.2 逻辑运算指令 逻辑指令包括与、或、异或(按位)、移位和测试指令,分别如表4-8、表4-9、表4-10、表4-11、表4-12所示。表4-8 与逻辑运算指令表4-9 或逻辑运算指令表4-10 异或逻辑运算指令表4-11 移位逻辑运算指令表4-12 测试指令返回本节4.2.3 程序控制指令 程序控制指令包括分支转移指令、子程序调用指令、
30、中断指令、返回指令、重复指令、堆栈操作指令及混合程序控制指令,分别如表4-13、表4-14、表4-15、表4-16、表4-17、表4-18及表4-19所示。表4-13 分支转移指令表4-14 子程序调用指令表4-15 中断指令表4-16 返回指令表4-17 重复指令表4-18 堆栈操作指令表4-19 混合程序控制指令返回本节4.2.4 加载和存储指令 加载和存储指令包括加载指令、存储指令、条件存储指令、并行加载和存储指令、并行加载和乘法指令、并行存储和加/减法指令、混合加载和存储指令,分别如表4-20、表4-21、表4-22、表4-23、表4-24、表4-25、表4-26及表4-27所示。加载
31、指令是将存储器内容或立即数赋给目的寄存器;存储指令是把源操作数或立即数存入存储器或寄存器。表4-20 加载指令表4-21 存储指令表4-22 条件存储指令表4-23 并行加载和存储指令表4-24 并行加载和乘法指令表4-25 并行存储和加/减法指令表4-26 并行存储和乘法指令表4-27 混合加载和存储指令(数据块传送指令)返回本节第5章 TMS320C54x软件开发 5.1 软件开发过程及开发工具 5.2 公共目标文件格式 5.3 常用汇编伪指令 5.4 链接器命令文件的编写与使用 5.5 汇编语言程序编写方法 5.6 TMS320C54x C语言编程 5.7 用C语言和汇编语言混合编程5.
32、1 软件开发过程及开发工具1建立源程序2C编译器(C Compiler)3汇编器(Assembler)4连接器(Linker)5调试工具6十六进制转换公用程序(Hex Conversion Utility)返回首页图5-1 TMS320C54x DSP软件开发流程表5-1 TMS320C54xV3.50版代码生成工具程序返回本节5.2 公共目标文件格式 5.2.1 COFF文件的基本单元段 5.2.2 汇编器对段的处理 5.2.3 链接器对段的处理 5.2.4 重新定位 5.2.5 程序装入 5.2.6 COFF文件中的符号 返回首页5.2.1 COFF文件的基本单元段 段(sections)
33、是COFF文件中最重要的概念。一个段就是最终在存储器映象中占据连续空间的一个数据或代码块。目标文件中的每一个段都是相互独立的。一般地,COFF目标文件包含3个缺省的段:text段、data段、bss段。段可以分为两大类,即已初始化段和未初始化段。如图5-2所示为目标文件中的段与目标系统中存储器的关系。图5-2 目标文件中的段与目标存储器的关系返回本节5.2.2 汇编器对段的处理1未初始化段 未初始化段主要用来在存储器中保留空间,通常将它们定位到RAM中。这些段在目标文件中没有实际内容,只是保留空间而已。程序可以在运行时利用这些空间建立和存储变量。未初始化段是通过使用.bss和.usect汇编伪
34、指令建立的,两条伪指令的句法分别为:.bss 符号,字数 符号.usect“段名”,字数2已初始化段 已初始化段包含可执行代码或已初始化数据。这些段的内容存储在目标文件中,加载程序时再放到TMS320C54X存储器中。三个用于建立初始化段的伪指令句法分别为:.text段起点 .data段起点 .sect“段名”,段起点3命名段 命名段就是程序员自己定义的段,它与缺省的.text、.data和.bss段一样使用,但与缺省段分开汇编。data段不同的存储器中,将未初始化的变量汇编到与bss段不同的存储器中。产生命名段的伪指令为:符号.usect“段名”,字数 .sect“段名”,段起点4子段 子段
35、(Subsections)是大段中的小段。链接器可以像处理段一样处理子段。采用子段可以使存储器图更加紧密。子段的命名句法为:基段名:子段名 子段也有两种,用.sect命令建立的是已初始化段,用.usect命令建立的是未初始化段。5段程序计数器(SPC)汇编器为每个段安排一个独立的程序计数器,即段程序计数器(SPC)。SPC表示一个程序代码段或数据段内的当前地址。开始时,汇编器将每个SPC置0,当汇编器将程序代码或数据加到一个段内时,相应的SPC增加。如果汇编器再次遇到相同段名的段,继续汇编至相应的段,且相应的SPC在先前的基础上继续增加。图5-3 例5-1产生的目标代码返回本节5.2.3 链接
36、器对段的处理 链接器对段的处理有两个功能。首先,它将汇编器产生的COFF目标文件(.obj文件)中的各种段作为输入段,当有多个文件进行链接时,它将输入段组合起来,在可执行的COFF输出模块中建立各个输出段。其次,链接器为输出段选择存储器地址。链接器有两个命令完成上述功能,即:MEMORY 命令定义目标系统的存储器配置图,包括对存储器各部分的命名,以及规定它们的起始地址和长度。SECTIONS命令告诉链接器如何将输入段组合成输出段,以及在存储器何处存放输出段。子段可以用来更精确地编排段,可用链接器SECTIONS命令指定子段。图5-4 链接器默认的存储器分配返回本节5.2.4 重新定位1链接时重
37、新定位 将各个段定位到存储器中,每个段都从合适的地址开始。将符号值调整到相对于新的段地址的数值。调整对重新定位后符号的引用。2运行时重新定位 将代码装入存储器的一个地方,而运行在另一个地方。利用SECTIONS命令选项让链接器定位两次。一些关键的执行代码必须装入在系统的ROM中,但希望在较快的RAM中运行。链接器提供了一个简单的处理该问题的方法。利用SECTIONS命令选项让链接器定位两次。第一次使用装入关键字设置装入地址,再用运行关键字设置运行地址。返回本节5.2.5 程序装入(1)硬件仿真器和CCS集成开发环境,具有内部的装入器,调用装入器的LOAD命令即可装入可执行程序。(2)将代码固化
38、在片外存储器中,采用Hex转换工具(Hex conversion utility),例如Hex500将可执行的COFF目标模块(.out文件)转换成几种其他目标格式文件,然后将转换 后 的 文 件 用 编 程 器 将 代 码 写 入EPROM/Flash。返回本节5.2.6 COFF文件中的符号 COFF文件中有一个符号表,用于存储程序中的符号信息。链接器对符号重定位时使用该表,调试工具也使用该表来提供符号调试。外部符号指在一个模块中定义,在另一个模块中使用的符号。可使用.def、.ref或.global汇编伪指令将符号定义为外部符号。.def在当前模块中定义,可以在别的模块中使用的符号;.r
39、ef在当前模块中引用,但在别的模块中定义的符号;.global可用于以上任何一种情况。返回本节5.3 常用汇编伪指令返回首页表5-2 常用的汇编伪指令1段定义伪指令 为便于链接器将程序、数据分段定位于指定的(物理存在的)存储器空间,并将不同的obj文件链接起来。段的使用非常灵活,但常用以下约定:.text 此段存放程序代码。.data 此段存放初始化了的数据。.bss 此段存入未初始化的变量。.sect 名称 定义一个有名段,放初始化了的数据或程序代码。2条件汇编伪指令.if、.elseif、.else、.endif伪指令告诉汇编器按照表达式的计算结果对代码块进行条件汇编。.if expres
40、sion 标志条件块的开始,仅当条件为真(expression的值非0即为真)时汇编代码。.elseif expression 标志若.if条件为假,而.elseif条件为真时要汇编代码块。.else 标志若.if条件为假时要汇编代码块。.endif 标志条件块的结束,并终止该条件代码块。3引用其他文件和初始化常数伪指令.include 文件名 将指定文件复制到当前位置,其内容可以是程序、数据、符号定义等。.copy 文件名 与.include类似。.def 符号名 在当前文件中定义一个符号,可以被其他文件使用。.ref 符号名 在其他文件中定义,可以在本文件中使用的符号。.global 符号
41、名 其作用相当于.def、.ref效果之和。.mmregs 定义存储器映射寄存器的符号名,这样就可以用AR0、PMST等助记符替换实际的存储器地址。.float 数1,数2 指定的各浮点数连续放置到存储器中(从当前段指针开始)。.word 数1,数2 指定的各数(十六进制)连续放置到存储器中。.space n 以位为单位,空出n位存储空间。.end 程序块结束。4宏定义和宏调用 TMS320C54x汇编支持宏语言。如果程序中需要多次执行某段程序,可以把这段程序定义(宏定义)为一个宏,然后在需要重复执行这段程序的地方调用这条宏。宏定义如下:Macname.macroparameter 1,par
42、ameter n .mexit .endm 返回本节5.4 链接器命令文件的编写与使用 5.4.1 MEMORY伪指令及其使用 5.4.2 SECTIONS伪指令及其使用 返回首页5.4.1 MEMORY伪指令及其使用 MEMORY伪指令就是用来指定目标存储器的模型。MEMORY伪指令的一般语法为:SECTIONS name:property,property,property.name:property,property,property.name:property,property,property.返回本节5.4.2 SECTIONS伪指令及其使用 SECTIONS伪指令功能如下:说明如
43、何将输入段组合成输出段。在可执行程序中定义输出段。指定输出段在存储器中存放的位置。允许对输出段重新命名。图5-5 例5-6中段的定位返回本节5.5 汇编语言程序编写方法 5.5.1 汇编语言源程序格式 5.5.2 汇编语言中的常数和字符串 5.5.3 汇编源程序中的符号 5.5.4 汇编源程序中的表达式 返回首页5.5.1 汇编语言源程序格式 助记符指令一般包含4个部分,其一般组成形式为:标号:助记符 操作数 ;注释1标号区 所有汇编指令和大多数汇编伪指令前面都可以带有标号,标号可以长达32个字符,由AZ、az、09、_、和$符号组成,且第一个字符不能是数字,区分大小写。2助记符区 助记符区不
44、能从第一列开始,否则被认为是标号。3操作数区 操作数区是一个操作数列表,可以是常数、符号或常数与符号构成的表达式。操作数间需用“,”号隔开。4注释区 注释区可以从任何一列开始,可以包含ASCII字符和空格。返回本节5.5.2 汇编语言中的常数和字符串表5-3 COFF常数与字符串返回本节5.5.3 汇编源程序中的符号1标号2局部标号3符号常数4先定义的符号常数5替代符号表5-4 可以用在表达式中的运算符表5-5 带有绝对符号、可重定位符号的表达式返回本节5.5.4 汇编源程序中的表达式 表达式可以是常数、符号或由算术运算符结合的常数和符号。表达式值的有效范围为-3276832767。1运算符(
45、表5-4 所示)2合格的表达式(表5-5所示)返回本节5.6 TMS320C54x C语言编程 5.6.1 存储器模式 5.6.2 寄存器规则 5.6.3 函数调用规则 5.6.4 中断处理 5.6.5 表达式分析 返回首页5.6.1 存储器模式1段 C54x将存储器处理为程序存储器和数据存储器两个线性块。程序存储器包含可执行代码;数据存储器主要包含外部变量、静态变量和系统堆栈。编译器的任务是产生可重定位的代码,允许链接器将代码和数据定位进合适的存储空间。C编译器对C语言 编 译 后 除 了 生 成 3 个 基 本 段,即.t e x t、.d a t a、.b s s外,还 生成.cinit
46、、.const、.stack、.sysmem段。2C/C+系统堆栈.stack不同于DSP汇编指令定义的堆栈。DSP汇编程序中要将堆栈指针SP指向一块RAM,用于保存中断、调用时的返回地址,存放PUSH指令的压栈内容。.stack定义的系统堆栈实现的功能是保护函数的返回地址,分配局部变量,在调用函数时用于传递参数,保护临时结果。.stack定义的段大小(堆栈大小)可用链接器选项-stack size设定,链接器还产生一个全局符号_ _STACK_SIZE,并赋给它等于堆栈长度的值,以字为单位,缺省值为1K。3存储器分配(1)运行时间支持函数。(2)动态存储器分配。(3)静态和全局变量的存储器分
47、配。(4)位域/结构的对准。返回本节5.6.2 寄存器规则 寄存器规则明确了编译器如何使用寄存器以及在函数调用过程中如何保护寄存器。(1)辅助寄存器(2)堆栈指针SP(3)ARP(4)在默认情况下,编译器总是假定ST1中的OVM在硬件复位时被清0。若在汇编代码中对OVM置位为1,返回到C环境时必须复位。(5)寄存器变量 返回本节5.6.3 函数调用规则(1)局部帧的产生(2)参数传递(3)函数的返回 返回本节5.6.4 中断处理(1)中断的使能和屏蔽必须由程序员自己来设置。(2)中断程序没有参数传递,即使说明,也会被忽略(3)中断处理程序不能被正常的C程序调用。(4)为了使中断程序与中断一致,
48、在相应的中断矢量中必须放置一条转移指令,可以用.sect汇编伪指令建立一个简单的跳转指令表来完成此项功能。(5)在汇编语言中,注意在符号名前面加上一个下划线,例如c_int00记为_ c_int00。(6)中断程序使用的所有寄存器,包括状态寄存器和程序中调用函数使用的寄存器都必须予以保护。(7)TMS320C54x C编译器将C语言进行了扩展,中断可以利用interrupt关键字由C/C+函数直接处理。返回本节5.6.5 表达式分析 当C程序中需要计算整型表达式时,必须注意以下几点:(1)算术上溢和下溢。(2)整除和取模。(3)C代码对16位乘法结果高16位的访问。返回本节5.7 用C语言和汇
49、编语言混合编程 5.7.1 独立的C模块和汇编模块接口 5.7.2 从C程序中访问汇编程序变量 5.7.3 在C程序中直接嵌入汇编语句 返回首页5.7.1 独立的C模块和汇编模块接口 在编写独立的汇编程序时,必须注意以下几点:(1)不论是用C语言编写的函数还是用汇编语言编写的函数,都必须遵循寄存器使用规则。(2)必须保护函数要用到的几个特定寄存器。(3)中断程序必须保护所有用到的寄存器。(4)从汇编程序调用C函数时,第一个参数(最左边)必须放入累加器A中,剩下的参数按自右向左的顺序压入堆栈。(5)调用C函数时,注意C函数只保护了几个特定的寄存器,而其他是可以自由使用的。(6)长整型和浮点数在存
50、储器中存放的顺序是低位字在高地址,高位字在低地址。(7)如果函数有返回值,返回值存放在累加器A中。(8)汇编语言模块不能改变由C模块产生的.cinit段,如果改变其内容将会引起不可预测的后果。(9)编译器在所有标识符(函数名、变量名等)前加下划线“_”。(10)任何在汇编程序中定义的对象或函数,如果需要在C程序中访问或调用,则必须用汇编指令.global定义。(11)编辑模式CPL指示采用何种指针寻址,如果CPL=1,则采用堆栈指针SP寻址;如果CPL=0,则选择页指针DP进行寻址。返回本节5.7.2 从C程序中访问汇编程序变量 从C程序中访问在汇编程序中定义的变量或常数,可以分为以下3种情况