赞
踩
本文介绍Zynq7000系列FPGA中的系统级中断环境和中断控制器的功能(见图7-1)。
每个CPU都有一组专用外围中断(PPI,private peripheral interrupts),使用banked 寄存器可以对这些中断进行专用访问。PPI包括全局计时器、专用看门狗计时器、专用计时器和来自PL的FIQ/IRQ。
软件生成的中断(SGI)被路由到一个或两个CPU。SGI是通过写入通用中断控制器(GIC)而产生的。共享外设中断(SPI)是由PS和PL中的各种I/O和内存控制器产生。它们被路由到其中一个或两个CPU。来自PS外部设备的SPI中断也被路由到PL。
通用中断控制器(GIC)是一个集中式资源,用于管理从PS和PL发送到CPU的中断。当CPU接口接受下一个中断时,控制器启用、禁用、屏蔽并优先考虑中断源,并以编程方式将其发送到选定的CPU。此外,控制器支持用于实现安全感知系统的安全性扩展。
控制器是基于Arm通用中断控制器体系结构的非矢量化的1.0版(GIC v1)。
通过CPU专用总线访问寄存器,以避免互连中的临时阻塞或其他瓶颈,从而实现快速读/写响应。
中断分配器将所有中断源集中在一起,然后将优先级最高的中断源分配给各个CPU。GIC确保针对多个CPU的中断一次只能由一个CPU执行。所有中断源都由一个唯一的中断ID号标识。所有中断源都有自己的可配置优先级和目标CPU列表。
中断控制器由复位子系统通过写入SLCR中的A9_CPU_RST_CTRL寄存器的PERI_RST位来复位。相同的重置信号还重置CPU专用定时器和专用看门狗定时器(AWDT)。重置后,将忽略所有挂起或正在服务的中断。
中断控制器使用CPU_3x2x时钟(CPU频率的一半)进行操作。
共享外设中断由各种子系统生成,包括PS中的I/O外设和PL中的逻辑。中断源如图7-2所示。
来自PL的IRQ/FIQ可以作为PPI#4和#1通过GIC进行路由,或者使用图7-3所示的直通复用器绕过GIC。这个逻辑是为两个CPU实例化的。直通模式是通过mpcore启用的。ICCICR寄存器如表7-1所示。
每个CPU都可以使用软件生成的中断(SGI)来中断自己、另一个CPU或两个CPU。有16个软件生成的中断(见表7-2)。通过将SGI中断号写入ICDSGIR寄存器并指定目标CPU,生成SGI。此写入通过CPU自己的专用总线进行。每个CPU都有自己的一组SGI寄存器,用于生成16个软件生成的中断中的一个或多个。通过读取ICCIAR(中断确认)寄存器或将1写入ICDICPR(中断清除挂起)寄存器的相应位来清除中断。
所有SGI都是边缘触发的。SGI的灵敏度类型是固定的,不能更改;ICDICFR0寄存器是只读的,因为它指定了所有16个SGI的灵敏度类型。
每个CPU连接到一个由五个外设中断组成的专用组。PPI如表7-3所示。
PPI的灵敏度类型是固定的,不能更改;因此,ICDICFR1寄存器是只读的,因为它指定了所有5个PPI的灵敏度类型。注意,来自PL的快速中断(FIQ)信号和中断(IRQ)信号被反相,然后被发送到中断控制器。因此,尽管ICDICFR1寄存器将它们反映为活动低(active)电平,但它们在PS-PL接口处为活动(active)高电平。
一组来自不同模块的大约60个中断可以路由到一个或两个CPU中,或是PL中。中断控制器为CPU管理这些中断的优先级和接收。
除了IRQ#61到#68和#84到#91之外,所有中断敏感度类型都由请求源固定,不能更改。必须对GIC进行编程以适应这种情况。引导ROM不对这些寄存器进行编程;因此SDK设备驱动程序必须对GIC进行编程以适应这些敏感度类型。
对于级别敏感类型的中断,请求源必须为中断处理程序提供一种机制,以便在确认中断后清除该中断。此要求适用于任何具有高灵敏度类型的IRQF2P[n](来自PL)。
对于上升沿灵敏度的中断,请求源必须提供足够宽的脉冲,以便GIC捕获。这通常至少是2个CPU_2x3x周期。此要求适用于任何具有上升沿灵敏度类型的IRQF2P[n](来自PL)。
ICDICFR2到ICDICFR5寄存器配置所有SPI的中断类型。每个中断都有一个2位字段,用于指定敏感度类型和处理模型。
SPI中断如表7-4所示。
有三种类型的中断进入GIC:SPI、PPI和SGI。在一般意义上,中断信号包括灵敏度设置、是一个还是两个CPU处理中断,以及目标CPU的个数(0,1或2)。然而,大多数中断信号的功能包括固定设置,而其他中断信号是部分可编程的。
有两组控制寄存器用于灵敏度、处理和定位:
•mpcore。ICDICFR[5:0]寄存器:灵敏度和处理。
•mpcore。ICDIPTR[23:0]寄存器:目标CPU。
SPI中断可以针对任意数量的CPU,但只有一个CPU处理中断。如果一个中断以两个CPU为目标,并且它们同时对GIC做出响应,则MPcore确保只有一个CPU读取活动中断ID#。另一个CPU根据时序接收Spurious ID#1023中断或下一个未决中断。这消除了对中断服务例程中的锁的要求。
以CPU为目标是由ICDIPTR[23:8]寄存器完成的。每个SPI中断的灵敏度必须编程为与ICDICFR Register 、PS和PL共享外设中断(SPI)中列出的灵敏度相匹配。使用ICDICFR[5:2]寄存器对灵敏度进行编程。
每个CPU都有自己的独立PPI中断,具有固定的功能;这些中断的灵敏度、处理和目标是不可编程的。每个中断只进入其自己的CPU,并由该CPU处理。ICDICFR[1]寄存器是只读的,CDIPTR[5:2]寄存器基本上是保留的。
SGI中断总是边缘敏感的,并且是在软件将中断号写入ICDSGIR寄存器时生成的。ICDIPTR[23:8]中定义的所有目标CPU必须处理中断才能清除它。
所有中断请求(PPI、SGI和SPI)都被分配了一个唯一的ID号。控制器使用ID号进行仲裁。中断分配器保存每个CPU的挂起中断列表,然后在将其发送到CPU接口之前选择最高优先级的中断。同等优先级的中断通过选择最低ID来解决。
优先级逻辑在物理上是重复的,以使每个CPU能够同时选择最高优先级的中断。中断分配器保存中断、处理器和激活信息的中央列表,并负责触发CPU的软件中断。
存储SGI和PPI分配器寄存器,为每个连接的处理器提供单独的副本。硬件确保针对多个CPU的中断一次只能由一个CPU执行。
中断分配器向CPU接口传输最高未决中断。它接收回中断已被确认的信息,然后可以更改相应中断的状态。只有确认中断的CPU才能结束该中断。
当IRQ线路去断言时,GIC对未决中断的响应。
如果中断在GIC中挂起,并且IRQ被取消断言,则GIC中的中断将变为非活动状态(CPU永远不会看到它)。如果中断在GIC中处于活动状态(因为CPU接口已确认中断),则软件ISR通过首先检查GIC寄存器,然后轮询I/O外设中断状态寄存器来确定原因。
Arm GIC体系结构规范包括以下编程主题:
当使用传统中断(IRQ、FIQ),并且中断处理程序以安全模式(通过ICCICR[AckCtl]=1)访问IRQ和FIQ时,读取中断ID时偶尔会出现争用情况。在IRQ处理程序中也存在看到FIQ ID的风险,因为GIC只知道处理程序从什么安全状态读取,而不知道处理程序是从哪种类型读取的。
有两种可行的解决方案:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。