- 我有一个内核模块,可以从外部GPIO引脚变化接收中断(上半部分)。
- 在接收到中断后,内核模块应唤醒或以某种方式调用用户空间中的函数/线程来启动处理。时间非常有限。
- 不需要发送任何数据,只需发送信号。
- CPU是多核的,用户空间应用程序将与一个核心相关联。
有很多种方法可以进行内核-用户空间通信。哪一种具有最低的延迟?(即ISR和唤醒函数之间的时间)。
(附注:是的,我可以对它们进行基准测试,我提问的原因是因为我可能不知道每种可能的解决方案)
有很多种方法可以进行内核-用户空间通信。哪一种具有最低的延迟?(即ISR和唤醒函数之间的时间)。
(附注:是的,我可以对它们进行基准测试,我提问的原因是因为我可能不知道每种可能的解决方案)
进程等待内核唤醒的标准方法是使用poll()系统调用,并让设备驱动程序的中断处理程序唤醒任何等待它的线程。
在你列出的4个操作中,唤醒应用程序线程的延迟时间最长,因此如果你需要更短的延迟时间,你需要让线程保持唤醒状态但等待事件发生。
我使用过的最低延迟机制是让中断在应用程序进程中写入一个单词,并让一个线程读取该单词并在值改变时继续执行。实际上,这是用户空间和内核空间之间的自旋锁。当你可以将CPU核心专用于自旋锁或者期望等待时间非常短时,请使用此机制。
你可以使用ioctl()传递一个用户空间指针给驱动程序,以便它知道要更新哪个单词。