本文介绍程序存储器的基本功能,指令寻址方式,以及程序控制指令和中断的使用方法。
程序存储器保存着程序的代码、系数表和立即操作数,即指令的二进制码。C54x通过程序地址总线(PAB)寻址64K字的程序空间,对C5402 DSP处理器而言,有20条地址总线,因而对外部的寻址空间达到1M字。
1.程序地址产生单元(PAGEN)
1)作用:程序地址产生单元产生访问指令、16位立即数、系数表或存在在程序区内的其它信息地址,并将它放到程序地址总线PAB上;
2)组成框图:

# 程序计数器(PC)
# 重复计数器(RC)——用于RPT指令
# 块重复计数器(BRC)
# 块重复起始地址计数器(RSA)
#块重复结束地址计数器(REA)
#扩展程序计数器(XPC) ——位于MMR(001Eh)
3)附加应用:为提高性能,PAGEN也用来取程序存储器中的操作数,例:FIRS、MACD、MACP等指令;
2. 程序计数器(PC)
1)作用:它是一个16-bit计数器,保存有某个即将取指的指令在程序存储器中的地址,或16-bit立即数,或系数表的地址;
2)加载地址到PC的途径:
#复位后:PC=FF80;
#顺序执行指令:PC+1;
#非顺序执行指令:程序地址发生不连续(如分支转移、调用子程序、中断等),相应地址→PC;
3. 基本程序控制
1)分支转移:无条件转移和带条件转移

2)调用与返回: 无条件调用和

RETF[D]:快速返回,用于在中断服务程序中不再调用其它程序,也不再产生其他中断

3) 带延时指令和带条件执行指令的说明:
带延时指令(选项[D]):在指令执行之前,先执行紧跟在指令后面的一条双字指令或两条单字指令。这是由于在流水线到达执行阶段时,其后面两个指令字已被取指;
带条件执行指令的条件:可以是单条件或多重条件及其组合;
4)单周期条件执行指令(XC)的应用
如果条件分支转移出去的地方只有1~2字的程序段,则可以用XC指令来替代分支转移指令;
但是注意的是:1)、该指令和紧接着两个指令字是不能中断的和重复的; 2)被测试的条件是在指令执行之前的两个周期被采样的,因此如果指令前的两条单字指令或一条双字指令修改了条件,不会影响指令执行的结果
5)三条重复指令的应用—RPT、RPTZ、RPTB
利用这些指令进行的循环比BANZ指令要快;
重复单条指令—RPT、RPTZ

特点:(1)重复操作功能使多周期双操作数指令在执行一次后变成单周期指令,大大提高运行速度。其原因是PC不再是用作取指指令, 而作为程序空间的指针,利用空闲的程序存储器地址和数据总线并行地取第二个操作数; (2) 该指令不能套用循环; (3)一旦进入循环CPU不响应中断; (4)下列指令是不能做重复操作的

# 程序块的重复操作—RPTB[D]
#RPTB[D]将一段程序代码(指令块)重复若干次,可以是任意长度循环块,并提供零开销循环;
□ 语法:RPTB[D] pmad 2w/4c
□ 执行:STM #lk, BRC ; #lk→(BRC),确定循环次数(lk+1);
1→BRAF ;ST1(15)=(BRAF),块重复标志
if (delayed) then (PC)+4→RSA
else (PC)+2→RSA
pmad→REA;
Do BRC-1, untill BRC=0 , BRAF=0;
特点:① 对任意长的循环程序段,循环开销为零;
② 可以响应中断;
③ 可以通过对BRAF位清零来禁止循环;
④ 如果保存好 BRC、RSA、REA的值,可以实行嵌套循环,但效率不高;
6)循环嵌套:
由于RPT用到RC寄存器,RPTB用到BRC、RSA、REA寄存器,因而两者可以嵌套使用。
最外层可以用BANZ指令,因为用RPTB指令所费的时间比用BANZ指令花销更多。

4.复位操作—

复位操作是一个不可屏蔽中断,它可以在任何时候使'C54x进入一已知状态。复位期间,处理器的操作如下:。
#是硬件复位 ,上电后 应维持 5个时钟周期的低电平以确保数据、地址和控制线的正确配置;
#复位后,处理器从FF80H处取指,并开始执行程序。若 =0 ,从片内ROM开始执行,否则从片外存储器开始执行;
#对复位期间没有初始化的状态位和SP,用户必须在程序中对其初始化;
5. 中断
定义:中断是由硬件驱动或软件驱动的信号,中断信号使'C54x CPU暂定正在执行的程序,而进入中断服务程序(Interrupt Service Routine ISR) 。
#中断系统是计算机中提供实时操作及多任务、多进程操作的关键部分;
# 'C54x根据芯片型号不同,有24~27个软件和硬件中断('C5402有30个中断),共分为14个中断优先级,可以实现多任务嵌套。
#向量中断:中断→中断号→向量表中的位置→ ISR
中断类型

从CPU的管理角度:
可屏蔽中断:可以通过软件屏蔽或放开的软、硬件中断;
对'C5402有14个 :外部(INTx)— 4个,
定时(TINT) — 2个,
缓冲接收串口(BRINT) — 2个,
缓冲发送串口(BXINT) — 2个,
主机接口(HPINT) — 1个,
DMA通道(DMACx) — 3个,
不可屏蔽中断:'C54x对这类中断总是响应的,并从主程序转移到ISR;
包括:所有软件中断(14个)、 RS(Priority 1) 、NMI(Priority 2);
NMI不会对CPU操作产生影响,但它可以中断主程序、ISRs和它自己,而且不保留INTM的状态(使INTM=1),因而从NMI返回时将产生不确定结果。如果不用,最好把它置于高电平,防止意外中断。
2)中断标志寄存器(IFR)和中断屏蔽寄存器(IMR)
3) 中断处理过程
# 主程序中有关中断部分的初始化:
1) 选择中断源;2)建立中断向量表;3)开放相应的中断;4)开放全局中断(INTM=0);
# 接受中断请求:
# CPU对中断响应后的动作

执行中断服务程序
编写中断服务程序注意点:
① 必须把某些寄存器的值保存到堆栈(保护现场),返回时以相反的次序恢复这些值(恢复现场);
② 一般必须保护ST0和ST1,因为其中保存了处理器状态的重要信息;
③ 如果在ISR中使用了RPTB指令,则必须保护BRC寄存器,而且必须在恢复ST1之前,恢复BRC,否则先恢复的ST1中BRAF位会被清零;
④ 如果是与C混合编程,最好把AR1、AR6和AR7也保存起来,这是C编程默认的变量寄存器
中断返回指令

4) 中断向量地址的重新安排
#复位后中断向量的地址是可以更改的;
# 'C54x中断向量的地址由PMST中的IPTR(中断向量指针,PMST的15~7位)和左移2位后的中断向量序号(中断向量序号为0~31 ,左移2位后变成7位)组成,下例是复位时中断向量的地址:

如果希望把中断向量表放在0x80位置,所用的中断向量为BRINT1(串口1,接收中断),则该中断向量的地址为
