Не должно быть никаких проблем, называя это в быстрой последовательности любое количество раз. Если это сделано конкурирующими процессорами, start_tx()
делает спин-блокировку на port->lock
. Если это делается последовательно, специфичный для uart драйвер проверяет, запущен ли он уже. (От linux-2.6.27.8/drivers/mmc/card/sdio_uart.c
):
if (!(port->ier & UART_IER_THRI)) {
port->ier |= UART_IER_THRI;
sdio_out(port, UART_IER, port->ier);
}
С точки зрения более высокого уровня, последовательное ядро проверяет, запущен ли передатчик, а также на правильность его запуска (linux-2.6.27.8/drivers/serial/serial_core.c
):
static void __uart_start(struct tty_struct *tty)
{
struct uart_state *state = tty->driver_data;
struct uart_port *port = state->port;
if (!uart_circ_empty(&state->info->xmit) && state->info->xmit.buf &&
!tty->stopped && !tty->hw_stopped)
port->ops->start_tx(port);
}