1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第,3,章 程序控制和中断管理,在执行当前指令的同时,程序流要求处理器生成下一条指令的程序地址,预定程序的路线。,程序地址的产生见下图:,3.1,程序地址的产生,程序地址产生框图,程序地址产生逻辑使用的硬件,器件,功能,程序计数器(,PC,),对内部和外部程序存储器寻址,程序地址寄存器(,PAR,),驱动程序地址总线,提供程序的读、写地址,堆栈,保存返回地址,微堆栈(,MATACK,),保存返回地址,重复计数器(,RPTC,),与重复指令(,RPT,)一起,用来确定,RPT,后的一条指令重复执行的次数。,程序地址产生源,操作,程序地址来源,顺
2、序操作,程序计数器,PC,(程序地址,+1,),空周期,程序地址寄存器,PAR,(程序地址,+1,),从子程序返回,堆栈栈顶(,TOS,),从表传送或块传送返回,微堆栈(,MSTACK,),转移到或调用指令中指定,的地址,转移到或调用累加器低半部分指定的地址,转移到中断服务程序,转移或调用指令,即利用程序读总线,(,PRDB,)的方式获取程序地址。,累加器的低半部分,即利用数据读总线,(,DRDB,)的方式获取程序地址,中断矢量单元,即利用程序读总线,(,PRDB,)的方式获取程序地址。,1,、程序计数器,程序地址产生逻辑使用,16,位程序计数器(,PC,)对内部和外部程序存储器寻址,,PC,
3、中存放将被执行的下一条指令的地址。通过程序地址总线(,PAB,),从程序存储器该地址处取出指令并装入指令寄存器,当装载入指令寄存器时,,PC,中保存下一个地址。,装入,PC,中的地址,将累加器低,16,位加载到,PC,。利用,BACC,(转移到累加器中的地址)或,CALA,(调用累加器指令单元的子程序)指令可实现计算转移操作,加载到,PC,的地址,顺序执行,若当前指令字是一个字,则将,PC+1,加载到,PC,若当前指令字是两个字,则将,PC+2,加载到,PC,转移,转移指令后的长立即数直接加载到,PC,子程序调用和返回,调用指令:将,PC,中的下一条指令的地址压入堆栈,然后将调用的指令后的长立
4、即数加载到,PC,返回指令:将返回地址从堆栈中弹回,PC,软件或硬件中断,将相应的中断矢量地址装入,PC,。在该矢量单元,通常有一条转移指令,又将相应的中断服务程序的地址加载到,PC,计算转移,代码操作,2,、堆栈,16,位宽、,8,级深的硬件堆栈。当调用子程序或发生中断时,程序地址产生逻辑用其保存返回地址。,当,CPU,进入子程序或中断服务程序时,返回地址自动装入该堆栈的栈顶,这一操作不需附加周期。,当子程序或中断服务程序完成时,返回指令将返回地址从栈顶传送到程序计数器。,当不需要用,8,级返回地址时,该堆栈也可用来保存子程序或中断服务程序的有关数据或用于其他目的。,访问堆栈的指令:,PUS
5、H,(压入)和,POP,(弹出),PUSH,:把累加器的低,16,位拷贝到栈顶,POP,:把栈顶值拷贝到累加器低,16,位,PSHD,和,POPD,当子程序或中断嵌套超过,8,级时,利用此指令在数据存储区中建立一个堆栈。,PSHD,把数据存储器中的值压入栈顶,,POPD,将栈顶值弹出到数据存储器。,3,、微堆栈,微堆栈只有,1,级深、,16,位宽,没有可以使用微堆栈保存信息的指令,只有程序地址产生逻辑才能够使用微堆栈。,程序地址产生逻辑在执行,BLDD,、,BLPD,、,MAC,、,TBLR,及,TBLW,指令时,用微堆栈保存返回地址。执行这些指令时,首先把,PC+1,的地址送到微堆栈保存,然
6、后用,PC,存放第一个操作数的地址,用辅助寄存器算术单元,ARAU,产生第二个操作数的地址,当这些指令重复执行时,,PC,可使第一个操作数的地址自动增量,,ARAU,使第二个操作数的地址改变,到所重复的指令完成时再将微堆栈弹回到程序地址产生逻辑。,4,、流水线操作,指令流水线包括执行时发生的一系列总线操作。,LF240 x,的流水线有,4,个独立的阶段:取指令、指令译码、取操作数和执行指令。,4,个操作阶段是独立的,在任意的指定周期内,,14,个不同的指令都被激活,每一条被激活的指令都处于不同的完成阶段。,4,级流水线的操作,流水线操作一般是不可见的,但下列情况例外:,(,1,)紧跟在修改全局
7、存储器分配寄存器(,GREG,)后的单字、单周期指令使用先前的全局映射。,(,2,)在流水线操作的执行阶段,,NORM,指令修改,ARP,,并使用当前辅助寄存器,如果随后的两个指令要改变当前辅助寄存器的内容或,ARP,,则它们将在流水线的译码阶段进行,这将导致,NORM,指令使用错误的辅助寄存器值,并导致随后的指令使用错误的,ARP,值。所以在,NORM,后不要安排改变当前辅助寄存器和,ARP,内容的指令。,转移、调用和返回改变指令流的顺序,转到新的地址单元去执行指令。,转移仅使控制转换到新的地址单元;调用要将返回地址保存到硬件堆栈的栈顶;返回指令将堆栈中的返回地址弹到程序计数器。,3.2,转
8、移、调用和返回,1,、无条件指令,无条件转移,执行无条件转移时,将指定的程序存储器的地址加载到,PC,上,并从该地址开始执行程序。加载到,PC,的地址可以来自转移指令的第二个操作数,也可能是累加器的低,16,位。,无条件转移指令有,B,(转移)和,BACC,(转移到累加器指定的地址)。,无条件调用,执行无条件调用时,将指定的程序存储器的地址加载到,PC,上,并从该地址开始执行程序。加载到,PC,的地址可以来自转移指令的第二个操作数,也可能是累加器的低,16,位。加载,PC,之前将返回地址保存到堆栈。子程序或函数执行之后,返回指令将返回地址从堆栈加载到,PC,,从调用指令后的那条指令开始执行。,
9、无条件转移指令有,CALL,、,CALA,(调用累加器指定单元处的子程序)。,无条件返回,执行无条件返回指令(,RET,)时,将栈顶的值加载到,PC,,并从该地址继续执行程序。,2,、有条件指令,操作符号,条件,描述,EQ,NEQ,LT,LEQ,GT,GEQ,C,NC,OV,NOV,BIO,TC,NTC,ACC=0,ACC,0,ACC0,ACC,0,C=1,C=0,OV=1,OV=0,BIO,低,TC=1,TC=0,累加器的值等于,0,累加器的值不等于,0,累加器的值小于,0,累加器的值不小于,0,累加器的值大于,0,累加器的值不大于,0,进位位置,1,进位位清,0,检测到累加器溢出,检测到累
10、加器不溢出,BIO,引脚为低电平,测试,/,控制位置,1,测试,/,控制位清,0,使用多个条件,组,1,组,2,A,类,B,类,B,类,A,类,C,类,EQ,NEQ,LT,LEQ,GT,GEQ,OV,NOV,NTC,TC,C,NC,BIO,在条件指令的操作数中可以列出多个条件,必须所有条件都满足才是条件满足。,对于每一种组合,必须按如下规则从组,1,组,2,中选择条件。,组,1,:最多可选两个条件。每个条件来自不同的类。,组,2,:最多可选,3,个条件。每个条件来自不同的类,不能有两个条件来自同一类。,条件指令必须能测试到状态位的最新值。直到流水线的执行阶段,即前一条指令执行后一个周期才能认为
11、条件稳定。流水线控制器在条件稳定之前停止对条件指令后的任何指令译码。,条件的稳定性,条件转移(,BCND,、,BANZ,):,该指令使程序转移到程序存储器的任何地址,只有满足一个或多个由用户指定的条件时,才能实现转移。此时,,PC,装载转移指令的第,2,个字,并从该地址开始继续执行此指令。,无条件转移指令有,BCND,(条件转移)和,BAND,(若当前辅助寄存器不为,0,,则转移)。,条件指令的执行,条件调用(,CC,):,该指令可使程序根据处理数据的不同在多个子程序间进行选择,只有当用户指定的一个或多个特定条件满足时才能调用。此时,,PC,装载调用指令的第,2,个字,并将返回地址保存在堆栈中
12、然后执行子程序。,条件返回,返回指令(,RET,):,与调用或中断配合使用。调用或中断把返回指令保存到堆栈里,被调用的子程序或中断服务程序以返回指令结束,该指令将返回地址从堆栈弹到,PC,。,条件返回指令(,RETC,):,当用户指定的一个或多个条件满足时才执行。利用该指令可使子程序或中断服务程序有多种返回路径。,3.3,重复指令,重复指令(,RPT,):将单条指令重复执行,N+1,次。,N,为指令的操作数。,执行,RPT,时,,N,装入重复计数器,RPTC,,每执行一次,,RPTC,减,1,,直至,RPTC,为,0,。如果,N,是从一个数据存储单元读取,,RPTC,为,16,位计数器;如果
13、N,为一操作常数,,RPTC,为,8,位计数器。,3.4,中断,中断是计算机的一种特殊的运行方式。在正常情况下,,CPU,按照程序预定的路线进行,当外围设备有事件产生需要,CUP,来处理,即发出中断请求信号,,CPU,暂停工作,保存好现场,然后转到该中断请求对应的服务子程序的入口处,待服务子程序运行完毕,,CPU,自动恢复现场,从原停顿点继续往下运行。,计算机采用中断方式,可以节省,CPU,资源,,CPU,可以不花时间去轮寻外围设备是否需要服务。每一种计算机都有多个中断源,,CPU,对中断的响应需要按序进行,需要一个中断管理系统模块对中断源进行管理控制。,1,、中断的分类,软件中断,由指令,
14、INTR,、,NMI,和,TRAP,产生。,硬件中断,由来自物理设备的信号产生,包括复位 、非屏蔽中断,NMI,和可屏蔽中断,INT1,、,INT2,、,INT3,、,INT4,、,INT5,、,INT6,。,可屏蔽中断,可以通过软件将它们禁止或允许的中断。均为硬件中断。当硬件设备或外部引脚成功地请求了可屏蔽中断时,与其对应的一个或几个标志被激活,无论是否响应此中断,这些标志均被设置为,1,。,不可屏蔽中断,不能通过软件将其禁止或允许的中断。包括所有软件中断和两种外部硬件中断 和 。,外设事件要引起中断,必须保证:外设事件的中断使能位被使能,,CPU,内核级的,6,个可屏蔽中断中,能控制该外设
15、事件高级中断至少有一个被使能。在外设事件发生时,首先将其在外设中断控制器中的标志位置,1,,然后会在中断标志寄存器,IFR,中的,INTx,位由硬件置,1,,表明正在等待,CPU,响应,从而引起,CPU,内核的,INT1INT6,中的一个产生中断。,中断响应的延时,从发出中断请求到得到服务之间的延迟时间,与很多因素有关:,(,1,)软件中断最少要延时,4,个,CPU,时钟周期。,(,2,)外部可屏蔽中断最少要延时,8,个,CPU,时钟周期。,(,3,)若在使用,RPT,重复时发生中断,为了保证指令流水线的完整,需等到该重复循环完才响应中断。但复位中断例外。,(,4,)为使,CPU,能完成返回,
16、在,RET,指令后中断被禁止,直至在返回指令上至少执行一条指令。,(,5,)读写速度慢的外部存储器需要等待延时,如果中断向量存放在外部存储器,等待状态会影响中断的响应时间。,当,CPU,接受中断请求时,并不知道是哪一个外设事件引起的中断请求。为了让,CPU,能够区别这些引起中断的外设事件,,DSP,控制器给每个中断分配了一个特定的入口地址,称为中断向量。,在每个外设中断请求有效时都会产生一个唯一的外设中断向量,这个外设中断向量被装载到外设中断向量寄存器(,PIVR,)中。,CPU,应答外设中断时,从,PIVR,中读取相应中断的向量,并产生一个转到该中断服务程序入口的向量。当某个中断发出请求,而
17、且允许中断,则,CPU,先将当前的,PC,加,1,压入堆栈,即保护返回地址;然后,,CPU,自动地将该请求中断的向量地址送入,PC,,,CPU,便转入该请求中断的服务子程序运行;当碰到服务子程序的返回指令,RET,时,,CPU,自动将堆栈中的返回地址弹出到,PC,中,恢复中断前的程序继续进行。,2,、中断向量,为了更好地管理中断复用情况,,DSP,控制器为事件管理模块的每一个中断分配了一个偏移向量地址,并且当某个事件管理模块发出了请求信号,会自动地将该中断的偏移向量地址写入到对应的事件中断向量寄存器中。当进入,DSP,内核中断的服务子程序,GISR,后,将事件中断向量寄存器的内容送到累加器,然
18、后经分支指令便可转入到专为某个事件管理模块中断所写的中断服务子程序,SISR,的入口。,在程序存储器的,0000h003FH,单元。,每个中断有两个地址单元。存放一条两个字的分支指令(如,B,指令)。这样,可以在较大的程序存储空间中开辟出一块存放中断服务子程序的空间,通过中断向量处的分支指令转入到真正的中断服务子程序空间的入口处。,中断优先级和中断矢量表,TMS320LF240 xCPU,提供了,6,个可屏蔽中断:,INT1INT6,,,INT1,优先级最高,,INT1,最低。利用,6,个中断级,采用中断扩展设计可以使芯片能够管理,46,个可屏蔽中断请求。,3,、,TMS320LF240 x,
19、的可屏蔽中断,中断标志寄存器(,IFR,):,位于数据存储器的,0060H,,用于识别和清除挂起的中断。,当中断源,INT1INT6,中某一级向,CPU,发出可屏蔽中断请求时,控制寄存,器中响应的标志位被置,1,。如果该中断未被屏蔽,则中断请求被送到,CPU,,,表明该中断正被挂起或等待响应。,读取,IFR,可以识别挂起的中断,向,IFR,相应的位写,1,则清除已挂起的中断。,把,IFR,中当前的内容写回,IFR,则可清除所有挂起的中断,CPU,响应中断或器件复,位则将,IFR,标志清除。,(,1,)、,CPU,中断管理寄存器,IFR,INT1 flag,INT2 flag,INT3 flag
20、INT4 flag,INT5 flag,INT6 flag,Reserved,D15D6,D0,D1,D2,D3,D4,D5,D15D6 Reserved-,保留位。,D5 INT6 flag-,中断,6,标志位。作为连至,INT6,的所有外部中断的标志。,D4 INT5 flag-,中断,5,标志位。作为连至,INT5,的所有外部中断的标志。,D3 INT4 flag-,中断,4,标志位。作为连至,INT4,的所有外部中断的标志。,D2 INT3 flag-,中断,3,标志位。作为连至,INT3,的所有外部中断的标志。,D1 INT2 flag-,中断,2,标志位。作为连至,INT2,的所
21、有外部中断的标志。,D0 INT1 flag-,中断,1,标志位。作为连至,INT1,的所有外部中断的标志。,中断屏蔽寄存器(,IMR,):,位于数据存储器的,0004H,,包含所有中断级(,INT1INT6,)的屏蔽位。,读,IMR,可以识别以被屏蔽或被使能的中断,向,IMR,中某位写,0,则屏蔽相,应的中断级;写,1,则使能该中断级。,IMR,INT1 mask,INT2 mask,INT3 mask,INT4 mask,INT5 mask,INT6 mask,Reserved,D15D6,D0,D1,D2,D3,D4,D5,D15D6 Reserved-,保留位。,D5 INT6 mas
22、k-,中断,6,屏蔽位。,D4 INT5,mask,-,中断,5,屏蔽位。,D3 INT4,mask,-,中断,4,屏蔽位。,D2 INT3,mask,-,中断,3,屏蔽位。,D1 INT2,mask,-,中断,2,屏蔽位。,D0 INT1,mask,-,中断,1,屏蔽位。,(,2,)外设中断寄存器,外设中断寄存器包括:,1,个外设中断矢量寄存器(,PIVR,,地址,701Eh,);,3,个外设中断请求寄存器,0/1/2,(,PIRQR0/1/2,地址,7010h/,7011h/,7012h,);,3,个外设中断应答寄存器,0/1/2,(,PIACK0/1/2,地址,7014h/,7015h/
23、7016h,)。,外设中断请求寄存器,0/1/2,和外设中断应答寄存器,0/1/2,是外设中断扩展模块用来向,CPU,产生,INT1INT6,中断请求的内部寄存器。只能对其测试(可读),不能对其编程(不可写)。,外设中断请求寄存器,0/1/2,的某位为,1,,表明相应的中断请求被挂起;为,0,,未被挂起。向某位写,1,将发出一个中断请求到,CPU,,写入,0,没影响。向外设中断应答寄存器的某位为,1,,将引起相应的外设中断应答被插入,从而将相应的外设中断请求位清,0,,但不改变外设中断矢量寄存器的内容。,(,3,)外设中断控制寄存器,外设中断,1,控制寄存器(,XINT1CR,),XINT1
24、 flag,Reserved,XINT1 polarity,XINT1 priority,XINT1 enable,D14D3,D0,D1,D2,D15,D15 XINT1 flag-XINT1,标志位。指示在,XINT1,引脚上是否检测到一个跳变,无论外部中断,1,是否使能,,XINT1,引脚中跳变时该位总被置位。当相应的中断被应答时,该位被自动清,0,,通过软件向该位写,1,或复位是该位被清,0,。,0-,未检测到跳变;,1-,检测到跳变。,D14 D3 Reserved-,保留位。,D2 XINT1 polarity-XINT1,极性。,0-,在下降沿产生中断;,1-,在上升沿产生中断,
25、D1 XINT1 polarity-XINT1,优先级。,0-,高优先级;,1-,低优先级,D0 XINT1 enable-XINT1,使能位。,0-,屏蔽中断;,1-,使能中断,外设中断,2,控制寄存器(,XINT2CR,),XINT2 flag,Reserved,XINT2 polarity,XINT2 priority,XINT2 enable,D14D3,D0,D1,D2,D15,D15 XINT2 flag-XINT2,标志位。指示在,XINT1,引脚上是否检测到一个跳变,无论外部中断,1,是否使能,,XINT2,引脚中跳变时该位总被置位。当相应的中断被应答时,该位被自动清,0,,通
26、过软件向该位写,1,或复位是该位被清,0,。,0-,未检测到跳变;,1-,检测到跳变。,D14 D3 Reserved-,保留位。,D2 XINT2 polarity-XINT2,极性。,0-,在下降沿产生中断;,1-,在上 升沿产生中断,D1 XINT2 polarity-XINT2,优先级。,0-,高优先级;,1-,低优先级,D0 XINT2 enable-XINT2,使能位。,0-,屏蔽中断;,1-,使能中断,4,、不可屏蔽中断,(,1,)硬件非屏蔽中断,:,TMS320LF240 x,有两个复位源:一个外部复位引脚复位和一个程序监视定时器(看门狗)复位。,复位引脚为一个,I/O,脚,如
27、果有内部复位事件(程序监视定时器复位)发生,则该引脚被设置为输出方式,并且为低电平,向外部电路表明器件正在自己复位。,外部复位引脚信号和程序监视定时器复位信号相或后一起驱动,CPU,的复位信号。,当复位信号有效后,,CPU,将终止一切工作,把系统复位到缺省状态上,同时,自动转到复位中断向量,0000h,处开始程序的运行,因此在程序存储器的首地址,0000h,必须安排一个分支到主程序入口的指令。,:,TMS320LF240 x,无该引脚,当器件访问一个无效地址时,将产生非屏蔽中断请求 ,程序则转移到非屏蔽中断矢量地址,0024h,处,从中取出一条转移指令,然后转向非屏蔽中断的入口,执行相应的中断
28、服务程序。,无效地址检测:系统和外设模块控制寄存器地址映射中包含不可实现单元,译码逻辑能够检测任何对于这些无效地址的访问。一旦检测到对无效地址的访问,就将系统控制和状态寄存器(,SCSR1,)中的无效地址标志位(,ILLADR,)置,1,,从而产生一个不可屏蔽中断,NMI,。无论何时检测到访问无效地址都会产生插入一个无效地址条件,无效地址标志位在无效地址条件发生之后被置,1,,并保持直到软件将其清除。,(,2,)软件非屏蔽中断,INTR K,该指令允许启动任何中断,指令操作数,K,表示,CPU,将转移到哪个中断矢量单元,当响应,INTR,中断时,,ST0,中的,INTM,位置,1,,禁止可屏蔽
29、中断。,NMI,该指令允许转移到中断矢量地址,24h,,与不可屏蔽中断 使用同一单元。即 引脚为低或执行,NMI,均可启动 中断。当执行,NMI,指令时,,INTM,置,1,以禁止可屏蔽中断。,TRAP,该指令使,CPU,转移到中断矢量地址,22h,,,TRAP,不禁止任何不可屏蔽中断。当,CPU,转移到中断服务程序时,该中断服务程序可以被可屏蔽硬件中断所中断。,5,、中断服务程序(,ISR,),CPU,得到中断请求并响应之后,根据中断矢量转移到相应的中断服务程序,ISR,中,,ISR,在为中断所要求的任务前需要保存和恢复寄存器的值,并且还要管理中断嵌套。,(,2,),中断服务程序嵌套的管理,
30、考虑中断嵌套时,需注意:,若希望一个可屏蔽中断能够中断,ISR,,那么,该,ISR,必须不屏蔽该中断,,可在中断服务程序中,对,IMR,中的相应位设置和执行允许中断指令(,CLRC,INTM,)来解除该中断屏蔽。,8,级硬件堆栈。如果软件需要的堆栈超过,8,级,可以使用,POPD,和,PSHD,指令将堆栈有效地扩展到数据存储空间。,防止意外嵌套功能。在返回指令,RET,前至少两条指令的位置上插入,CLRC,INTM,指令。,(,1,),保存和恢复寄存器值,CPU,进入中断服务程序(,ISR,)之前,硬件只将增量后的程序计数器的值自动保存起来,所以在中断服务程序中要用软件对一些重要寄存器的值进行
31、保存和恢复。,3.5,复位操作,复位是优先级最高的中断。属于不可屏蔽中断。复位可以在任何时候将器件设置为一个已知状态。复位通常在电源打开之后被启动。由于复位可终止存储器操作并初始化状态位,因此每次复位后必须重新初始化系统。,进行复位时,自动对以下几部分进行如下工作:,(,1,)控制部分,在控制部分将,PC,,,IFR,、,IMR,、,ICR,、,RPTC,全部清,0,。,将,ST0,、,ST1,中的各状态位加载为复位值:,OV=1,,,INTM=1,,,CNF=0,,,SXM=1,,,C=1,,,XF=1,,,PM=00,。,(,2,)存储器和,I/O,空间,ST1,中,CNF=0,,,DRA
32、M,中,B0,被影射到数据存储空间。,全局存储器分配寄存器,GREG,清为,0,,全部存储器为局部存储器。,(,3,)片内外设,3.6,低功耗模式,(,1,)进入低功耗模式,TMS320LF240 x,有三种低功耗模式:,IDLE1,、,IDLE2,、,HALT,。有,SCSR1,指定。,所有,240 x,器件有两个时钟:,CPU,时钟(为大部分,CPU,逻辑提供时钟)和系统时钟(从,CPU,的,CLKOUT,引出,提供外部时钟与,CPU,中断逻辑时钟。),当,CPU,进入,IDLE1,模式时,,CPU,时钟停止工作而系统时钟继续工作。,执行,IDLE,可进入低功耗模式。当执行,IDLE,指令
33、时,程序计数器加,1,,,CPU,停止所有操作,器件处于低功耗模式。此时,内部寄存器内容全部保持,片内,RAM,的内容保持不变。,当,CPU,进入,IDLE2,模式时,,CPU,时钟系统时钟都停止工作。,当,CPU,进入,HALT,模式时,,CPU,时钟系统时钟都停止工作。且振荡器、,WDCLK,、,PLL,的时钟输入均被关断。,(,2,)结束低功耗模式,如果低功耗模式已经启动,则任何硬件中断都可以使处理器脱离,IDLE,状态。,若使用,NMI,和复位引脚,,CPU,将立即执行相应的中断服务程序,如果是复位,则寄存器将被设置为复位值。,若使用可屏蔽中断源唤醒处理器,该中断源必须没有被中断屏蔽寄存器所屏蔽。此时,INTM,的值将决定结束低功耗模式后,CPU,的动作。,INTM=0,,中断被允许,,CPU,执行相应的中断服务程序,,INTM=1,,中断被禁止,,CPU,将继续执行,IDLE,后的程序。,






