DSP TMS320C6455 中断解析

首先定义3个术语:

  • 系统事件(System Event):CPU内部或外部产生的信号,用来通知CPU有些事情已经发生了和/或 需要响应。
  • 中断(Interrupts):由于内部或外部硬件信号(EVENT)的出现,用来提供重定向正常程序流的方法。
  • 异常(Exceptions):也会重定向程序流,但它们通常只对应系统内的一个错误状态。

C64x+CPU提供了2种类型的异步信号服务:中断和异常。中断提供了重定向正常程序流的方法,异常也会重定向程序流,但它们通常与系统的错误状态相关联。
C64x+CPU可以接受12个可屏蔽/可配置的中断,1个可屏蔽的异常和1个不可屏蔽的中断/异常。CPU也可以响应各种内部异常情况(TMS320C64x / C64x + DSP CPU和指令集参考指南(SPRU732)中记录了这些异常)。megamodule包含一个中断控制器,该控制器最多可将124个系统事件路由到CPU中断/异常输入。 这124个事件可以直接连接到可屏蔽中断,也可以组合成中断或异常。 这些不同的路由选择为事件处理提供了极大的灵活性。当向CPU发出中断信号并且已经有该中断的挂起位时,将产生一个错误事件。 除路由事件外,中断控制器还会检测CPU何时错过中断。 您可以使用此错误事件在CPU错过实时事件时通知CPU。 INTC硬件将错过的中断号保存在寄存器中,以便可以采取纠正措施。

1 结构框图和特性

在这里插入图片描述
上图为C64x+Megamodule模块的功能框图。共有128个系统事件(system event)作为中断控制器的输入,既包括内部生成的事件(在megamodule内部)也包括芯片级事件(chip-level)。除了这128个事件,INTC寄存器还接收非屏蔽(NMEVENT)和复位事件(RESET),并且直接路由到CPU。中断控制器输出给CPU的信号为以下四种:

中断控制器输出信号类型说明
EXCEP1个可屏蔽的硬件异常
INT4~INT1512个可屏蔽的硬件中断
NMI1个不可屏蔽的信号(non-maskable),用户可以用作中断或异常
RESET一个复位信号

注:更多的中断和异常信号可以参考文档: TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide (SPRU732)
中断控制器通过下列模块来解决事件到终端和异常的路由问题。

模块名说明
Interrupt Selector将任意系统事件路由到12个可屏蔽中断
Event Combiner将大量的系统事件组合为4个,减少事件数量
Exception Combiner将系统事件归结为1个硬件异常输入

2 中断控制器架构

C64x+中断控制器用来提供灵活的系统事件管理。这是通过寄存器来实现的,如下表。

RegisterDescriptionType
EVTFLAG [3:0]Event Flag RegistersStatus
EVTCLR [3:0]Event Clear RegistersCommand
EVTSET [3:0]Event Set RegistersCommand
EVTMASK [3:0]Event Mask RegistersControl
MEVTFLAG [3:0]Masked Event Flag RegistersStatus
EXPMASK [3:0]Exception Mask RegistersControl
MEXPFLAG [3:0]Masked Exception Flag RegistersStatus
INTMUX [3:1]Interrupt Mux RegistersControl
AEGMUX [1:0]Advanced Event Generator Mux RegistersControl
INTXSTATInterrupt Exception Status RegisterStatus
INTXCLRInterrupt Exception Clear RegisterCommand
INTDMASKDropped Interrupt Mask RegisterControl

2.1 Event Registers

中断控制器通过以下3个寄存器组来管理系统事件状态。

  • Event flag registers (EVTFLAGx)
  • Clear flag registers (EVTCLRx)
  • Set flag registers (EVTSETx)
    Event flag registers捕捉中断控制器收到的所有系统事件。有4个32位的寄存器来负责这124个系统事件,每个系统事件映射到Event flag registers中的一个标志位(flag bit EFXX)。剩下的4个位EVTFLAG0 (EF03:EF00) 与系统事件无关,这4个位为保留位,且总为0。相反,事件00~03对应的系统事件是中断控制器内部通过Event Combiner生成的,并路由到Interrupt Selector(见图7-1)。
    在这里插入图片描述

