核心路由器线卡中断系统设计与实现

分享到:
点击量: 214568

 

摘要: 文章介绍了核心路由器中,线卡中断系统的组成和工作过程。包括MPC8240 内部可编程中断控制器的用,复杂可编程逻辑设备EPLD 的设计和操作系统VxWorks 的BSP 对中断过程的支持。

关键词: 核心路由器 中断 MPC240 EPLD BSP

文章编号: 1002-8331-(2002)06-0134-03  文献标识码A  中图分类号TP302

1 前言

   在新一代核心路由器的设计思想中,IP 包的处理,路由转发主要在各个线卡上完成,为此线卡上集中了大量FPGA 模块,分别负责IP 包的接收、缓存、路由查找、发送等工作。中断系统是线卡CPU 与各FPGA 模块交互的主要桥梁,FPGA 作为总线传输的被动方,只能通过中断信号通知CPU事件的发生,从而执行相应中断服务程序处理,因此中断系统是线卡正常工作的重要环节。

   在本线卡的中断系统中,CPU 采用Motorola 公司内嵌POWER PC 603e的MPC8240 芯片,操作系统使用Wind River 公司提供的实时操作系统VxWorks,整个中断响应处理过程在硬件和操作系统的共同协作下完成。

2 线卡中断响应过程

   如图1,当外部中断设备满足中断发生条件后,即驱动相应中断信号线,向CPU发出中断请求,现都采用电平有效方式,有效电平可为高或低。采用电平触发方式,在中断没有得到响应时,中断信号线一直保持有效状态,可以免去用专门的寄存器记录中断发生情况,为上**处理提供方便。

   所有外设的中断信号都与Altera 公司的复杂可编程逻辑器件EPLD--EPM7256AE--相连,此芯片把MPC8240 的五根外部中断信号线IRQ 扩展为十五根EPLD 中断信号线INTQ,每根IRQ 对应三根INTQ ,此三根EPLD中断信号线在中断级别上与对应的MPC8240 中断信号线一致,即对应同一MPC8240 中断信号线的三根EPLD 中断信号线中断优先级相同,对应不同MPC8240 中断信号线的EPLD 中断信号线中断优先级也不同。EPLD 从对应同一IRQ 的INTQ 中选取*先发生的中断传递给MPC8240 的中断控制器。

   MPC8240 采用普通外部中断工作模式,即五根外部中断线IRQ 都设置为与外部中断源直接相连,对应每一IRQ 有寄存器设置其优先级,低/高电平有效,是否屏蔽等。MPC8240 内部的EPIC 根据这些寄存器的设置,选择优先级*高的中断,通过使能int 信号线通知内部处理器PPC603e, EPIC 优先级从0 到15,15 的优先级*高,一个中断要得到服务,必须比当前正在服务的任务的优先级要高,该任务可以是CPU 正在服务的中断或一般任务,所以设置一中断优先级为0, 实际上就禁止了该中断得到响应。

   内部int 线的中断相当于PPC603e 向量号为0x500 的异常(Exception)。在异常处理程序中,PPC603e 读EPIC 中断响应寄存器(IACK)开始响应中断请求,EPIC 通过内部数据总线返回与该中断关联的8 位中断向量号,PPC603e 获得向量号后,在中断向量表中查得中断例程的入口地址,由于EPLD 对中断进行了又**扩展,在程序中还必须依靠中断向量号读取EPLD 中对应寄存器获得*后的Intq 号,然后执行相应处理过程。在中断例程的*后,写MPC8240 EPIC 的EOI 寄存器,结束中断服务过程,同时写外设中断源的中断标志位,通知外设中断得到了响应,外设应使中断信号线无效,结束一次中断过程。在中断例程中,通知外设中断得到响应的时刻可以提前,以提高效率,使下一次中断请求可以及时发出,但这一时刻必须保证不会发生重入性错误并且允许新中断请求的产生不会影响上一次中断请求的正确处理。以上PPC603e 的处理过程很大程度上要依靠操作系统的配合,在VxWorks 操作系统中,BSP 实现了中断向量与中断例程的连接,Intq 号的获取以及*后通知MPC8240 中断服务结束的工作。

3  EOLD 的设计实现

   EPLD 是Altera 公司对自己CPLD(Complex PLD)产品的称呼,在作者的系统中,使用了其MAX 系列7256AE 型号,在其上实现了中断扩展以及地址译码,外围FPGA 下载结束后二次Reset 等功能。本节中,主要介绍中断扩展功能的设计。EPLD是基于EEPROM 工艺的乘积项结构,密度小,具有确定的时延,适合实现复杂的组合逻辑,所以用在本系统不需要太多时序逻辑的场合是非常合适的。

   如图2,从外部中断源来的中断信号首先由D 触发器锁存,D 触发器时钟采用MPC8240 内存接口100M 的时钟,保证能在足够短的时间采到中断的到来,D 触发器的输出一方面经三输入与门后产生上级中断信号,另一方面作为数据信号,指示各外部中断线当前状态。D 触发器的控制端都设置为使能状态。由于EPLD 内部没有RAM 结构,所以借用D 触发器实现RAM 的存储功能,在存储容量很小(本设计中仅需要15 比特大小的存储空间)的情况下,是可以接受的。EPLD 接在CPU 的内存总线上,CPU 把EPLD 看作存储空间的一部分来访问,然而只靠D 触发器无法实现总线设备重要的三态功能,所以在其外围,还需其他逻辑的配合。

   D 触发器输出的二值数据信号,首先经三态门转换为包含高阻态的三值数据信号;每三个D 触发器构成一8 位寄存器,由复用器实现对寄存器的选择;由于D 触发器只提供了寄存器的三位数据,所以另由填补逻辑产生其他五位三值数据信号;CPU 的地址信号和其他内存接口信号经Decoder 模块译码产生片选信号,控制三态门的使能,片选信号还同时控制复用器的选择;CPU 读写接口负责根据CPU 读写时序正确提供数据。

