gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:52:39 25 4
gpt4 key购买 nike

我读到 ARM 中的软件生成中断被用作处理器间中断。我还可以看到其中 5 个中断已经在使用中。我也知道 ARM 提供了 16 个软件生成的中断。
在我的应用程序中,我在 ARM-cortex 内核和 Linux 上运行裸机应用程序。我想将一些数据从运行裸机应用程序的核心传送到运行 Linux 的核心。我计划将数据复制到片上内存(共享),我将在核心(运行 linux)上触发一个 SGI,以指示一些数据可供它处理。现在我可以从核心(运行裸机应用程序)生成 SGI。但是为了处理 linux 端的中断,我不确定 SGI IRQ 号是免费的,我也不确定我是否可以直接使用 IRQ 号(通常 SGI 是从 0-15)。有谁知道如何在 Linux 中为 SGI 编写处理程序?
编辑:这是对上述文本的重新措辞,因为该问题已针对 SSCE reasons 关闭。 . Cortex-A CPU 用于多 CPU 系统。 ARM 通用中断 Controller (GIC) 监视所有全局中断并将它们分派(dispatch)到特定 CPU。为了让各个 CPU 相互发送信号,软件生成的中断 (SGI) 从一个内核发送到另一个内核;这使用外围私有(private)中断(PPI)。这个问题是,

How to implement a Linux kernel driver that can receive an SGI as a PPI?

最佳答案

Does any one have an idea how to write a handler for SGI in Linux?



由于您没有提供 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";
};

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

然后你可以使用 platform_get_irq()在您的驱动程序中获取 PPI(外围私有(private)中断)。我猜该地址是您希望进行通信的共享内存(物理);也许 reg不合适,但我认为它会起作用。该区域将由 Linux MMU 重新映射,您可以使用它,
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
mem = devm_ioremap_resource(dev, res);

上面设备树中的地址是物理地址的十六进制值。 platform_get_irq()应该返回一个可用于 request_irq() 的 irq 号函数族。只需将此连接到您的日常工作。

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

关于linux-kernel - ARM cortex A9 中的处理器间中断(如何在 Linux 中为软件生成的中断 (ARM) 编写处理程序?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20430733/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com