以UART为例。
当UART接收到数据时,UART设备(芯片)产生一个中断,SW中断处理程序将处理该中断,例如:从HW缓冲区读取数据。这部分是合理的。
对于TX情况,操作系统/驱动程序是否会向设备(UART芯片)生成中断以使UART芯片知道需要发送一些数据?
答案 0 :(得分:0)
处理UART 输入的典型方法比您说的要远:
接收到数据后,UART会生成一个硬件中断,并且中断处理程序会从UART读取数据并将其放置在FIFO缓冲区(通常是循环缓冲区)中。
在更高级别上,当OS要接收数据时,它将查看输入缓冲区以查看其中是否有任何数据。
此机制提供了另一层异步性,这意味着仅当接收器的输入缓冲区(几乎)已满时,输入数据流控制才需要阻塞远程发送器。
准备好发送数据时,UART会产生一个硬件中断。然后,中断处理程序将查看FIFO输出缓冲区,并将第一项放在UART发送寄存器的队列中。否则,如果没有等待发送的数据,则清除中断状态。
在更高级别上,当OS要传输数据时,它将项目放置在输出缓冲区中,并确保UART在准备好传输时会产生硬件中断,该中断可能会立即发生。
这意味着仅当输出缓冲区已满时才阻止输出数据流。
答案 1 :(得分:0)
设备生成硬件中断,而不是OS-es或驱动程序。
一般情况下,通信硬件会在以下情况下产生中断:
如果硬件使用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.
}