2

我正在使用基于 2.6.32 OMAP 的 linux 内核。我观察到在高速数据速率(串行端口设置为 460800 波特率)下,串行端口 HW fifo 溢出发生。

串口被配置为在 rx 和 tx 两个方向上每 8 字节产生一次中断(即当串口 HW fifo 为 8 字节时,产生一次从串口读取数据的全串口中断)。

我正在连续传输 114 字节数据包(串行驱动程序不知道数据包模式,它以原始模式接收数据)。根据计算,

460800 位/秒 => 460800/10 = 46080 字节/秒(其中 1 个停止位和 1 个起始位)所以在 1 秒内我可以在最坏的情况下传输 46080/114 => 404.21 个数据包而没有任何问题。

但是,我希望串行端口每秒至少处理 1000 个数据包,因此我已将串行驱动程序配置为每 8 个字节生成一次中断。

我使用 Windows XP 进行了同样的尝试,并且每秒最多可以读取 600 个数据包。

您认为在上述情况下这在 linux 上可行吗?或者我错过了什么?让我知道你的意见。

也有人可以发送一些需要在 .config 文件中配置的重要配置设置。我无法附加 .config 文件,否则我可以分享它。

4

1 回答 1

1

串行端口可能发生两种溢出。第一个是您正在谈论的那个,驱动程序没有足够快地响应中断以清空 FIFO。它们通常大约 16 字节深,因此获得 fifo 溢出需要中断处理程序在 1 / (46080 / 16) = 347 微秒内无响应。那是一个非常非常长的时间。你必须有一个相当严重的驱动程序,具有更高优先级的中断才能触发它。

第二种是你没有考虑过的,它为逻辑解释提供了更多希望。驱动程序将字节从 fifo 复制到接收缓冲区。他们将坐在哪里,直到用户模式程序调用 read() 来读取它们。当不配置与设备的任何类型的握手并且用户模式程序没有足够频繁地调用 read() 时,会发生该缓冲区溢出。它看起来就像一个先进先出缓冲区溢出,字节就消失了。有状态位可以警告这些问题,但不检查它们是一种常见的疏忽。你也没有提到这样做。

因此,从改进诊断开始,检查溢出状态位以了解发生了什么。如果您发现它实际上是缓冲区溢出问题,请考虑启用握手如果这是一个消防软管问题,增加缓冲区大小是可能的,但不是解决方案。让用户模式程序更频繁地调用 read() 是一种解决方法,但并不容易。只是降低波特率,是的,这总是有效的。

于 2013-01-08T22:22:42.513 回答