我的内核模块从外部GPIO引脚更改接收中断(上半部分)。收到中断后,内核模块应唤醒或以某种方式调用将开始处理的用户空间中的函数/线程。时间很有限。无需发送数据,仅发送信号即可。CPU是多核的,用户空间应用将对一个核具有亲和力。进行内核-用户空间通信的方法有很多。哪一个延迟最短?(即,ISR与唤醒功能之间的时间)。(旁注:是的,我可以对它们进行基准测试,我问这个问题的原因是因为我可能不知道所有可能的解决方案)
2 回答
炎炎设计
TA贡献1808条经验 获得超4个赞
当进程忙于等待该内存位置更改时,中断处理程序可以直接写入该进程提供的映射内存范围。这甚至可以在上半部分执行,并应为您提供尽可能短的延迟。确保提供的内存位置已锁定到物理内存中,因为在isr期间无法对其进行分页。
在数据包套接字和PACKET_MMAP中可以找到类似的方法,其中内核和用户空间之间的通信是通过共享内存空间进行的(请参阅内核文档)。
如果您不关心通过OS进行的资源管理(因为只有一个应用程序在等待外部输入),则还可以选择直接从用户空间(使用iopl / inb / outb和朋友)访问硬件。
慕沐林林
TA贡献2016条经验 获得超9个赞
进程等待内核唤醒的标准方法是使用poll()系统调用,以及设备驱动程序的中断处理程序唤醒所有等待内核的线程。
您的4个项目符号中列出的最长延迟操作正在唤醒应用程序线程,因此,如果您需要更短的延迟,则需要唤醒线程,但要等待事件。
我使用的最低延迟机制是让中断在应用程序过程中写一个字,并让线程读取该字并在值更改时继续执行。实际上,是用户空间和内核空间之间的自旋锁。当您可以将CPU内核专用于自旋锁时,或者当您期望等待时间很短时,请使用此机制。
您可以使用ioctl()将用户空间指针传递给驱动程序,以便它知道要更新哪个单词。
- 2 回答
- 0 关注
- 244 浏览
添加回答
举报
0/150
提交
取消