中断处理模式:外部中断处理和内部中断处理的差异性

Facebook
Twitter
LinkedIn

江继尧,资深工程师,晶心科技股份有限公司

  在现今 SOC 设计中,当周边装置(Peripheral IP)想要和中央处理器(CPU) 沟通时,最常使用的机制是透过中断(Interrupt)。周边装置可触发中断给中央处理器,当中央处理器接收到中断后,则可判断是由那个周边装置触发些中断, 接着处理相对应的中断处理程序(ISR,Interrupt Service Routine),藉此达到彼此沟通的目的。
  而 AndesCore™在中断处理方面,共支持两种模式:内部中断处理器(IVIC Mode,Internal Vector Interrupt Controller)和外部中断处理器(EVIC Mode, External Vector Interrupt Controller)。其中最大的差异性,即是中断控制器所存在的位置。在内部中断处理模式下,AndesCore™本身即设置了一个中断控制器存在于 CPU 内部,经由此中断控制器来处理相关中断的工作。而在外部中断处理模式下,用户必须在 CPU 外部实做一个中断控制器来处理相关中断工作。
  除了上述的差异性之外,在硬件方面的整合和软件方面的应用,也存在些许差异性。本文之目的除了介绍这些差异性外,也提供一个简单的设计平台供使用者参考。期望能对使用者有所帮助,也希望读者不吝指教提供您宝贵的意见。

1. 中断处理模式介绍
  AndesCore™共支持两种中断处理模式:内部中断处理器(IVIC Mode, Internal Vector Interrupt Controller)和外部中断处理器(EVIC Mode,External Vector Interrupt Controller)。以下的介绍将架构于 AndesCore™ N968A-S 这颗中央处理器。带领使用者循序渐进地,了解这两种中断处理模式的差异。

1.1 Definition
  AndesCore™ N968A-S支持两种中断处理模式,首先,我们先介绍关于这两种模式的定义。

1.1.1 IVIC Mode
  AndesCore™ N968A-S内部设计了一个中断控制器,所支持的中断来源数目可透过配置来决定。目前最大可支持16个中断来源,但可扩充至32个。请参考图表 1。若使用这存在于CPU内部的中断控制器来处理相关中断工作时,则为IVIC模式。假若SOC的中断来源大于32个时,使用者还是可以使用IVIC模式, 但是需要将多个中断来源合为一个中断讯号线(ex: OR function),且中断处理程序(ISR)在该中断讯号线触发时,需要去判断是由那个中断来源所触发。在N968A-S的IVIC mode之下,每个中断来源可以选定值为0~3的优先权 (priority). 优先权高的中断来源可以打断优先权低的中断来源。

1.1.2 EVIC Mode
  假若IVIC模式不符合用户所设计的系统,用户就需要选用EVIC模式。在此模式下,用户需要额外设计一个中断控制器,用来处理周边装置和中央处理器之间相关中断的工作,作为两者间沟通的桥梁。

图表 1. AndesCore™ N968A-S 所支持中断来源数目

1.1.3 Interruption Vector Entry Points
  为了加速中断处理的时间,AndesCore™ N968A-S内部实做了一个Interruption Vector Table。将不同的中断事件分别对应到不同的Vector Entry, 当中断发生时,CPU即可判断中断是由那个周边装置所触发,并跳到该中断所对应的Vector Entry,进而执行相关的中断处理程序(ISR)。
  在前面章节有介绍AndesCore™ N968A-S支持两种不同的中断处理模式。因此,在不同的中断处理模式下,也对应了不同的Interruption Vector Table。

1.1.3.1 Interruption Vector Table of IVIC Mode
  在IVIC模式下,所支持的中断来源可由用户来配置,支持的数目由2个到32 个。Interruption Vector Table相关信息如下:
 • 41 entry points (9 exceptions + 32 interrupts)
 • Address = IVB.IVBASE + (entry number) * IVB.ESZ (VEP: Vector Entry Point)

图表2. Interruption Vector Table of IVIC Mode

1.1.3.2 Interruption Vector Table of EVIC Mode
  在EVIC模式下,所支持的中断来源数目可达到64个中断。Interruption Vector Table相关信息如下:
 • 73 entry points (9 exceptions + 64 interrupts)
 • Address = IVB.IVBASE + (entry number) * IVB.ESZ

