这个 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 始终立即返回并在缓冲区已满时丢弃输出?