4 MPC8240 中断控制器

   MPC8240 的嵌入式可编程中断控制器(Embedded Programmable Interrupt Controller, EPIC)提供了一个灵活并具有通用性的中断控制方案。EPIC 集中控制从MPC8240 内部以及外部硬件等许多中断源产生的中断,按优先级向处理器内核报告。这个方案采用OpenPIC 结构(由AMD 和Cyrix 联合提出)并按其规范实现逻辑上的结构。MPC8240 的中断控制器支持直到五个的外部中断,四个内部逻辑使能中断,四个计时器中断,以及串行中断线方式(可支持16 个中断)和直通方式。

   EPIC 接收的所有中断通过内部IPR( Interrupt Pending Register)确认和同步,IPR 中一位对应一个中断源。对应的向量/优先级寄存器中的屏蔽位用来确认IPR 的输出。因而,当一个中断条件发生时相应屏蔽位被设置了,那只有当屏蔽位被**后该中断才能发出请求。中断源包括内部的I2C,DMA 或120,四个计时器和外部中断。当中断被设置为边沿触发方式时,由中断响应周期**IPR 中对应位,从而**响应中断。当中断设置为电平触发方式时,只有当源信号变无效时,IPR 才会**。

   中断选择寄存器IS(interrupt Selector)接收从IPR 来的所有中断,输出优先级*高的中断。IS 的输出包括选择出的中断的优先级和它来自哪个中断源。整个处理过程在两个周期内完成。在一个中断结束周期(End Of Interrupt, EOI)过程中,服务中寄存器ISR(In-Service Register)中的值指示ISR 中哪一位将被**。在EOI 周期后的下一周期, IS 输出IS 中优先级*高的中断源和将从ISR 中**的中断的优先级。

   中断请求寄存器IRR( Interrupt Request Register+)在中断响应周期以外的其余时间内一直传递IS 的输出。这个特性保证了从中断响应寄存器中读出的向量值不会发生变化,直到有更**别的中断到达。IRR 也充当经IS 有两个时钟周期传递延迟时间的管道寄存器。

   服务中寄存器ISR(In-Service Register)中保存当前处理器响应中断的优先级和中断源。ISR 在中断响应周期中接收内部位设置命令,在EOI 周期中接收内部位**命令。

5 VxWorks BSP 中中断响应过程的实现

   VxWorks 是美国Wind River 公司推出的一个实时操作系统,具有高性能,可裁减等特点,以其良好的可靠性和**的实时性被广泛地应用在通信、**、航空、航天等高精尖技术及实时性要求极高的领域中。板级支持包BSP( Board Support Package)针对低层不同硬件向操作系统提供一个统一的软件接口,它包括硬件初始化、中断的产生和处理、内存地址映射、内存分配等等功能。

BSP 对中断响应过程的配合主要由以下两个函数完成:

STATUS sysEpicInit( void );

void sysEpicIntHandler( void );

另外BSP 还至少应向操作系统提供以下三个函数:

LOCAL STATUS sysEpicIntConnect (VOIDFUNCPTR * vector, VOIDFUNCPTR routine, int parameter);

LOCAL int sysEpicIntEnable(int intLevel);

LOCAL int sysEpicIntDisable(int intLevel);

   这三个函数分别用来在中断向量表中连接中断处理程序,使能某级中断和禁止某级中断,值得注意的是,在MPC8240 中,某个中断级别的禁止并不会影响其他级别的中断请求得到响应,实际上MPC8240 的中断级别(Int Level )只是对应五根外部中断信号管脚,并不是中断优先级(Int Priority )的概念。中断向量表的结构如下:

    typedef struct intHandlerDesc/* interrupt handler desciption*/

    {

     VOIDFUNCPTR vec;/* interrupt vector */

     int arg;/* interrupt handler argument */

     struct intHandlerDesc * next;/* next interrupt handler & argument */

     }INT_HANDLER_DESC;

中断向量号直接表示该项在中断向量表中的位置,该结构也表示中断处理程序可以链接。

   EPIC 初始化函数sysEpicInit 工作过程见图5左侧,在该函数中,很重要的一步是将总的中断分发处理函数sysEpicIntHandler 与PowerPC 向量号为0x500 的外部中断异常相连。一个中断短语(Interrupt Stub )将被创建并放置在异常表该向量处,当异步异常发生时,处理器跳至该中断短语代码,保存需要的寄存器并调用C 程序段,在保存需要的寄存器前,中断短语将当前任务堆栈切换至中断堆栈,对于嵌套的中断,因为已在中断状态,所以此项操作就不需要了。

   在中断分发处理函数中,工作流程见图5右侧,主要的工作是通过读MPC8240 EPIC 的IACK 寄存器和EPLD 得到*后的中断向量,然后查中断向量表得到中断处理函数指针,中断处理函数执行完后,写EPIC 的EOI 寄存器结束中断处理。

6 总结

   文章介绍了利用可编程逻辑单元EPLD 和MPC8240 内部中断控制器EPIC 构成中断系统,挂接多个外部中断源的设计。该设计已经在核心路由器线卡上实现并正常工作。相对于MPC8240 EPIC 的另两种工作方式:串行方式轮询各中断源,效率较低且进一步扩展困难;直通方式必须外围另加中断控制器如8259 代替内部EPIC,实现复杂,浪费了EPIC 本身的功能。该设计采用EPLD 扩展外部中断设备,利用EPLD 在系统中可多次写入逻辑的功能,实现灵活简单,调试方便,以后如果有进一步的修改或扩展也都易于实现。