有很多方法可以进行内核 - 用户空间通信。 哪一个具有最低延迟?(即ISR和唤醒功能之间的时间)。
(旁注:是的,我可以对它们进行基准测试,我问这个问题的原因是因为我可能不知道所有可能的解决方案)
答案 0 :(得分:3)
中断处理程序可以直接写入进程提供的映射内存范围,而进程正忙 - 等待更改内存位置。这甚至可以在上半部分执行,并且应该为您提供尽可能低的延迟。确保提供的内存位置锁定在物理内存中,因为在isr期间无法将其分页。
可以在数据包套接字和PACKET_MMAP中找到类似的方法,其中内核和用户空间之间的通信通过共享内存空间进行(参见Kernel Documentation)。
如果您不关心通过操作系统进行资源管理(因为您只有一个应用程序在等待外部输入),您也可以选择直接从用户空间访问硬件(使用iopl / inb / outb和朋友)。
答案 1 :(得分:0)
进程等待内核唤醒它的标准方法是使用poll()系统调用,并使用设备驱动程序的中断处理程序唤醒等待它的任何线程。
4个项目符号中列出的最长延迟操作是唤醒应用程序线程,因此如果您需要更短的延迟,则需要线程处于唤醒但等待事件。
我使用的最低延迟机制是让中断在应用程序进程中写一个字,并让一个线程读取该字并在值改变时继续。实际上,用户空间和内核空间之间的自旋锁定。如果可以将CPU内核专用于自旋锁,或者您希望等待时间非常短,请使用此机制。
您可以使用ioctl()将用户空间指针传递给驱动程序,以便它知道要更新的单词。