From fc21b923ba8cf092c227f082d80b889bbf8c1bb9 Mon Sep 17 00:00:00 2001 From: Christian Mauderer Date: Thu, 12 Aug 2021 10:00:56 +0200 Subject: bsp/atsam: Improve UART / USART tx performance Put the next character into the send buffer if the buffer is empty and not when the last character has been sent out to the line. This improves the performance slightly. Before that patch, the receive path was faster than the transmit path. Therefore a simple echo could drop characters on a busy connection. With this patch sending and receiving has about the same performance so that no characters are lost. Fixes #4611 --- bsps/arm/atsam/console/console.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/bsps/arm/atsam/console/console.c b/bsps/arm/atsam/console/console.c index 5ef4327e11..0802ca2155 100644 --- a/bsps/arm/atsam/console/console.c +++ b/bsps/arm/atsam/console/console.c @@ -145,8 +145,9 @@ static void atsam_uart_interrupt(void *arg) } } - if (ctx->transmitting && (sr & UART_SR_TXEMPTY) != 0) { + while (ctx->transmitting && (sr & UART_SR_TXRDY) != 0) { rtems_termios_dequeue_characters(tty, 1); + sr = regs->UART_SR; } } #endif @@ -408,16 +409,16 @@ static void atsam_uart_write( if (len > 0) { ctx->transmitting = true; regs->UART_THR = buf[0]; - regs->UART_IER = UART_IDR_TXEMPTY; + regs->UART_IER = UART_IDR_TXRDY; } else { ctx->transmitting = false; - regs->UART_IDR = UART_IDR_TXEMPTY; + regs->UART_IDR = UART_IDR_TXRDY; } #else size_t i; for (i = 0; i < len; ++i) { - while ((regs->UART_SR & UART_SR_TXEMPTY) == 0) { + while ((regs->UART_SR & UART_SR_TXRDY) == 0) { /* Wait */ } -- cgit v1.2.3