作者:Adam Taylor
既然“Adafruit NeoPixel
”这个例子已经完成了(可以查看我以前发布的8篇博客)我们将要探索一下关于操作系统的知识,但是首先有一个小的插曲,在上周我收到了一个有兴趣的问题,
这个问题是关于第24篇博客的--“讨论Zynq
SoC的PS/PL(处理器系统/可编程逻辑)直接的通信接口“。这个特别的问题是关于从PL部分给PS部分的ARM Cortex-A9 MPCore
CPU触发一个中断事件。
下面我们给出了位于Zynq SoC PS部分的ARM通用中断控制器的系统级框图,引用了Zynq-7000全可编程SoC技术指导手册(UG585)
从上面这个框图我们可以看出CPU0与CPU1共享了16个从PL到PS之间的中断,每个CPU内核分别占有5个来自PL的私有中断。这些中断源会 为每个CPU内核驱动一个快速中断和一个周期性的中断。在下面这个例子里,我会展示怎么使用私有中断。然而中断的的一般概念都是相同的,没有考虑到具体的 使用情况。在这个例子里,我将使用PL上的一个扩展的复用I/O(EMIO GPIO),回过头来连接到处理器的中断引脚上。一个简单的软件程序就能够说明来自PL的中断是怎么工作的。
注意:PL/PS接口之间的中断信号是高电平有效,不是低电平有效。
第一步:使能PL/PS之间的中断和使能你期望使用的具体的中断。
第二步:使能EMIO GPIO ,位宽设置为1。
中断和GPIO引脚都会出现在Zynq PS的框图中,这些信号会被进行内部连接,这样我们能够通过软件控制来驱动这些中断,当然在这个例子里,这些中断是由位于Zynq PL部分的EMIO引起的。
已经进行到了这一步,下一步是重新生成所有的输出文件和实现设计,以便我们能够把换个设计导出到SDK中。相应地,我们就能够编写一些代码来测试这个应用。
我们的测设应用实现的是当我们按下MicroZed 开发板上的一个按钮开关时会触发一个中断。
在SDK环境下,我们需要进行下面这些步骤:
1. 声明如下头文件:Platform.h, xparameters.h, Xscugic.h, Xil_Exceptions.h 和 xgpio.h,这些头文件 将提供一些函数和宏,帮助我们完成这个例子 。
2. 定义通用中断控制器和GPIO设备的ID,定义FPGA的中断号,定义EMIO和按钮开关的引脚号。
3. 声明和定义一些必需的函数:
中断控制器设置函数
PGA中断处理函数,这个函数会打印出一条信息
GPIO中断处理程序,这个程序会在有按钮开关按下的情况下驱动EMIO GPIO来触发FPGA中断事件
附加的代码(查看下面的附件,在这篇博客的结尾)非常详细地展示了我是怎样实现这样一个简单的例子。然而,我认为我应该从更多的细节来解释我建立这个中断的方式和方法。
当我们要在Zynq中使用中断,我们需要从以下几个方面着手:
1. 初始化中断控制器。
2. 连接异常设备ID到相关的中断处理程序,以使中断事件发生时它能够被正确的响应。
3. 连接FPGA中断到通用的中断控制器,这需要我们预定义中断ID号,调用的处理程序(他被用来识别中断源),和中断发生时运行的中断服务程序。
4. 在中断控制器中使能要用到的中断。
5. 使能处理器上的所有中断。
不论我们使用一个中断或者更多的中断,上面的流程是必需的,上面的第3条和第4条要为每个中断重新定义。
当我在MicroZed运行这些代码并按下按钮时,我看到了下面这些响应信息:说明它起作用了。
附件代码:Adam Taylors MicroZed Chronicles code part 38
原文链接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...