图表3. Interruption Vector Table of EVIC Mode

1.2 Signal Descriptions
  AndesCore™ N968A-S 提供相关中断讯号线,使得 CPU 可与周边装置或是外部中断控制器沟通。在 EVIC 模式下,除了中断来源讯号线之外,还包含了和外部中断控制器相互沟通的讯号线,详细讯号线叙述如下:

图表4. 中断相关讯号

  其中,evic_ireqval 和 evic_ireqack 这两个讯号线用来和外部中断控制器沟通。在 IVIC 模式下,周边装置的中断讯号可和 int_req[N:0]直接整合。当周边装置触发中断时,相对应的 int_req 讯号会拉起,告知 CPU 该周边装置触发了中断,CPU 即会跳到所对应的 Vector Entry 来执行相关的中断处理程序。
  而在 EVIC 模式下,外部中断控制器会负责处理周边装置的中断讯号。当周边装置触发中断时,外部中断处理器会负责和周边装置沟通,并将相对应的中断讯号(int_req)和中断需求讯号(evic_ireqval)发给 CPU,当 CPU 接收到中断时, 会将中断接收讯号(evic_ireqack)拉起,告知外部中断处理器收到中断,并去处理相关中断处理程序。
  相关处理程序可参考图表 5。在 ARC a 时,当 ireqack 讯号为 low 时,CPU 可等待周边装置触发中断。当周边装置触发中断,外部中断控制器将相对应中断讯号 int_req 和 ireqval 拉起,告知 CPU 有中断发生。在 ARC b 时,当 CPU 收到中断,则将 ireqack 讯号拉起,告知外部中断控制器已收到中断。在 ARC c 时,外部中断控制器将 ireqval 讯号拉下,并等待 CPU 将 ireqack 讯号拉下(在ARC d 时),表示 CPU 可接收新的中断触发。

图表5. EVIC Interrupt Request Level Transfer Sequence

1.3 System Register Setting
  关于上述两种中断模式的选择,用户可透过设定 AndesCore™ N968A-S 内部的一个 system register 来达到目的。
  该 system register 为 Interruption Vector Base Register(ir3)。其中的第 13个 bit 决定不同的中断模式。其格式如下:

2. Reference Design Architecture
在介绍完中断处理模式相关定义之后,本章节提供在实际整合与应用上的范例,让用户可更了解在不同中断处理模式下的差异。

2.1 主要架构
  本次所实作的 Reference Design 主要是架构在 Andes mini-platform 上,搭配 AndesCore™ N968A-S 为主要 CPU 来控制相关周边装置。其主要架构如下图:

图表 8. Architecture of Reference Design

将 AndesCore™ N968A-S 整合在 AHB-Lite Bus 上,藉由 APB Bridge 和 APB Bus 沟通,而相关的周边装置则整合在 APB Bus 上。在本次范例中,主要会用到GPIO 和INTC(中断控制器)这两个周边装置,在不同的中断模式下,利用GPIO 来触发中断,再透过 INTC 与 CPU 沟通,观察不同中断模式下中断的处理方式。

2.1.1 Design Scenario in IVIC
  在 IVIC 模式下,由 GPIO 触发中断(gpio_int signal),直接将中断传递给CPU(int_req signal)。当 CPU 接收到中断时,即可去处理相关的中断处理程序。相关装置之间的整合如下图所示:

图表 9. Design Scenario in IVIC

2.1.2 Design Scenario in EVIC
  在 EVIC 模式下,由 GPIO 触发中断(gpio_int signal),INTC 收到中断后, 会将中断讯号和相关沟通讯号传递给CPU(int_req signal & evic_ireqval signal)。当 CPU 接收到中断时,会将响应讯号拉起(evic_ireqack signal),告知 INTC 收到该中断,并去处理相关的中断处理程序。相关装置之间的整合如下图所示:

图表 10. Design Scenario in EVIC

2.2 Example Code
  以下将 Reference Design 中,就本次中断处理模式相关的整合程序部分和测试程序部分,摘要出来说明。

