我读到,ARM中的软件产生的中断被用作处理器间中断。我还可以看到,其中5个中断已经在使用中。我也知道ARM提供了16个软件生成的中断。
在我的应用程序中,我运行的是一个裸金属应用程序,其核心是臂皮质核,另一个是Linux。我想从运行裸金属应用程序的核心到运行Linux的核心通信一些数据。我计划将数据复制到片上内存(这是共享的),我将触发Core上的SGI (运行linux),以指示某些数据可供其处理。现在,我能够从核心(运行裸金属应用程序)生成SGI。但是为了处理linux方面的中断,我不确定SGI号是否是免费的,我也不确定是否可以直接使用IRQ号(一般SGI是从0到15)。有人知道如何在Linux中为SGI编写处理程序吗?
编辑:,这是上述文本的重新措辞,因为SSCE原因的问题已经结束。Cortex-A CPU用于多CPU系统.ARM通用中断控制器(GIC)监视所有全局中断并将它们分派到特定的CPU。为了让单个CPU相互发送信号,将软件生成的中断(SGI)从一个内核发送到另一个内核;这使用外围私有中断(PPI)。这个问题是,
如何实现Linux内核驱动程序,该驱动程序可以接收SGI作为PPI?。
发布于 2013-12-06 21:05:34
有人知道如何在Linux中为SGI编写处理程序吗?
由于您没有提供Linux版本,所以我假设您使用的是最新版本(至少是最近版本)。手臂GIC有设备树绑定。通常,您需要在设备树节点中指定SGI中断号,
ipc: ipc@address {
compatible = "company,board-ipc"; /* Your driver */
reg = <address range>;
interrupts = <1 SGI 0x02>; /* SGI is your CPU interrupt. */
status = "enabled";
};中断节中的第一个数字表示PPI。SGI可能在0-15之间,因为这是SGI中断被路由的地方(至少在Cortex-A5上)。
然后,您可以在驱动程序中使用platform_get_irq()来获取PPI (外围专用中断)。我想该地址是您希望进行通信的共享内存(物理);也许reg是不合适的,但我认为它会工作。这个区域将被Linux重新映射,您可以使用它,
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(dev, res);上面的设备树中的地址是物理地址的十六进制值。platform_get_irq()应该返回一个irq号,您可以在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以使这种修改不需要。
发布于 2013-12-10 18:57:33
我想补充的是,在TI多核SoC(即OMAP3530)中可以找到这样的核间通信的一个例子。不久前,当我使用这样的机制,手段是由TI提供的。具体来说,正是DSPLink Linux设备驱动程序提供了这样的功能。当时,不幸的是,这不是一个开放源码的解决方案,但也许有一些技术论文从TI描述它是如何工作.只是一个你可以进一步研究的方向:)
编辑:在此期间,他们似乎已经将其开源。所以,如果这就是你要找的,你可以看看:DSPLink和SysLink (DSPLink的继承者)
https://stackoverflow.com/questions/20430733
复制相似问题