为什么在中断驱动IO中打印一个字符串,只需要复制第一个字符?

Why to print a string in interrupt driven IO, only the first character needs to be copied?

我在网上找到的几乎所有资料都引用了 Tananbaum OS 书中的以下代码。但是我真的不明白为什么这会打印整个字符串而不是只打印第一个字符。

是不是因为中断会递归产生?但这不会花费很多资源吗?还是我错过了什么?

我真的很困惑。任何帮助将不胜感激。


进行打印系统调用时执行的代码:

copy_from_user (buffer, p, count);
enable_interrupts ();
while (*printer_status_reg !=READY);
*printer_data_register = p[0];
scheduler ();

中断处理程序:

if (count == 0) {
  unblock_user ();
} else {
  *printer_data_register = p[i];
  count = count – 1;
  i++;
}
acknowledge_interrupt ();
return_from_interrupt ();

您将第一个字符写入缓冲区并开始传输。 传输完成后,会产生Tx_Complete中断

现在,您的中断处理程序检查是否还有更多字节要传输(else 部分)。如果可用,它将下一个字节添加到传输寄存器,减少要传输的字节数并增加缓冲区索引。

此过程继续...当要传输的字节数达到零时,您不会启动下一次传输并且中断停止。

通过传输第一个字节,您启动进程,其余字节由中断处理程序传输。您必须确保 count 是正确的。 你可以猜猜如果 count 更少或更多会发生什么!