Event flags(EFxx)是锁存寄存器位,收到事件后就会变为1。EVTFLAGx寄存器是只读的,且必须通过 Event Clear registers EVTCLR[3:0]清0。
Event Clear registers是只写的,通过往对应的为写1就能清0。
在这里插入图片描述
Event Set registers是只写的,通过往对应的为写1就能置1。使用Event Set registers可以手动设置Event flag registers中的任何位。这在测试中断服务程序时,使用Event Set registers生成中断会有所帮助。
在这里插入图片描述
中断控制器使用Event Clear registers和Event Set registers组,而不是直接写入Event flag registers,这样可以防止潜在的竞争情况(potential race conditions)。 如果没有这些额外的寄存器,CPU在对这些标志位进行读-修改-写的操作过程过程中,可能会意外清零事件标志设置。
如果在同一周期期间接收到新事件,该事件位会被EVTCLRx寄存器清0,该事件输入会优先作为丢失事件。

2.2 Event Combiner

在这里插入图片描述
事件组合器(event combiner)允许多个系统事件组合成一个单个事件。组合事件路由到中断选择器(interrupt selector)。这种设计使得CPU即使只有12个能用的中断也能服务所有的系统事件。
事件组合器的基本概念是对system event flags的子集执行“或(OR)”运算。 OR操作的结果变成了新的“组合”事件。
事件组合器将124个系统事件分为四个组。 第一组包括事件4到31,第二组包括事件32到63,第三组包括事件64到95,第四组包括事件96到127。您可以组合每个组中的事件作为新的“组合” ”事件。 这些新事件称为EVT0,EVT1,EVT2和EVT3。 这些事件与原始的124个系统事件一起路由到中断选择器,总共有128个事件。
每个组都有1个事件屏蔽寄存器(event mask register),其通用结构如下。
在这里插入图片描述
事件屏蔽寄存器(event mask register)中的事件屏蔽位用于使能/屏蔽应组合的系统事件。 默认情况下,该寄存器为零,因此所有系统事件都是未屏蔽的,组合形成对应的EVTx。 要屏蔽事件源,必须将相应的屏蔽位设置为1。请注意,事件0到3的事件屏蔽位是保留的,并且始终被屏蔽。
例如:

Assume an application requires the events 124-127 to be conbined.
In order to accomplish this, EVTMASK3 will need to be programmed as follows:
EVTMASK3 = 00001111111111111111111111111111

事件组合器还提供了事件标志寄存器( event flag registers)的屏蔽视图,如下。
在这里插入图片描述
屏蔽后事件标志寄存器( masked event flag)的事件,其实就是事件标志寄存器( event flag registers)的内容经过屏蔽后的事件。 通过读取屏蔽后事件标志寄存器( masked event flag),CPU仅看到组合事件的事件标志(EVT [3:0]),这在处理组合事件的中断程序中很有用。
例子:

Assuming the following configuration:
EVTFLAG3 = 01101010010011001110001110010101
EVTMASK3 = 00001111111111111111111111111111
The Masked Event Flag register 3 will be:
MEVTFLAG3 = 01100000000000000000000000000000

当处理一个组合事件时,你必须:
1.读取与组合事件EVTx对应的MEVTFLAGx寄存器;
2.检查第一个挂起(即flagged)事件;
3.将此MEVTFLAGx值写入EVTCLRx寄存器;
4.处理步骤2中指示的事件(如,进入对应的中断服务程序);
5.重复步骤1至 4直到MEVTFLAGx寄存器= 0;
此过程仅评估和清除在EVTx上组合的那些事件。 此外,即使在EVTFLAGx寄存器中置位了,在EVTMASKx寄存器中屏蔽的任何事件都不会清0(也无需清0)(这使您可以使用它们生成异常)。
注意:CPU应该迭代步骤1到4,直到在中断服务程序内返回之前没有找到挂起位为止。 这样可以确保在中断服务程序执行中接收到的所有事件都被捕获到(还要记住,如果在EVTCLRy [x]寄存器中清除了事件EVTx的标志的同时接收到了事件EVTx,则不会将其清除)。

2.3 Interrupt Selector

2.3.1 中断选择器操作

在这里插入图片描述
CPU有12个可屏蔽中断(CPUINT4~CPUINT15),中断选择器运行128个系统事件的任意一个路由到12个的CPU中断输入。这128个事件要么是事件要么是组合事件。
除了中断选择器之外,事件组合器还允许使用灵活的中断路由方案。 INTC模块的这种灵活性允许在mega模块中处理大量系统中断。 它还允许在CPU内同时处理大量中断,从而提高了中断效率。
在这里插入图片描述
中断选择器包含中断多路复用寄存器INTMUX [3:1](如下图),可通过事件号对12个可用CPU中断中的中断源进行编程。 CPU中断的顺序(CPUINT4至CPUINT15)确定中断的优先级。 由于任何中断服务程序都可以是原子的(不可嵌套),因此CPU中断优先级仅适用于挂起的中断。
在这里插入图片描述

2.3.2 Interrupt Error Event(中断错误事件)

在这里插入图片描述

每当CPU检测到中断已被丢弃时,C64x + CPU连同中断控制器都可以生成系统事件(EVT96)。 当接收到CPU中断且相关的CPU的中断标志位置1时,将生成此事件。 此错误事件可能表明程序员可能在代码中遇到问题,例如是否长时间禁用了中断或不可中断代码段是否太长。
由于中断丢弃检测逻辑在CPU内部,因此只能检测到来自单个系统事件的中断。 基于组合事件的中断丢弃仅表明该组中的一个或多个中断引起了错误。
当CPU检测到丢失错误情况时,它将信息传递回中断控制器的中断异常状态寄存器(INTXSTAT),该寄存器记录丢失的中断号并声明系统事件。 该寄存器描述如图7-38。
在这里插入图片描述
由回到系统事件EVT96,由于INTXERR只能保存一个droped CPU ID,因此INTERR(EVT96)仅报告检测到的第一个丢弃的中断。 中断异常状态通过异常清除寄存器(INTXCLR)清除(见图7-39),该寄存器仅由一个清除位组成。 将1写入INTXCLR寄存器的CLEAR字段会将INTXSTAT寄存器(见图7-38)复位为0。只有在硬件清除状态后,才能检测到新的IDROPx事件。
为丢弃中断错误事件提供服务时,服务程序应:
1.读取INTXSTAT寄存器。
2.检查错误情况。
3.通过INTXCLR寄存器清除错误。
为防止一个或多个CPU中断产生丢失的中断错误,可通过对丢弃中断屏蔽寄存器(INTDMASK)进行编程来忽略它们。
在这里插入图片描述

2.4 Exception Combiner(异常组合器)

在这里插入图片描述

C64x + CPU可以单事件输入,用于系统级可屏蔽的异常。 此输入由EXCEP表示。 异常组合器允许将多个系统事件组合到图7-12中的单个异常事件中。 即使只有一个CPU异常输入可用,这也允许CPU处理所有可用的系统事件
异常组合器允许系统设计人员选择 system event flags的子集执行“或(OR)”运算以确定EXCEP值。
在这里插入图片描述
注意:复位和NMI也显示在此图中。 实际上,当在C64x + CPU中使能了异常时,NMI信号将用作不可屏蔽的异常输入。 这两个信号与其他各种CPU异常一起在CPU内组合在一起。
为了仅允许系统事件的一个子集生成CPU异常,异常组合器提供了一组四个屏蔽寄存器EXPMASK [3:0],用于禁用不需要的事件。 由于只有一个异常输入到CPU,因此所有屏蔽寄存器可以协同工作将多达128个事件组合为一个EXCEP输出。 这使CPU可以处理所有可用的系统异常。
EXPMASKx寄存器的默认值为全1。 这意味着所有事件都被屏蔽; 因此,除非对该寄存器进行编程,否则任何系统事件都不会产生异常。
与事件组合器类似,异常组合器提供一组屏蔽后异常标志寄存器(MEXPFLAGx)。通过读取屏蔽后异常标志寄存器,CPU可以看到与CPU的EXCEP输入有关的事件标志。
在这里插入图片描述
CPU应该运行异常服务程序以确定异常原因,并在收到异常后响应事件。 在提供异常服务时,服务程序必须首先确定该异常是通过不可屏蔽异常还是由EXCEP信号在CPU内部生成的。
如果EXCEP是导致异常的原因,则程序应读取屏蔽的异常标志寄存器(MEXPFLAG [3:0]),以确定哪些未屏蔽的事件触发了异常。
服务组合异常时,必须:
1.读取MEXPFLAG [3:0]寄存器。
2.检查挂起事件。
3.将MEXPFLAG [3:0]的值写入EVTCLR [3:0]寄存器。

  • CPU从第1步到第3步进行迭代,直到从异常服务例程返回之前没有找到挂起事件为止。 这样可以确保捕获异常服务例程中接收到的所有事件。
    将MEXPFLAGx值与EVTCLRx寄存器一起使用,只会清除那些合并生成EXCEP的事件。 即使在EVTFLAGx寄存器中进行了设置,也无需清除EXPMASKx中被掩蔽的任何事件。 这使它们可用于生成组合的中断事件。
    注意:如果要求CPU响应任何新的异常,则步骤4至关重要。 有两个事实表明为什么会这样:
  • 当任何未屏蔽的事件标志输入均处于活动状态时,异常组合器的输出即处于活动状态。
  • CPU认为异常请求是从0到1的变化。
    因此,必须清除所有未屏蔽的事件标志,然后CPU才能识别EXCEP上新的从0到1的变化。

