2012-03-23 22 views

答えて

1

何度も何度も連続して呼び出す必要はありません。競合するプロセッサによって行われた場合、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); 
} 
0

私は古いカーネル2.6.10でこの分野で取り組んでいます。私はあまりにも、ユーザー空間で '書き込み'を想定して、ドライバのstart_tx関数を2回(またはそれ以上)呼び出すことを見てきました。 stty経由で、私はttyレイヤー内の任意の 'opost'を無効にしました。その後、私は各書き込みごとに1つのstart_txしか見ませんでした。私は、ライン規律層がstart_txへの呼び出しを追加していると思われます。

私は知っていますが、助けてくれると思っていました。

関連する問題