Fedora 16 串行上的缓冲区溢出

Fedora 16 串行上的缓冲区溢出

我在 Fedora 16 和我的串口上遇到了一个令人头疼的问题。

我使用串口来监控我正在开发的机顶盒。 STB 在 Linux 上运行,启动时,我通过串行接口启动我正在处理的程序。

现在,我的程序在调试时输出大量跟踪,并且buffer overrundmesg.

这使得应用程序的调试变得一团糟,因为串行输出变得不可读。

所以,困扰我的是,当我在 Fedora 15 上运行时,没有出现缓冲区溢出根本不

有关我的设置的更多详细信息:

  • Fedora Core 16 在 Cinnamon/gnome-terminal 下用于串行。名称:3.2.6-3.fc16.x86_64
  • 要连接串行端口,我使用以下命令:screen -R -d -t "Serial" /dev/ttyS0 115200

知道我该如何解决这个问题吗?

(更多细节:)

$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3395 rx:11899157 fe:6 brk:4 oe:3496 RTS|DTR
###                                                               ^^^^^^^
###                                                            overflow errors
1: uart:16550A port:0000EC98 irq:17 tx:32 rx:0 CTS|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3

典型的 dmegs 输出:

[370425.080452] ttyS0: 24 input overrun(s)
[370426.092382] ttyS0: 30 input overrun(s)
[370427.109291] ttyS0: 36 input overrun(s)
[370428.173344] ttyS0: 28 input overrun(s)
[370429.583198] ttyS0: 26 input overrun(s)
[370430.638700] ttyS0: 32 input overrun(s)

:( :( :(

输出sudo setserial -v -a -g /dev/ttyS0

/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test low_latency

答案1

根据 Fedora 16 文档/etc/rc.serial负责设置串行线。

您的 15 版和 16 版安装之间有什么变化吗?

设置“低延迟”和“rx/tx_trigger”(如果可能)可能会有所帮助。

我记得 16550A 有一个 15 字节输入缓冲区。您可以以某种方式设置生成中断的填充级别 - 我使用 7 个字节来在可靠性和速度之间进行权衡(使用 DOS)。也许 rx/tx-trigger 会进行类似的调整。

2012年3月12日更新:

我刚刚检查了我的工作站(CentOS5 - 应该与 Fedora 相当):

rpm -qd setserial显示可用的文档。有一个自述文件和一个示例rc.serial文件 - 请参阅自述文件。

除此之外 - 我再次查看了你的输出:速度正常我看起来不太好。你想要 115 kb - 所以你应该设置spd_vhi(参见 man setserial)。原因是您请求的大小不能超过 38.4 kb,因为 UART 标准不允许更多。后来是 57.6kb,然后是 115kb——也必须有一个“技巧”来设置这些速度。

答案2

我遇到了类似的问题。我能够将其与另一个竞争中断服务时间的设备隔离。就我而言,我的笔记本电脑的 SD 卡读卡器正在与我的串行设备争夺时间。我禁用了读卡器驱动程序(rmmod),超限现象消失了。您可以使用以下命令查看同一 IRQ 上的设备:cat /proc/interrupts

相关内容