[rtems commit] bsp/atsam: Improve UART / USART tx performance
Christian Mauderer
christianm at rtems.org
Tue Feb 15 13:38:22 UTC 2022
Module: rtems
Branch: 5
Commit: fc21b923ba8cf092c227f082d80b889bbf8c1bb9
Changeset: http://git.rtems.org/rtems/commit/?id=fc21b923ba8cf092c227f082d80b889bbf8c1bb9
Author: Christian Mauderer <christian.mauderer at embedded-brains.de>
Date: Thu Aug 12 10:00:56 2021 +0200
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 5ef4327..0802ca2 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 */
}
More information about the vc
mailing list