小编Han*_*kel的帖子

如果超过 256 个字符待处理,为什么 8250 UART 驱动程序不会唤醒 TTY?

这个 if 条件的动机是什么void serial8250_tx_chars(struct uart_8250_port *up)

if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
    uart_write_wakeup(port);
Run Code Online (Sandbox Code Playgroud)

它自 Linux 1.1.13(1994 年 5 月)以来一直存在,并在大多数 UART 驱动程序中重复出现。

背景:定制的Linux 3.4.91,ARMv7上的嵌入式系统,UART端口0配置为38400波特,16字节FIFO用于i/o。这些都不能在我们的设置中改变。

当的printf-ING非常沉重经由UART在控制台上,内部的4kB缓冲液(UART_XMIT_SIZE)填满,然后的用户空间进程直到缓冲器被清空(这需要在38400波特1秒!)。然后重复这种行为。这是因为函数n_tty_write()在缓冲区已满时进入休眠状态,并且由于上述可疑条件而长时间未唤醒。

如果简单地删除此检查,我会发现它更自然和有效。然后 printfs 会尽可能快地填满缓冲区,然后继续以清空缓冲区的速度,而不是我观察到的突发处理。

它在我的环境中运行良好,但肯定是我遗漏或误解了某些东西。当前的实施必须有一个原因。如果我消除这种情况,会有任何副作用吗?

作为一个附带问题:是否有配置选项可以调整此行为,例如让 printf 始终立即返回并在缓冲区已满时丢弃输出?

linux tty history console serial-console

8
推荐指数
1
解决办法
850
查看次数

标签 统计

console ×1

history ×1

linux ×1

serial-console ×1

tty ×1