在检查PS端IO口状态时,常用的就是轮询,但是实际工程中很少用这种方式,主要是运行复杂逻辑时,轮询方式效率太低,CPU需要等待IO口状态变化,这种肯定不符合大多数应用,所以多数情况下都是使用中断方式进行驱动的。
在许多具有许多输入的系统中,键盘、鼠标、按钮、传感器等。来自这些设备的输入通常与当前执行的进程或任务异步,并且轮询 I/O 方法对于具有许多输入的系统通常效率太低。因为无法始终预测事件何时发生,因此必须经常使用轮询 I/O 方法检查 I/O 状态。轮询例程通常会获得空结果,这是低效的。使用中断可以使处理器继续进行其他处理,直到事件发生,从而大大提高了执行效率。当发生 I/O 事件时,产生的中断会导致处理器分支并寻址 I/O 事件。
在最高级别,中断可以分为两种类型:可屏蔽和不可屏蔽。但事情不是那么简单的。随着处理器变得越来越先进,中断源的数量呈爆炸式增长。因此,双核 Xilinx Zynq All Programmable SoC 使用 ARM 通用中断控制器 (GIC) 来处理中断,中断可能来自:
- 软件生成的中断 – 每个处理器 16 个。软件产生的中断可以中断自己和一个或两个处理器。
- 共享外设中断 – 总共 60 个。这些中断可能来自 Zynq SoC 处理器系统 (PS) 中的 I/O 外设,也可能来自器件的可编程逻辑 (PL) 端。两个 ARM Cortex-A9 MPCore CPU 共享这些中断。
- Private Peripheral Interrupts – 5 个中断,每个 CPU 都是私有的(例如 CPU 定时器、CPU 看门狗定时器和专用的 PL 到 CPU 中断)。
下面是 Zynq SoC 的框图,其中 GIC 以红色圈出。请注意 GIC 如何紧邻两个 ARM Cortex-A9 MPCore 处理器:红色圈出的 Zynq SoC 通用中断控制器 (GIC)共享外设中断非常有趣,因为它们非常灵活。可以将它们从 I/O 外设(总共 44 个中断)或从 FPGA 逻辑(总共 16 个中断)路由到 ARM Cortex-A9 MPCore CPU。还可以将中断从 I/O 外设路由到器件的 PL 部分,从而允许 Zynq SoC 中的可编程逻辑在应用程序需要时卸载处理器。从 PS IOP 到 PL 的中断
在解释如何在 Zynq 上设置中断之前,我认为回顾一下 ARM Cortex-A9 MPCore 处理器如何处理中断是一个好主意。当中断发生时,会发生以下事件:
- 中断显示为待处理。
- 处理器停止执行当前线程。
- 处理器将当前线程的状态保存在堆栈上,以便在处理完中断后允许中断前的处理继续进行。
- 处理器执行中断服务程序 (ISR),它定义了如何处理中断。
- 处理器在从堆栈中恢复中断线程后恢复它的操作。
因为中断是异步事件,有可能同时发生多个中断。因此,中断被优先处理,以便处理器可以首先处理最高优先级的中断挂起。下一篇博客将介绍如何初始化和使用 Zynq SoC 的 GIC。
ZYNQ从放弃到入门(一)MIO
ZYNQ从放弃到入门(二)-PS端 GPIO