2.2.1 整合程序部分
  在系统整合部分,包含 AndesCore™ N968A-S 和 INTC 在不同的模式下, 整合相关的讯号线,其中透过 EVIC_MODE 参数来进行不同模式间的切换。

AndesCore™ N968A-S 相关 RTL 片断:
evic_ireqval 讯号在 EVIC 模式下由 INTC 触发给 CPU,在 IVIC 下可直接给予 0 值。int_req 由 INTC 或中断来源传递给 CPU,告知 CPU 中断产生。evic_ireqack 在 EVIC 模式下由 CPU 触发给 INTC,告知 INTC 收到中断。

INTC 相关 RTL 片断:
  此中断控制器可透过 evic_mode 这个输入讯号,来决定该装置是处于 IVIC 模式或是 EVIC 模式,因此,在 EVIC 模式下,给予 1 值,设定为 EVIC 模式, 在 IVIC 下,给予 0 值,设定为 IVIC 模式。ireqack 讯号在 EVIC 模式下由 CPU 触发给 INTC,告知 INTC 已收到中断,在 IVIC 模式下则给予 0 值。

2.2.2 测试程序部分
  在测试验证部分,包含 AndesCore™ N968A-S 在不同中断模式下的设置、INTC 相关中断状态的设置和 GPIO 触发中断的设置。

AndesCore™ N968A-S 相关程序片断:
  AndesCore™ N968A-S 支持两种中断处理模式,透过 CPU 内部的 system register 来设置。主要为设置 Interruption Vector Base Register,该 register 的第 13 个 bit 用来定义 CPU 处在何种中断处理模式。在 EVIC 模式下,需将该 bit 设置为 1,在 IVIC 模式下,则将该 bit 设置为 0。

INTC 相关程序片断:
  INTC 通常支持不同的中断触发方式,包含 Interrupt Masking、Interrupt Trigger Mode、Interrupt Trigger Level …等。在开始使用每个中断来源之前,这些控制选项都必须在 INTC 上设定正确。

 

3. 模拟结果
  将上述的 Reference Design 整合完成后,搭配测试程序进行仿真,并藉由波形图来观察不同中断模式下,相关中断讯号线的变化。

3.1 IVIC 模拟结果
在 IVIC 仿真环境中,主要测试程序如下:
 • 由 GPIO 触发一中断,并将中断传递给 給 CPU 
 • CPU 接收到中断后,执行相对应的中断处理程序
仿真结果如图表 11 所示,当 GPIO 触发中断后,将中断直接传递给 CPU,在CPU 端的 int_req 讯号线会触发,表示有中断发生。当 CPU 收到中断讯号后, 接着会处理相对应的中断处理程序。

图表 11.Simulation Waveform of IVIC

3.2 EVIC 模拟结果
在 EVIC 仿真环境中,主要测试程序如下:
 • 由 GPIO 触发一中断
 • 此时 INTC 设罝为 EVIC 模式,并将中断讯号和相关沟通讯号传递给CPU
 • CPU 接收到中断后,会将响应讯号拉起,告知 INTC 收到该中断,并执行相对应的中断处理程序

  仿真结果如图表 12 所示,当 GPIO 触发中断后,INTC 将中断和相关沟通讯号(ireqval)传递给 CPU,在 CPU 端的 int_req 讯号线和 evic_ireqval 讯号线会触发,表示有中断发生。当 CPU 收到中断讯号后,会将 evic_ireqack 讯号线拉起,告知 INTC 收到中断。仿真结果如同章节 1.2 和图表 5 所论述。

图表 12. Simulation Waveform of EVIC

结语
在 AndesCore™ N968A-S 所提供的两种中断模式里,其中的 IVIC 模式使用CPU 内的中断控制器来处理中断,此模式对用户来说,只要将中断来源和CPU 端的中断讯号连接即可,相当容易整合。若用户所设计的系统里,中断来源数目超过 IVIC 模式所支持,或者系统需要更复杂的优先权选择时,则可选用 EVIC 模式。在 EVIC 模式下,用户需额外设计外部中断控制器,并整合相关沟通讯号。因此,用户可根据本身系统的复杂度和整合的难易度,来选择适合的中断处理模式。