2.5中断2.5.1概述处理器的事件控制器处理所有的同步和异步事件,并管理5种类型的事件:(1)仿真(2)复位(3)非屏蔽中断(NMI)(4)异常(5)中断(11种)其中,中断是一种改变处理器正常指令流的异步事件。异常是一种软件发起的事件,它与程序流同步。事件系统有优先级而且可嵌套,优先级高的任务可以占用优先级低的任务的资源。事件列表如表2-11所示。BlackfinDSP采用2级事件控制机制。系统中断控制器(SIC)和内核事件控制器(CEC)一起控制所有的系统中断并且管理它们的优先级。SIC提供了多个外设中断源与内核通用中断输入之间的映射。这种映射是可编程的,某个中断可以在SIC中屏蔽掉。CEC支持9个通用中断(IVG7~IVG15),其中包括专用中断和异常事件(见表2-11)。通常选用优先级最低的两个中断IVG14和IVG15作为软件中断。其它7个中断留给BlackfinDSP系统使用。表2-11中所示的系统中断到内核事件映像是复位时的默认值,这些值可以重新设置。2.5.2系统中断过程中断是由能产生中断的外设产生的,图2-24解释了系统中断过程。当一个中断产生时:(1)SIC_IWR检查BlackfinDSP内核是否从一个空闲状态中被唤醒。(2)SIC_ISR记录中断请求,并且跟踪被激活但未被服务的系统中断(即一个中断服务程序还未清除该中断)。(3)SIC_IMASK可以在系统级上屏蔽、使能外设的中断。如果有一个中断A未被屏蔽,那么中断请求过程进入第四步。(4)SIC_IARx寄存器组用来将外设中断映射到通用的内核中断组(IVG7~IVG15),并且决定中断A的优先级。(5)ILAT将中断A记录在内核中,但是此时该中断还没有真正被响应。(6)IMASK屏蔽、使能不同优先级的内核中断,如果中断A对应的IVG事件没有被屏蔽掉,中断过程就进入第七步。(7)访问事件向量表(EVT),查找中断A的中断服务程序(ISR)的中断矢量。(8)当中断A的事件矢量进入内核的流水线时,相应的IPEND位被置位,该位清除对应的ILAT位。因此,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]脚上的值,从而确定合适的引导序列。如果BMODE[2:0]脚指明忽略ROM引导,复位向量将指向外部的异步存储器区域的起始地址处。在这种模式下,不使用内部的ROM引导。为了支持从该存储器区域(ROM)读,外部总线接口单元(EBIU)使用默认的外部内存配置,该设置是由硬件复位产生的。3.NMI(非屏蔽中断)NMI入口是为非屏蔽中断保留的。这种非屏蔽中断可以有看门狗定时器和发送给BlackfinDSP的NMI输入信号产生。4.异常异常事件和产生异常事件的指令是同步的,即在指令完成之前,系统就接受了异常事件。下面情况会发生异常:(1)对齐错误(2)在取指令的过程中,忽略了ICPLB;在装入内存过程中,忽略了DCPLB。(3)违反了CPLB入