Động lực của điều kiện if-in này là void serial8250_tx_chars(struct uart_8250_port *up)
gì?
if (uart_circ_chars_pending(xmit) < WAKEUP_CHARS)
uart_write_wakeup(port);
Nó đã ở đó kể từ Linux 1.1.13 (tháng 5 năm 1994) và lặp lại trong hầu hết các trình điều khiển UART.
Bối cảnh: Linux 3.4.91 tùy chỉnh, hệ thống nhúng trên ARMv7, cổng UART 0 được cấu hình cho 38400 baud, 16 byte FIFO cho i / o. Không ai có thể thay đổi điều này trong thiết lập của chúng tôi.
Khi printf-ing rất nhiều vào giao diện điều khiển thông qua UART, các 4KB-đệm bên trong ( UART_XMIT_SIZE
) đầy lên và sau đó quầy hàng quá trình sử dụng không gian cho đến khi đệm được làm trống (mất một giây tại 38400 baud!). Sau đó, hành vi này lặp lại. Điều này là do chức năng n_tty_write()
chuyển sang chế độ ngủ khi bộ đệm đầy và không được đánh thức trong một thời gian dài vì tình trạng nghi vấn ở trên.
Tôi sẽ thấy nó tự nhiên và hiệu quả hơn nếu kiểm tra này được gỡ bỏ đơn giản. Sau đó, các bản in sẽ lấp đầy bộ đệm nhanh nhất có thể, và sau đó tiếp tục với tốc độ mà bộ đệm đang được làm trống , thay vì xử lý cụm mà tôi đang quan sát.
Nó hoạt động tốt trong môi trường của tôi nhưng chắc chắn tôi đang thiếu hoặc hiểu sai điều gì đó. Phải có một lý do cho việc thực hiện hiện tại. Có bất kỳ tác dụng phụ nếu tôi loại bỏ tình trạng đó?
Như một câu hỏi phụ: có các tùy chọn cấu hình để điều chỉnh hành vi này, ví dụ: để printf luôn trả về ngay lập tức và loại bỏ đầu ra nếu bộ đệm đầy?