作者:Adam Taylor
上篇博客中我们看到了在ZynqSoC的两块ARM Cortex-A9 MPCore处理器之间共享数据。我提到方法可以改进——使得更加高效——我们可以使用软件中断来进行两核间通信。
中断自己,中断另一个处理器核或者中断两者。例如,我们使用Core 0产生一个中断,通知Core1接收到了一个LED模式的更新
使用软件中断跟硬件中断没有太大区别,只有我们怎样触发中断不同。
我们有16个软件产生的中断可以选择,因此我们必须定义软件中断编号:
#define SW_INT_ID 0
我们需要为每个处理器核在代码的共享头文件中声明这个选项。如果一个处理器核处理16个软件产生的中断之一而另一个处理器核正在等待另一个发生,这种情况是很尴尬的。
我们需要为Core1做的下一件事——该核收到了中断——就是将软件产生的中断连接到GIC(通用中断控制器)然后使能中断。我们用已有的函数SetupInterruptSystem完成这项工作。
连接中断通过使用函数XScuGIC_Connect完成。这个函数将定义的中断连接到GIC,定义了中断服务程序,也定义了回调函数。在这个例子中,我们没有外设实例的指针作为回调函数,就像我们可以使用定时器,我们可以使用GIC实例作为回调。
最后,将选中的软件中断连接至GIC,现在我们需要使能中断,这样相应的处理器核才能对中断引发的事件做出反应。
中断连接和使能之后,下一步就是写ISR(中断服务程序)。该程序将简单地读取OCM(片上内存)和清除中断防止下个中断被标记。
读取地址0xF8F0010C访问了中断认知寄存器ICCIAR,清除中断。
在我们的例子中,从OCM中读取的数据将在LED上显示,这些LED接在由ZynqSoC的PL(可编程逻辑)驱动的GPIO引脚上。软件机制防止我们遗漏一个值,就像是上篇博客中使用的轮询方法发生的情况一样。
完成了所有该为Core1做的,我们必须正确地配置Core 0来处理中断。我们调用xscugic.h中的XScuGic_SoftwareIntr函数来完成。调用这个函数来为该核处理软件中断
XScuGic_SoftwareIntr(
GIC实例Ptr参数就是我之前使用配置的中断控制器。SW中断ID就是我们之前宏中的声明。CPU掩码就是CPU 2,对应ZynqSoC的Core 1
当所有这些都完成,跟之前AMP Zynq博客一样生成bin文件,我得到一个与我想要的一样工作的系统,中断被Core 1接收,由Core 0处理。
As always the code is attached代码总是附带的,
在今后的博客中,我们将会看到更详细的软件中断和我们如何同时中断两个处理器核内容。不过,记住下周是本博客的一周年纪念日,我会为大家准备了一些特殊的东西呦。
原文链接:
http://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chro...
© Copyright 2014 Xilinx Inc.
如需转载,请注明出处