2012-10-15 58 views
3

我正在编写用户空间程序和内核空间设备驱动程序。内核如何通知用户空间程序发生中断

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

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

有没有更好的方法?

谢谢!

+0

您是否使用过“nice”来增加程序的优先级? –

+0

我正在使用uClinux。没有“好”的命令。但是,我确实尝试使用sched_get_priority_max(); sched_setscheduler();在我的用户空间程序中,但它并没有真正的帮助。 :( – user1747565

+0

'busybox'有'nice','renice'和'chpst'。如果任何一个applet被启用,你可以使用它们以不同的优先级运行你的用户空间程序。它以root身份运行只有超级用户可以提高优先级) –

回答

2

也有同样的问题在这里问:

Notify gpio interrupt to user space from a kernel module

请查看以上问题。不过,我可以提供我在那里提出的方法。

您可以从内核API将信号发送到用户空间的线程,它可以帮助ü运行无阻塞:

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

你需要知道的核心用户线程的pid。你可以通过/ proc写入用户进程的pid,然后读取pid的内核来完成。通过这种安排,当发生中断时,内核可以向用户线程发送信号。如果您的进程重新启动或死亡,您将不得不通过proc更新pid。仅用于状态通知,您可以使用此方法;然而,如果你喜欢传输数据以及状态比Netlink或字符驱动程序机制是好方法。

相关问题