我正在使用2.6.32基于OMAP的linux内核。我观察到,在高速数据速率(串行端口设置为460800波特率)串口HW FIFO发生溢出。
串行端口配置为在rx和tx两个方向上每8个字节产生一次中断(即当串行端口HW fifo为8字节时,产生完整的串行中断,立即从串行端口读取数据)。 / p>
我正在连续传输114字节的数据包(串行驱动程序没有关于数据包模式的线索,它以原始模式接收数据)。根据计算,
460800位/秒=> 460800/10 = 46080字节/秒(其中1个停止位和1个起始位)所以在1秒内我可以在最坏情况下发送46080/114 => 404.21数据包没有任何问题。
但是,我希望串口能够每秒处理至少1000个数据包,因此我已配置串行驱动程序以每8个字节生成一次中断。
我尝试使用Windows XP,我能够读取最多600个数据包/秒。
你认为在上述情况下这在linux上是否可行?或者我错过了什么?让我知道你的意见。
也可能有人发送一些需要在.config文件中配置的重要配置设置。我无法附加.config文件,否则我可以分享它。
答案 0 :(得分:1)
串行端口可能会出现两种类型的溢出。第一个是您正在谈论的那个,驱动程序没有足够快地响应中断来清空FIFO。它们通常大约16字节深,因此获得fifo溢出要求中断处理程序无响应1 /(46080/16)= 347微秒。这真的很长一段时间。你必须有一个非常彻底搞砸的驱动程序,具有更高优先级的中断来绊倒它。
第二种是你没有考虑的那种,并为逻辑解释提供了更多的希望。驱动程序将fifo中的字节复制到接收缓冲区中。他们将坐在哪里,直到用户模式程序调用read()来读取它们。当不对设备进行任何类型的握手并且用户模式程序不经常调用read()时,将发生该缓冲区溢出。看起来像完全就像一个fifo缓冲区溢出,字节就消失了。有一些状态位可以警告这些问题但不检查它们是经常的疏忽。你没有提到这样做。
首先,通过改进诊断,执行检查溢出状态位以了解发生了什么。然后做考虑启用握手,如果你发现它实际上是一个缓冲区溢出问题。如果这是一个消防水管问题,可以增加缓冲区大小,但不是解决方案。让用户模式程序更频繁地调用read()是一种修复方法,但并不容易。只是降低波特率,是的,这总是有效的。