From: Martin Aberg <mab...@gaisler.com> Limit the number of calls to termios rtems_termios_enqueue_raw_characters() by reading out the RX FIFO on stack and then call termios only once. --- c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c | 25 +++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
diff --git a/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c b/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c index 28066a3..fc1c454 100644 --- a/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c +++ b/c/src/lib/libbsp/sparc/shared/uart/apbuart_cons.c @@ -806,7 +806,7 @@ static void apbuart_cons_isr(void *arg) struct apbuart_priv *uart = condev_get_priv(condev); struct apbuart_regs *regs = uart->regs; unsigned int status; - char data; + char buf[33]; int cnt; if (uart->mode == TERMIOS_TASK_DRIVEN) { @@ -824,13 +824,22 @@ static void apbuart_cons_isr(void *arg) rtems_termios_rxirq_occured(tty); } } else { - /* Get all received characters */ - while ((status=regs->status) & APBUART_STATUS_DR) { - /* Data has arrived, get new data */ - data = regs->data; - - /* Tell termios layer about new character */ - rtems_termios_enqueue_raw_characters(tty, &data, 1); + /* + * Get all new characters from APBUART RX (FIFO) and store them + * on the stack. Then tell termios about the new characters. + * Maximum APBUART RX FIFO size is 32 characters. + */ + cnt = 0; + while ( + ((status=regs->status) & APBUART_STATUS_DR) && + (cnt < sizeof(buf)) + ) { + buf[cnt] = regs->data; + cnt++; + } + if (0 < cnt) { + /* Tell termios layer about new characters */ + rtems_termios_enqueue_raw_characters(tty, &buf[0], cnt); } } -- 2.7.4 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel