8

我正在编写一个用户空间程序和一个内核空间设备驱动程序。

目标:一旦发生中断,用户空间程序需要快速做一些事情。

我的幼稚方法:用户空间程序使用ioctl调用wait_event_interruptible(),内核ISR调用wake_up_interruptible()唤醒用户空间程序。事实证明,从中断到用户空间需要太多时间。

有没有更好的办法?

谢谢!

4

1 回答 1

3

这里有一个类似的问题:

从内核模块通知 gpio 中断到用户空间

请检查上述问题。但是,我可以提供我在那里建议的方法。

您可以从内核 API 向用户空间线程发送信号,这可以帮助您运行非阻塞:

send_sig(int sig, struct task_struct *p, int priv);

您需要了解内核中用户线程的 pid。您可以通过 /proc 写入用户进程的 pid 然后内核读取 pid 来解决这个问题。通过这种安排,当有中断时,内核可以向用户线程发送信号。如果您的进程重新启动或被杀死,您将不得不通过 proc 更新 pid。仅用于状态通知,您可以使用此方法;但是,如果您希望将数据与状态一起传输,则 Netlink 或 char 驱动机制是个好方法。

于 2013-11-09T15:27:41.783 回答