ARM Cortex A9中的处理器间中断(如何在Linux中为软件生成的中断(ARM)编写处理程序?)

时间:2013-12-06 18:10:58

标签: linux-kernel arm interrupt-handling

我读到ARM中软件生成的中断被用作处理器间中断。我还可以看到其中5个中断已经在使用中。我也知道ARM提供了16个软件生成的中断。

在我的应用程序中,我在ARM-cortex内核和Linux上运行裸机应用程序。我想将运行裸机应用程序的核心数据传递给运行Linux的核心。我计划将数据复制到片上存储器(共享),然后我将在Core上运行一个SGI(运行linux),以指示一些数据可供它处理。现在我能够从核心(运行裸机应用程序)生成SGI。但是为了处理linux端的中断,我不确定SGI IRQ号是免费的,我也不确定我是否可以直接使用IRQ号(一般SGI是0-15)。有没有人知道如何在Linux中为SGI编写处理程序?

修改:这是上述文字的重新措辞,因为SSCE reasons的问题已经结束。 Cortex-A CPU用于多CPU系统。 ARM 通用中断控制器(GIC)监视所有全局中断并将它们分派给特定的CPU。为了使各个CPU相互发信号,将软件生成的中断(SGI)从一个内核发送到另一个内核;这使用外围专用中断(PPI)。这个问题是,

  

如何实现可以将SGI作为PPI接收的Linux内核驱动程序?

2 个答案:

答案 0 :(得分:6)

  

有没有人知道如何在Linux中为SGI编写处理程序?

由于您没有提供Linux版本,我将假设您使用最新版本(或至少是最近版本)。 ARM GIC有device tree bindings。通常,您需要在设备树节点中指定SGI中断号,

 ipc: ipc@address {
        compatible = "company,board-ipc"; /* Your driver */
        reg = <address range>;
        interrupts = <1 SGI 0x02>;  /* SGI is your CPU interrupt. */
        status = "enabled";
 };

interrupt 节中的第一个数字表示 PPI SGI 可能介于0-15之间,因为这是SGI中断的路由(至少在Cortex-A5上)。

然后您可以使用驱动程序中的platform_get_irq()来获取 PPI (外设专用中断)。我想地址是您希望进行通信的共享内存(物理);也许reg不合适,但我认为它会起作用。该区域将由Linux MMU重新映射,您可以将其与

一起使用
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(dev, res);

上面设备树中的地址是物理地址的十六进制值。 platform_get_irq()应返回 irq number ,您可以将其与request_irq()系列函数一起使用。只需将其连接到您的日常工作中即可。

编辑:不幸的是,Linux irq-gic.c禁止低于16的中断。例如,gic_handle_irq()将处理程序限制为16到1020之间的中断。如果启用了SMP,则会为感兴趣的中断调用handle_IPI()gic_raise_softirq()可用于发出中断信号。要使用当前Linux处理 SGI smp.c需要额外的enum ipi_msg_type值和代码才能在handle_IPI()中处理这些值。看起来更新的内核(可能是3.14+?)可能会将set_ipi_handler()添加到 smp.c ,以便不需要这样的修改。

答案 1 :(得分:2)

我想补充一点,这种核间通信的例子可以在TI多核SoC(即OMAP3530)中找到。前一段时间,当我使用这种机制时,TI提供了手段。具体来说,正是DSPLink Linux设备驱动程序提供了这样的功能。当时,不幸的是,它不是一个开源解决方案,但也许有一些来自TI的技术论文描述它是如何工作的......只是你可以进一步调查的方向:)

编辑:与此同时,似乎他们已经把它变成了开源。那么,如果您正在寻找,那么您可以查看:DSPLinkSysLink (successor of DSPLink)