Linux读取()延迟

Linux读取()延迟,linux,linux-kernel,linux-device-driver,uart,Linux,Linux Kernel,Linux Device Driver,Uart,在Linux 4.8中,有没有办法改善串行端口数据处理的延迟?特别是,线路上的实际数据与此端口上的选择和读取功能返回之间的时间 现在,我的测量显示为350微秒。该进程以SCHED_RR优先级90运行。有没有办法缩短这段时间,或者我得换司机?我使用的是PERICOM PI7C9X7954的16C550兼容芯片。因此,为了解决这个问题,我必须在用户空间中编写自己的驱动程序。这并不是很难,只是要弄清楚如何正确配置芯片。使用内存映射IO访问芯片。可以从/sys/dev/char/:/iomem\u基文件

在Linux 4.8中,有没有办法改善串行端口数据处理的延迟?特别是,线路上的实际数据与此端口上的选择和读取功能返回之间的时间


现在,我的测量显示为350微秒。该进程以SCHED_RR优先级90运行。有没有办法缩短这段时间,或者我得换司机?我使用的是PERICOM PI7C9X7954的16C550兼容芯片。

因此,为了解决这个问题,我必须在用户空间中编写自己的驱动程序。这并不是很难,只是要弄清楚如何正确配置芯片。使用内存映射IO访问芯片。可以从/sys/dev/char/:/iomem\u基文件读取内存偏移量


只需确保端口从未打开。否则,操作系统将尝试读取相同的数据。

一些系统调用会导致上下文从用户模式切换到内核模式,反之亦然,这可能需要一些时间。我听说epoll的性能优于select,你可以试试。不管怎么说,在不了解整体情况的情况下,很难说出任何特别的事情。若您能够进一步分析所有相关的时间点,那个就太好了:接收到的驱动程序数据中的中断,内核中select释放的位置,以及用户空间中select释放的位置。顺便说一句,检查您的设备是否发出中断,否则它会在内核中轮询,这可能会导致延迟。@SamProtsenko我尝试了完全非阻塞读取而不是选择-在延迟方面没有太大区别。但是,即使在异步读取系统调用上,您也不能排除长上下文切换的可能性。没有实际的测量,很难预测它的时间。所以,您需要分析TTY驱动程序和用户空间代码,并查看实际瓶颈发生在哪里。只有这样你才能决定如何解决这个问题。可能驱动程序需要修复,或者您的硬件是通过驱动程序而不是中断进行轮询,或者您需要在内核空间中编写时间关键型代码。从绝对意义上讲,您已经比这个解决方案做得更好了:我不希望非阻塞读取产生影响,但也有其他用户空间配置,例如规范配置与原始配置。串行终端I/O有很多缓冲区复制,第一个是从UART RxD寄存器复制到DMA?缓冲器关键问题是该数据何时复制到tty翻转缓冲区,即DMA操作如何终止?如何确定是否设置为抢占?-Linux版本。。。内核引导日志dmesg或uname-a中的行将使用大写字母PREEMPT这个词。如何知道DMA是否已设置?-通常,驱动程序会在引导日志中输出一行。否则,它是特定于设备树或设备驱动程序的体系结构。你可以给我指出内核源代码库中的位置,它并不意味着你所认为的那样。主线内核可从下载,并可在上查看。