这种if条件的动机是什么void serial8250_tx_chars(struct uart_8250_port *up)
?
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(port);
自Linux 1.1.13(1994年5月)以来一直存在,并且在大多数UART驱动程序中都重复使用。
背景:定制的Linux 3.4.91,ARMv7上的嵌入式系统,UART端口0配置为38400波特,I / o使用16字节FIFO。在我们的设置中,所有这些都无法更改。
当的printf-ING 非常沉重经由UART在控制台上,内部的4kB缓冲液(UART_XMIT_SIZE
)填满,然后档的用户空间进程直到缓冲器被清空(这需要在38400波特1秒!)。然后,此行为重复。这是因为n_tty_write()
当缓冲区已满时,函数将进入睡眠状态,并且由于上述问题而无法长时间唤醒。
如果只删除此检查,我会发现它更自然,更有效。然后,printfs将尽快填充缓冲区,然后以清空缓冲区的速度继续,而不是我观察到的突发处理。
在我的环境中,它可以正常工作,但我肯定会丢失或误解某些东西。当前实施必须有一个理由。如果我消除这种状况,会有副作用吗?
作为附带的问题:是否有配置选项来调整此行为,例如使printf总是立即返回并在缓冲区已满时丢弃输出?