中断处理机制Word格式.docx
- 文档编号:21664576
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:16
- 大小:470.66KB
中断处理机制Word格式.docx
《中断处理机制Word格式.docx》由会员分享,可在线阅读,更多相关《中断处理机制Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
因此,IPEND可以记录所有的被系统挂起的中断和正在服务的中断。
(9)在执行中断A的中断服务程序时,RTI指令就会清除相应的IPEND位。
但是,相关的SIC_ISR位不会被清除,除非中断服务程序清除了产生中断A的机制,或者服务中断的进程清除了该位。
仿真、复位、NMI、异常事件、硬件错误(IVHW)和内核定时器(IVTMR)中断请求在ILAT级上进入中断处理链,所以它们不受系统级的中断寄存器组(SIC_IWR,SIC_ISR,SIC_IMASK,SIC_IARx)的影响。
如果有很多个中断源共享一个内核中断,那么中断服务程序(ISR)就必须能识别产生中断的外设。
这时ISR可能就需要询问外设是否产生了中断,以确定要执行的程序。
BlackfinDSP系统有很多的外设,因此需要支持很多中断。
表2-12列出了以下几种中断:
(1)外设中断源
(2)在系统中断分配寄存器(SIC_IARx)中使用的外设中断ID号
(3)复位时所映射的通用的内核中断
(4)在系统中断分配寄存器(SIC_IARx)中使用的内核中断ID号
BlackfinDSP的中断结构非常灵活。
复位时,多个外设中断共享一个内核中断。
此时中断服务程序必须查询相应的系统MMR,以确定是哪个外设产生了中断。
如按表2-12所示的默认设置,中断初始化需要包括内核EVT向量地址表和IMASK寄存器的初始化,同时需去掉在SIC_IMASK中指定外设的指定屏蔽。
2.5.3中断控制寄存器
1.系统中断唤醒使能寄存器(SIC_IWR)
SIC提供了外设中断源和动态电源管理控制器(DPMC)之间的映射。
任何一个BlackfinDSP外设都可以设置成从空闲状态唤醒内核进入中断过程。
这只需设置系统中断唤醒使能寄存器(如图2-25)中的相应位既可。
如果SIC_IWR允许一个外设中断,并且内核处于空闲状态,中断使DPMC发起唤醒内核的时序,以便执行中断过程。
注意该操作模式会增加中断过程的响应时间,响应时间取决于电源状态。
在默认状态,所有的中断都会产生一个唤醒请求给内核。
但是,在某些应用中,一些外设最好不要使用这个功能,如SPORTx发送中断。
如果内核没有处于空闲状态,SIC_IWR寄存器对内核是没有影响的。
这个寄存器中的位在系统中断屏蔽寄存器(SIC_IMASK)和中断状态寄存器(SIC_ISR)(如图2-26)中有相对应的位。
复位后,寄存器中的所有有效位被设置为1,使能所有未屏蔽中断的唤醒功能。
在使能中断之前,要在复位初始化序列中配置这个寄存器。
可以在任何时间读写SIC_IWR,但为了防止假中断或丢失中断,必须在禁止了所有的外设中断后在设置这些寄存器。
唤醒功能和中断屏蔽功能是相互独立的。
如果在SIC_ISR中使能了一个中断源,而在SIC_IMASK中屏蔽了该中断源,那么如果内核处于空闲状态,内核就会被唤醒,但是不会产生一个中断。
2.系统中断状态寄存器
SIC有一个只读的状态寄存器--系统中断寄存器,如图2-26。
寄存器中某一个有效位对应于一个外设中断源。
当SIC发现一个中断被激活时,相应的位被置位;
当一个中断被撤销时,相应的为被清除。
由于多个中断源共享一个中断,中断服务程序可能要查询多个中断状态位,才能确定中断源。
在中断服务程序中,首先执行的指令应该是读SIC_ISR指令,以确定在共享输入的外设中是否有多个外设的中断输出有效。
在执行RTI之前,服务程序应该处理所有被挂起的共享中断。
很多系统需要一个相对较少的中断使能外设,使得每一外设一对一地映射到内核的优先级上。
在这些设计中,SIC_ISR几乎不需要询问外设。
所以该寄存器的位是非“黏性”的,进而,软件也就不需要清除这些寄存器内容。
SIC_ISR寄存器不受中断屏蔽寄存器状态的影响,而且可以在任何时候读它。
写SIC_ISR不影响其内容。
3.系统中断屏蔽寄存器(SIC_IMASK)
系统中断屏蔽寄存器(如图2-27)可以屏蔽SIC上的任何一个外设中断源,而不管该外设的中断是否被使能。
复位将SIC_IMASK的内容强迫清零,所有外设的中断被屏蔽。
向一个单元写1将解除对相应中断的屏蔽,并且使能该中断。
在监控模式下,尽管可以在任何时间读写该寄存器,但是在使能该中断之前,应该在复位初始化序列中配置该寄存器。
其中,SIC_IMASK[31]位提供对内核二次错误条件的屏蔽,具体如下:
(1)如果该条件是非屏蔽的,并且内核发现一个二次错误条件,就会产生硬件复位;
‘
(2)如果该条件是屏蔽的,并且内核发现一个二次错误条件,内核行为将不可靠。
4.系统中断设置寄存器(SIC_IARx)
通过将外设中断映射到内核中适当的通用中断级上,可以设置外设中断的优先权。
这种映射关系受系统中断设置寄存器控制,具体参见图2-28、2-29和2-30。
如果有多个中断源映射为同一个中断,它们可以是逻辑或的关系,从而没有硬件优先级。
在一个特定的系统应用中,可以根据需要通过软件为中断处理分配优先级。
在监控模式下,可以在任何时刻对这些寄存器进行读写操作。
但最好在使能中断之前,在复位中断服务程序中配置这些寄存器。
为了防止假中断和丢失中断,这些寄存器的写操作应该在所有外设的中断被禁止时进行。
表2-13定义了在设置外设到一个特定的IVG优先级时写入SIC_IARx的指。
2.5.4事件控制器的寄存器
事件控制器使用了3个MMR来协调挂起事件的请求。
某一个寄存器都是16位的,并且寄存器中的每一位(其序号用N表示)都对应事件向量表中的一个事件。
这些寄存器是:
(1)IMASK--中断屏蔽寄存器;
(2)ILAT--中断锁存寄存器;
(3)IPEND--中断挂起寄存器。
事件控制器不断地更新ILAT和IPEND。
IPEND在监控模式下是一个只读寄存器。
ILAT和IMASK在监控模式下是可读可写的寄存器,但ILAT[0]只能读。
在用户模式下,不能对这三个寄存器进行操作。
1.内核中断屏蔽寄存器(IMASK)
IMASK寄存器中的每一位指示对应的中断是否被使能(见图2-31)。
一个中断位在ILAT寄存器中设置后,只有在IMASK中也设置了这个位,内核才会接受这个位所控制的中断。
在监控模式下,可以对寄存器IMASK进行读和写操作。
只有仿真器才可以屏蔽防止事件。
2.内核中断锁存寄存器(ILAT)
ILAT这的每一位指示对应的中断是否被锁存(图2-32)。
在执行ISR中的第一条指令之前,ILAT中的相应位就会自己复位。
ILAT寄存器中的任何一位只有在IMASK寄存器中的对应位被置位时,才可以进行写操作。
否则,该写操作就不起作用。
当需要清除被锁存的中断而不是服务该中断时,就可以使用这种写操作功能。
当一个事件被服务时,它在ILAT中的对应位就会被清除。
指令RAISEN使ILAT寄存器中的第N位置位,并且只能被IVG15-IVG7、IVTMR、IVHW、NMI和RST等事件触发。
其中只有JTAG的TRST脚才可以清除ILAT[0]。
3.内核中断挂起寄存器(IPEND)
IPEND寄存器记录了当前所有的嵌套中断(图2-23)。
IPEND寄存器中的每一位指示一个中断是否被激活,或者是否在某一级上被嵌套。
在监控模式下,可以对该寄存器进行读操作,但不能进行写操作。
在进入或退出一个中断服务程序时,事件控制器使用IPEND[4]位暂时性地禁止中断。
当正在处理一个事件时,IPEND中相对应的位就会被置位。
IPEND中的最低位指示当前正在被服务的中断。
任何时刻,IPEND都记录了所有被嵌套事件的当前状态。
2.5.5中断的全局禁止和使能
通用中断可以用CLIDreg指令全局禁止,可以用STIDrg指令全局使能。
这两种操作都只能在监控模式下使用。
复位、NMI、仿真和异常事件都不能使用全局使能和禁止的方法。
当保存了IMASK的当前状态后,全局禁止就会清除IMASK[15:
5]。
2.5.6事件向量表
事件向量表(EVT)是一个硬件表,有16个表项每个表项32位宽。
EVT包含某一个可能事件的入口。
某一个入口都可以作为MMR来复位,并且在复位时都可以用中断服务程序的矢量地址编程。
当一个事件发生时,在该事件的EVT入口所指的地址处开始读取指令。
BlackfinDSP的结构允许一个中断向量编程唯一的地址,也就是说,中断向量不是以中断矢量表基地址的偏移量来确定的。
这种方法不需要从矢量表到实际的ISR代码的长跳转,从而减少了响应时间。
每一个事件都在事件状态寄存器ILAT、IMASK和IPEND中有对应的位。
表2-14根据优先级列出了各个事件。
1.仿真
仿真事件使处理器进入仿真模式。
在仿真模式中,内核从JTAG接口读指令。
对于内核而言,仿真事件是优先级最高的中断。
2.复位
复位中断可以由RESET脚或看门狗定时器引起。
EVT[1]中有处理器复位后要执行的首地址。
该单元与其它中断不同,它是只读的。
BlackfinDSP协调决定复位向量。
这个复位向量指向引导ROM的开始处,或者是片外异步存储器的开始处。
具体指向由BMODE[2:
0]来决定,如表2-15所示。
如果BMODE[2:
0]脚决定是从FLASH或者是串口ROM引导程序,复位向量就会指向片上引导ROM的起始处,这里驻留了一个引导内核。
该引导代码读系统复位配置寄存器(SYSCFG)的内容,以确定BMODE[2:
0]脚上的值,从而确定合适的引导序列。
0]脚指明忽略ROM引导,复位向量将指向外部的异步存储器区域的起始地址处。
在这种模式下,不使用内部的ROM引导。
为了支持从该存储器区域(ROM)读,外部总线接口单元(EBIU)使用默认的外部内存配置,该设置是由硬件复位产生的。
3.NMI(非屏蔽中断)
NMI入口是为非屏蔽中断保留的。
这种非屏蔽中断可以有看门狗定时器和发送给BlackfinDSP的NMI输入信号产生。
4.异常
异常事件和产生异常事件的指令是同步的,即在指令完成之前,系统就接受了异常事件。
下面情况会发生异常:
(1)对齐错误
(2)在取指令的过程中,忽略了ICPLB;
在装入内存过程中,忽略了DCPLB。
(3)违反了CPLB入口的保护广泛
(4)在各CPLB上发生多个命中
(5)在取指令的过程中发生总线错误
如表2-16所示,异常可以是一次服务,也可以是一个错误条件。
类型栏中的值指示该异常是一个服务还是一个错误条件。
(6)对于服务(S),返回地址就是紧接在异常之后的指令地址,因为异常服务不会被重新执行。
为了在从服务程序退出后是程序回复执行,需保存执行发生异常的指令之前的处理器状态。
(7)对于错误条件(E),返回地址就是发生异常的指令地址,因为某些类型的错误,如页错误,可能会需要出错的指令重新执行。
指令是否重新执行由异常控制器根据异常的指令和错误状态决定。
当指令需要被重新执行时,就会使用返回地址,当指令不需要重新执行时,异常处理需按指令的长度增加返回地址的值。
(8)EXCAUSE[5:
0]位于程序控制器的状态寄存器(SEQSTAT)中。
如果一条指令导致了多个异常,只有优先级最高的异常得到处理。
表2-17按优先级列出异常。
5.在处理异常中发生异常
当执行异常处理时,要避免一条指令产生另外一个异常。
在异常处理完成之前发生了一个新的异常会导致下面的结果:
(1)新产生的异常被忽略
(2)在SEQSTAT寄存器中的EXCAUSE域被一个不可恢复的事件代码更新
(3)出错指令的地址被保留在RETX中
处理异常时,要在异常处理结束时检查SEQSTAT寄存器,以决定是否发生一个异常。
如果一个异常发生了,那么RETX寄存器就保持产生这个异常的指令的地址。
在异常处理后,返回地址就会正常地返回到一个低优先级的中断代码中。
无论异常是在NMI、仿真还是复位事件中产生,都会引起同一组动作。
2.5.7硬件错误中断
硬件错误中断指示一个硬件错误或一个系统错误。
当内核外的逻辑,如存储器执行控制器不能完成数据的传送(读或写)并且激活了内核的错误输入信号时,就会有硬件错误的发生。
这种硬件错误激活错误中断(事件向量表中的中断IVHW,ILAT,IMASK和IPEND寄存器)。
硬件错误中断服务程序会读程序控制器的状态寄存器(SEQSTAT)中5位的HWERRCAUSE域,并产生相应的响应。
硬件错误中断是由下面几种原因产生的:
(1)总线奇偶错误
(2)内核中的内部错误条件,例如心能监视器溢出
(3)DMA访问总线比较中断(视图写一个被激活的DMA寄存器)
(4)外设错误
(5)总线超时错误
导致硬件错误中断的硬件条件和它们相应的HWERRCAUSE码都在表2-18中列出。
如果多个硬件错误同时发生,只有最近的一个会被识别和服务。
只要发生错误的条件保持激活状态,硬件错误中断将一直处于激活状态。
1.内核定时器
当内核定时器的值减到0,就会产生内核定时器中断(IVTMR)。
2.通用中断(IVG7~IVG15)
通用中断一般用于需要引起内核注意的事件。
例如:
一个DMA控制器可以使用通用中断,通知内核数据传送已经结束;
一个串行通信设备使用通用中断,通知内核通信过程中发生传送错误。
软件也可以通过执行命令RAISE激活一个通用中断。
RAISE指令强迫发生IVG15~IVG7,IVTMR,IVHW,NMI和RST等中断事件。
但是不能产生异常和仿真事件(分别为EVX和EMU)。
通常将IVG15和IVG14两个中断保留下来作为软件中断处理。
2.5.8中断服务
CEC将每一事件都安排为中断队列中的一个特定元素,这个元素对应于ILAT寄存器中的一位。
当中断的上升沿被检测到(这要花两个内核设置周期)时,相应的ILAT位就会被置位;
当IPEND寄存器中的对应位被置位时,该ILAT位就会被清除。
IPEND位指示事件向量已经进入内核流水线。
从这一点来看,CEC会对该中断输入的下一个中断的上升沿进行辨认和排队。
为了决定在何时服务中断,控制器将ILAT、IMASK和对齐处理器优先级等级中的3个量进行逻辑“与”操作。
对中断优先级高的服务执行下面的操作:
(1)EVT中的中断向量成为下一个读取地址
在中断时,流水线中的所有当前指令都被放弃。
在服务异常事件时,发生异常的指令之后的所有指令被放弃。
在一个错误异常事件内,发生异常的指令和该异常指令之后的所有指令都被放弃。
(2)返回地址要保存在相应的返回寄存器中
中断的返回寄存器是RETI,异常事件的返回寄存器是RETX,NMI的返回寄存器是RETN,调试仿真的返回寄存器是RETE。
返回地址指的是正常程序流中最后被执行指令后的指令地址。
(3)处理器模式会被设置成与相应事件对应的模式
如果事件是NMI、异常或者中断,处理器就处于监控模式。
如果事件是仿真异常,处理器就会处于仿真模式。
(4)在第一个指令开始执行前,在ILAT中的对应位就会被清除,而IPEND中的对应位就会被设置。
可以通过设置IPEND[4:
0]来禁止所有的中断,直到返回地址被保存到RETI中。
2.5.9中断的嵌套
2.5.9.1非嵌套中断
中断处理可以是嵌套的也可以是非嵌套的。
如果中断不需要嵌套,在执行中断服务程序的过程中,所有的中断都被禁止。
此时系统还会接受仿真、NMI和异常事件。
当系统不需要支持嵌套中断时,就不需要存储RETI中的返回地址。
只有在中断服务程序中用到的机器状态,才需要存放在监控堆栈中。
从非嵌套中断服务程序返回时,只需要执行RETI指令,因为返回地址已经保存在RETI中。
2.5.9.2嵌套中断
如果中断需要嵌套,原始ISR的指向中断点的返回地址必须保存,并且在执行完嵌套ISR后恢复。
支持嵌套的中断服务程序中的第一条指令必须保存当前存放在RETI中的返回地址。
这需要将该返回地址压入监控堆栈,指令为[--SP]=RETI。
这样,就清除了全局中断禁止位IPEND[4],从而打开了中断。
下一步,所有在中断服务程序中要改变的寄存器需压入监控堆栈。
处理器状态也要压入监控堆栈,而不是压入用户堆栈。
因此,将RETI压入堆栈的指令([--SP]=RETI)和将RETI弹出堆栈的指令(RETI=[SP++])使用的是监控堆栈。
1.嵌套中断的编程代码
嵌套ISR的开始编程代码实例
//嵌套ISR的开始代码
/*将RETI中的返回地址压入监控堆栈中,以保证中断是可以返回的。
至此,中断已被挂起*/
ISR:
[--SP]=RETI;
//使能中断并存储返回地址到堆栈中
[--SP]=ASTAT;
[--SP]=FP;
[--SP]=(R7:
0,P5:
0;
/*服务程序的主体。
注意,所有的DSP资源(累加器、DAG、循环的计数器和边界)还没有被保存。
这里假设中断服务程序不使用这些资源*/
嵌套ISR编程的结尾代码实例
//嵌套ISR的结尾代码
/*恢复ASTAT、数据和指针寄存器。
从监控堆栈中弹出RETI。
以保证在装载返回地址到RTI之间中断被挂起*/
(R7:
0=[SP++];
FP=[SP++];
ASTAT=[SP++];
RETI=[SP++];
/*执行RTI,从而跳到返回地址处,重新打开中断,并且如果这时最后一个被嵌套的中断,将切换到用户模式。
*/
RTI;
2.嵌套中断请求的记录
SIC检测来自外设的电平触发的中断请求。
而CEC对其通用中断(IVG7~IVG15)进行边沿触发检测。
因此,SIC产生一个同步的中断脉冲给CEC,然后等待CEC对该中断的认可。
当内核(通过激活IPEND的输出)接受中断时,SIC产生另外一个同步中断脉冲给CEC。
这样,系统的服务另外一个中断时就不会丢失外设的中断请求。
由于多个中断源可以映射到内核处理器的同一通用中断上,在对该中断输入上已检测到的中断进行处理之前或正在处理时,SIC可能同时发出多个脉冲。
对于共享的中断,上面描述的IPEND中断确认机制,重新使能所有的共享中断。
如果有一个共享的中断源仍在活动,SIC至少会再产生一个脉冲。
中断状态寄存器指示共享中断源的当前状态。
3.自嵌套模式
前面所描述的嵌套模式允许高优先级中断取代低优先级中断。
但是,它不能取代优先级相同的中断,在相同优先级上不能嵌套。
当自嵌套中断未使能时,通用中断只能抢占优先级较低的通用中断(优先级越高,索引值越小)。
例如,当系统正在处理一个中断7时,另外一个中断7的请求就会被挂起而不被服务(ILAT[7]=1)。
只有当前的中断7执行了RTI指令后,才能处理被挂起的另一个中断7。
当自嵌套中断被使能时,只要RETI被压入堆栈并且中断被使能一个事件就可以中断与其优先级相同的中断过程。
例如,当一个中断7正在被处理时(IPEND(7:
0=0x80),另一个中断7的请求就会使软件再次转向中断7的服务程序。
由于几个不同的外设中断源可能被映射为相同的内核优先级(这取决于SIC_IARx的设置),当在处理相同优先级的另一个中断时,可能有多个中断发生。
例如UART0和UART1都被映射到IVG10,而系统正在处理当前的UART0中断,UART1就会登记一个中断请求。
BlackfinDSP的自嵌套特性允许UART1中断抢占UART0中断的资源,将现在正在执行的UART0中断服务程序(ISR)的剩余部分延迟,直到UART1的ISR完成。
因此,这提供了一个保证相同优先级的中断不会被拒绝服务的机制。
在当前请求正在被服务时,可能会出现这种在同一IVG级上有几个请求发生的情况。
对于允许自嵌套中断的系统,软件必须将SYSCFG中的SNEN位置位。
在自嵌套模式中,系统会将返回寄存器RETI(RETI[0])中的地址的最低位置位,以指示进来的一个中断和当前正在被服务的中断有相同的优先级。
RETI[0]在进入服务程序时被自动设置,并且它只是作为一个状态位使用,用来通知处理器当前ISR正在被自嵌套。
中断返回指令RTI,对RETI[0]和SNEN的状态很敏感。
当RETI[0]和SNEN都被置位时,RTI指令只清除全局禁止位IPEND[4]。
但是,当自嵌套模式被禁止(即SNEN=0)时,RTI指令就会清除IPEND[4]和与当前中断同级别的IPEND位。
只有通用中断(IVG7~IVG15)才有自嵌套模式。
SNEN位应该在复位服务程序中设置,在正常的中断处理期间不能再次改变。
因为RETI寄存器的最低位被用来存储自嵌套的状态,在自嵌套被使能时,要避免改变RETI寄存器的内容。
2.5.9.3异常处理
在流水线中,对中断和异常指令的处理是不同的:
(1)当一个中断发生时,流水线中的所有指令被放弃。
(2)当一个异常发生时,在异常指令后的所有流水线指令被放弃。
对于服务异常,异常指令也被放弃。
由于异常、NMI和仿真事件都有一个自己的专用返回寄存器,对返回地址的保护是可选的。
相应的,用于异常、NMI和仿真的push和pop指令不会影响中断系统。
异常的返回指令(RTX、RTN、RTE)会清除IPEND中当前设置的最低位。
1.异常处理
异常处理过程一般都很长,因为它们必须在几个异常中进行辨别,并采取相应的动作。
真是这种较长的程序导致了较长的执行时间,在这期间,中断系统实际上被挂起。
为了避免中断长时间被挂起,可以用强制中断/复位指令RAISE来响应低优先级的中断。
2.异常处理的代码示例
下面是一段处理延迟的异常处理代码。
/*通过检查SEQSTAT(首先要将R0、P0、P1和ASTAT保存到监控堆栈中)中的EXCAUSE域,确定异常的原因*/
[--SP]=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中断 处理 机制