3 C64x+ Megamodule Events

C64x + megamodule的各个组件都会生成许多事件。 这些事件被路由到中断控制器,以便在断言时可以由CPU处理。显示为可用事件(4至8、10和15至95)的事件为芯片级事件。 每个C64x +设备都可以根据需要使用这些事件输入。 有关如何使用这些可用事件的更多信息,请参见特定设备的数据手册。
在这里插入图片描述

4 Interrupt Controller - CPU Interaction

4.1 CPU-中断控制器接口

在这里插入图片描述
由异常组合器和中断选择器产生的中断控制器的输出提供给C64x + CPU。十二个中断信号反映在CPU的中断标志寄存器(IFR)中,如图7-14所示。
必须使能中断才能让CPU识别它们。CPU需要中断允许寄存器(IER)和中断任务寄存器(ITSR.GIE)中的全局中断允许字段进行使能。
另请注意,异常信号(EXCEP)记录在图7-15中的CPU异常标志寄存器(EFR)中。 您必须先使能异常,然后才能识别所示的异常标志寄存器(EFR)。 重置设备后将禁用异常识别,以简化系统设计并实现向后兼容性。 您可以通过在ITSR寄存器(ITSR)中设置全局异常使能字段(GEE)来打开异常。 在使能任何中断之前,应先使能异常,以确保在更改其模式(异常与中断)时不会收到NMI。
当CPU中未使能系统异常时,不可屏蔽中断(NMI)充当中断,并且在接收到该中断时会将标志发布到IFR寄存器的BIT1字段中。 在CPU中使能系统异常时; 该标志不会设置。 而是在异常标志寄存器(EFR)中标识异常源,以表示该源是NMI,EXCEP,内部异常还是软件异常(SWE / SWENR)。
所有NMI处理都共享NMI中断向量,无论您是将其用作中断还是异常。 在SWENR生成异常而不是SWE指令的情况下,CPU仅将其REP寄存器用作向量,而不是NMI向量。 更多信息参见文档:TMS320C64x/C64x+ DSP CPU and Instruction Set Reference Guide (SPRU732) .

4.2 CPU中断事件服务

对于CPU服务的单事件中断(直接在中断选择器中指定系统事件)的情况,无需读取或清除中断控制器中的事件标志(EVTFLAGx)寄存器。
但是,在服务组合的系统事件时,必须在中断服务程序或异常服务程序中使用事件标志。 这些标志用于确定引发中断或异常的事件。 换句话说,CPU的中断标志寄存器(或异常标志寄存器)告诉CPU发生了组合的事件,然后服务例程必须使用事件标志寄存器来确定确切的原因。
同样重要的是要注意,在服务程序中,必须由软件清除相应的事件标志寄存器位,以便接收后续事件。 如果事件标志未清除,则不会识别新的系统事件。 新的系统事件甚至无法被识别为丢弃的中断。 这是因为CPU的丢弃中断逻辑适用于CPU中断输入(而不是中断控制器事件输入)。 由于事件是在中断控制器中组合的,因此CPU在这里没有可见性。
在许多系统中,可能很想读取服务程序,然后清除整个事件标志寄存器(EVTFLAGx)。 虽然这在某些系统上可以正常工作,但您必须注意,某些事件标志不会被任何系统代码轮询。 如果必须轮询特定事件(系统中的某些代码偶尔读取该事件,而不是让该事件中断CPU),则不加选择地清除所有事件标志位可能会导致意外结果。
欢迎关注我的公众号:槑槑的技术栈。前面两个字念meimei,二声,哈哈。
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值