summaryrefslogtreecommitdiffstats
path: root/bsps/arm/atsam/console/console.c
diff options
context:
space:
mode:
authorChristian Mauderer <christian.mauderer@embedded-brains.de>2021-08-12 10:00:56 +0200
committerChristian Mauderer <christian.mauderer@embedded-brains.de>2022-02-11 09:03:42 +0100
commitcff16379c9650324e1a320d0931892e220f8f55a (patch)
tree03bcc4f297f64899f28815bd687bd25aaed4c24a /bsps/arm/atsam/console/console.c
parentbsp/atsam/i2c: Add error return and fix edge cases (diff)
downloadrtems-cff16379c9650324e1a320d0931892e220f8f55a.tar.bz2
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 #4610
Diffstat (limited to 'bsps/arm/atsam/console/console.c')
-rw-r--r--bsps/arm/atsam/console/console.c9
1 files 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 */
}