操作系统会请求设备中断吗?

时间:2019-01-28 08:49:54

标签: c kernel driver interrupt uart

以UART为例。

当UART接收到数据时,UART设备(芯片)产生一个中断,SW中断处理程序将处理该中断,例如:从HW缓冲区读取数据。这部分是合理的。

对于TX情况,操作系统/驱动程序是否会向设备(UART芯片)生成中断以使UART芯片知道需要发送一些数据?

3 个答案:

答案 0 :(得分:0)

处理UART 输入的典型方法比您说的要远:

接收到数据后,UART会生成一个硬件中断,并且中断处理程序会从UART读取数据并将其放置在FIFO缓冲区(通常是循环缓冲区)中。

在更高级别上,当OS要接收数据时,它将查看输入缓冲区以查看其中是否有任何数据。

此机制提供了另一层异步性,这意味着仅当接收器的输入缓冲区(几乎)已满时,输入数据流控制才需要阻塞远程发送器。


处理输出的一种典型方法是:

准备好发送数据时,UART会产生一个硬件中断。然后,中断处理程序将查看FIFO输出缓冲区,并将第一项放在UART发送寄存器的队列中。否则,如果没有等待发送的数据,则清除中断状态。

在更高级别上,当OS要传输数据时,它将项目放置在输出缓冲区中,并确保UART在准备好传输时会产生硬件中断,该中断可能会立即发生。

这意味着仅当输出缓冲区已满时才阻止输出数据流。


这些都不实际需要在UART处理级别进行SW中断。 SW中断是应用程序与OS通信的便捷方式。

答案 1 :(得分:0)

设备生成硬件中断,而不是OS-es或驱动程序。

一般情况下,通信硬件会在以下情况下产生中断:

  1. 它有一些数据
  2. 准备发送数据
  3. 处于错误状态。
  4. 它已经结束了通信(对于具有内部缓冲区(如FIFO)的硬件特别重要)

如果硬件使用DMA,那么您可能还会遇到另一个中断

  1. DMA交易结束
  2. 交易的一半
  3. DMA错误

答案 2 :(得分:0)

为了简化起见,在这里我将Linux 1.0作为代码库。

static void rs_stop(struct tty_struct *tty)
{
...
info->IER = UART_IER_MSI | UART_IER_RLSI | UART_IER_RDI; 
// you can see UART_IER_THRI is not here, the TX interrupt was disabled.
...
}

static void rs_start(struct tty_struct *tty)
{
    info->IER = (UART_IER_MSI | UART_IER_RLSI |
         UART_IER_THRI | UART_IER_RDI);
  // THRI is enabled here.
}