【问题标题】:How to transmit data from an interrupt handler to an user application?如何将数据从中断处理程序传输到用户应用程序?
【发布时间】:2013-08-14 09:35:58
【问题描述】:

产生中断的设备由内核中的处理程序管理。我需要发送带有标志的消息,以便用户应用程序接收到发生中断的通知,从而可以执行程序。例如,唤醒一个进程。 我该怎么做?

【问题讨论】:

  • 您是否有特定的设备?
  • 我有一个用于 IPCore 处理器的 linux 设备驱动程序,用 5 行 IRQ 中断
  • 什么物理设备连接到 5 条线路中的一条或多条线路?
  • 只有5行,IRQ:91、90、89、88、87。设备是IPCore(在FPGA中,开发硬件ZedBoard的)

标签: c linux kernel driver interrupt


【解决方案1】:

恕我直言,POSIX 风格的解决方案是编写一个在内核中接收中断的设备驱动程序。用户空间程序将打开一个设备文件并从中获取 icoctl() 或 read(),直到至少一个事件到达为止。我建议,用户空间程序实际上应该多读一点:

  • 到目前为止,有多少活动到达?)
  • 呼叫是否被阻塞(例如,从设备读取时没有排队的事件)

这将帮助您查看您的程序何时错误事件(例如,因为它在上一个周期中被延迟)。

【讨论】:

  • 以什么方式唤醒进程进行阅读?用信号量?也就是一个读取过程,并且在 device_read 代码中睡着了。然后中断处理程序会唤醒他。这就是你告诉我的吗?如果用户进程正常运行,我的愿望是因为内核会向应用程序发送信号。如果从用户应用程序中获取读数,我想到的是中断处理程序更改驱动程序 gobal 中变量的值,并在读取中读取值。但是这个解决方案似乎不是很好。
【解决方案2】:

我更喜欢使用 Netlink 作为内核和用户空间之间的 IPC。只需确保使用 GFP_ATOMIC(在 netlink_broadcast 中)分配消息,以确保您不会在 irq 中休眠。查看here 获取 Netlink 教程。

【讨论】:

  • 我也想过用 IPC 作为替代方案,谢谢,我现在就读。
  • 我发现它有点棘手。更容易实现的可能是 IPC 机制,例如信号量。可以这样实现内核与用户进程的通信吗?还是这个IPC通信只针对用户级进程??????
  • 信号量可以用作用户空间进程之间的 IPC 或同步原语(用户空间或内核)。您不能单独使用信号量在用户空间和内核域之间传递消息。
猜你喜欢
  • 2012-05-06
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多