中断控制器的目的
中断控制器提供了一种方法来选择必要事件并将它们对应到相应的 CPU 中断或异常输入。
特征
中断控制器将系统事件与 CPU 中断和异常输入相连接。中断控制器支持 128 个系统事件。它们包括内部生成事件和芯片级事件。除了这 128 个事件外,中断控制器寄存器也接收非屏蔽和复位事件并将它们直接对应到 CPU 。
中断控制器输出信号到 C64x+ CPU 的事件输入有:
? 1 个可屏蔽的硬件异常 (EXCEP)
? 12 个可屏蔽的硬件中断 (INT4 到 INT15)
? 1 个不可屏蔽的可用作中断或异常的信号 (NMI)
? 1 个复位信号 (RESET)
中断控制器包括下面的模块以便将事件对应到中断和异常:
? 中断选择器——将任何系统事件对应到 12 个可屏蔽的中断
? 事件组合器——减少大量的系统事件到 4 个
? 异常组合器——让任何系统事件组合到一起作为硬件异常输入
图 1 C64+ 中断控制器框图
表 1 中断控制器寄存器
事件寄存器
中断控制器包括一组寄存器来管理控制器接收的系统事件的状态。这些寄存器分组如下:
? 事件标记寄存器 (EVTFLAGx)
? 清除标记寄存器 (EVTCLRx)
? 设置标记寄存器 (EVTSETx)
这些事件标记寄存器获取所有中断控制器接收到的系统事件。共 4 个 32 位的寄存器覆盖 124 个系统事件输入。每一个系统事件映射到一个事件标记寄存器中专门的标记位 (EFxx) 。
EVTFLAGx 寄存器是只读的,必须通过只写的事件清除寄存器 EVTCLR[3:0] 来清除。
事件组合器
事件组合器允许多个系统事件组合成一个事件。组合事件对应到终端选择器。这允许 CPU 来响应所有有效的系统事件,虽然 CPU 只有 12 个可用的中断。
图 2 事件组合器
事件组合器将 124 个系统事件分为 4 组。第 1 组包括从事件 4 到 31 ,第 2 组包括事件 32 到 63 ,第 3 组包括事件 64 到 95 ,第 4 组包括事件 96 到 127 。可以组合每组中的事件成为一个新的事件。这些新的事件为 EVT0 、 EVT1 、 EVT2 、和 EVT3 。这些事件对应到中断选择器,加上原始的 124 个系统事件共 128 个事件。
当响应一个组合中断时:
1. 读组合事件 EVTx 对应的 MEVTFLAGx 寄存器
2. 检查首先等待的事件
3. 写 MEVTFLAGx 寄存器的值到 EVTCLRx 寄存器
4. 响应第 2 步中的事件
5. 重复步骤 1 至 4 知道 MEVTFLAGx 寄存器为 0
以上处理只是用来评估和清除在 EVTx 上组合的事件,任何在 EVTMASKx 寄存器中倍屏蔽的事件不需要清除,即使它们在 EVTFLAGx 寄存器中被设置 ( 这将允许使用它们来产生异常 ) 。
CPU 在中断服务程序返回前应循环步骤 1 到 4 直到没有等待事件。这样确保在中断服务程序执行过程中所有接收到的事件都会被捕获 ( 同时需要记住的是事件 EVTx 在 EVTCLRy [x] 标记被清除的同时被接收到,则它没将不被清除 ) 。
中断选择器
CPU 有 12 个可屏蔽的中断可用。中断选择器允许 128 个系统事件对应到 12 个 CPU 中断输入中的任何一个。
图 3 中断选择器框图
图 4 CPU 中断对应表
中断选择器包含中断复用寄存器, INTMUX[3:1] 允许对 12 个可用的 CPU 中断的源进行编程。每一个呈现在中断选择器面前的事件都有一个事件号,并用于编程这些中断复用寄存器。
中断错误事件
C64x+ CPU 通过中断控制器可以生成一个系统事件 (EVT96) ,当 CPU 检测到某一中断被丢弃。当 CPU 中断被接收到的同时相关的 CPU 中断标记位已被设置时这个事件被生成。此错误事件可指示程序员在代码中可能出现的问题,比如是否被禁用中断的时间延长为一期或是否与非中断代码段太长。
因为中断丢弃检测逻辑是在 CPU 中的,仅单个的系统事件作为源的中断才能被检测。组合事件构成的中断的丢弃只能指示有一个或多个在组中的中断产生了错误。
当 CPU 检测到丢弃错误条件,它将传递消息给中断控制器的用于记录丢弃中断号并触发系统事件的中断异常状态寄存器 (INTXSTAT) 。
图 5 中断异常事件框图
一个 INTXERR 只能拥有一个丢弃的 CPU ID ,仅第一个丢弃的中断检测通过 INTERR (EVT96) 被报告。中断异常状态通过异常清除寄存器 (INTXCLR) 被清除。一个新的 IDROPx 事件可以被检测仅当状态通过硬件清除后。
当响应丢弃中断错误事件时:
1. 读取 INTXSTAT 寄存器 .
2. 检查错误条件 .
3. 通过 INTXCLR 寄存器清除错误
为了防止一个或多个来自生成丢弃中断错误的 CPU 中断,可以通过对丢弃中断屏蔽寄存器 (INTDMASK) 编程来忽略它们。
异常组合器
C64x+ CPU 有一个单独的作为系统级的、可屏蔽的和针对异常的事件输入。这个输入由 EXCEP 表示。异常组合器允许复用系统事件来组合成为一个异常事件。这将使 CPU 能够响应所有可能的系统事件,即使当 CPU 仅有一个异常输入可用。
图 6 系统异常对应图
为了允许系统事件中的一部分能够产生异常给 CPU ,异常组合器提供了一组 4 个屏蔽寄存器 EXPMASK[3:0] ,可以被用来禁止那些不期望的事件。因为对于 CPU 只有一个异常输入,所有的屏蔽寄存器协同工作将多达 128 个事件组合成一个作为 EXCEP 输入。这将允许 CPU 响应所有可能的系统异常。
CPU 应该运行一个异常服务程序来检查异常产生的原因并响应相应的事件当相应异常时,服务程序首先应检查异常是否是产生于内部通过非屏蔽的异常或是 EXCEP 信号。
如果 EXCEP 被确定为产生异常的原因,则服务程序应读取屏蔽异常标记寄存器 (MEXPFLAG [3:0]) 来确定哪一个未屏蔽的事件触发了异常。
当响应一个组合中断时:
1. 读取 MEXPFLAG [3:0] 寄存器
2. 检查等待的事件
3. 将 MEXPFLAG [3:0] 值写到 EVTCLR [3:0] 寄存器
在 EVTCLRx 寄存器中使用 MEXPFLAGx 值仅仅清除组合产生 EXCEP 的事件。任何在 EXPMASKx 中被屏蔽的事件不需要清除,即使在 EVTFLAGx 寄存器中设置,这允许使用它们来生成一个组合中断事件。
4. CPU 应重复步骤 1 至 3 直到在返回异常服务程序之前没有等待事件被发现。这样确保了在异常服务程序中任何接收的事件都能被捕获到。
表 2 系统事件映射
图 7 CPU事件对应图
必须使能中断以使 CPU 能够识别。 CPU 要求另外单独的使能通过中断使能寄存器 (IER) 和通过全局在中断任务寄存器中的中断使能域 (ITSR.GIE) 。
同时也需要注意的是异常信号 (EXCEP) 被记录在 CPU 的异常标志寄存器中 (EFR) 。在异常标志寄存器 (EFR) 可以被识别前必须使能异常。在器件复位后异常识别被禁止。可以通过设置在 ITSR 寄存器 (ITSR) 中的全局异常使能域 (GEE) 来开启异常。应该在使能任何中断前使能异常以确保当 NMI 的模式 ( 异常或中断 ) 改变时不会收到 NMI 。
当 CPU 中的系统异常没有被使能,非屏蔽中断 (NMI) 作为一个中断,当其被接收到时将发标记给在 IFR 寄存器中的 BIT1 域。当 CPU 中的系统异常使能,然而,这个标记将不被设置。相反,异常源在异常标记寄存器 (EFR) 中被鉴定以来表示是否源是一个 NMI 、 EXCEP 、一个内部异常或是一个软件异常 (SWE/SWENR) 。
一个 NMI 处理共享 NMI 中断向量,无论它作为一个中断或是异常。当 SWENR 生成一个异常而不是 SWE 指令时 CPU 仅使用 REP 寄存器作为一个向量相对于 NMI 向量。
当 CPU 响应单个事件的中断情况下,不需要读取或清除中断控制器中的事件标记寄存器 (EVTFLAGx) 。
然而,当响应组合系统事件时在一个中断服务程序或一个异常服务程序中必须使用事件标记。这些标记用来确定事件启动了中断或异常。换句话说, CPU 的中断标记寄存器 ( 或异常标记寄存器 ) 告诉 CPU 一个组合事件发生,然后服务程序必须使用事件标记寄存器来确定确切的事件来源。
同样需要注意的是在服务程序中,相应的事件标记寄存器位必须通过软件被清除以能够接收到后来的中断。如果事件标记没有被清除,那么一个新的系统事件将不被识别。新的系统事件甚至不能被识别为已了丢弃的中断。这是因为 CPU 丢弃中断逻辑安排 CPU 中断的输入而不是中断控制器的输入。因为事件在中断控制器中被组合,对于 CPU 是不可见的。
在许多系统中,采用服务程序读取,然后清除整个事件标记寄存器 (EVTFLAGx) 。当这个能够在一些系统中工作正常时,必须注意其中的一些事件标记不能被任何系统代码查询。如果一个典型的事件需要被查询,然后任意地清除所有的事件标记位可能会导致意想不到的结果。
详情请参考《TMS320C64x+ DSP Megamodule Reference Guide》
请勿转载!kevincole 2011-06-09 14:52:56
用户1292047 2011-6-10 09:34
用户1584993 2011-6-9 17:23