我在网上找到的几乎所有材料都参考了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 ();
答案 0 :(得分:1)
您在缓冲区中写入第一个字符并开始传输。
传输完成后,将生成Tx_Complete
中断。
现在,您的中断处理程序会检查是否还有要传输的字节(else
部分)。如果可用,它将下一个字节添加到发送寄存器,减少要发送的字节数并增加缓冲区索引。
此过程继续......当要传输的字节数达到零时,您不会启动下一次传输,并且您的中断将停止。
通过传输第一个字节,启动进程,其余字节由中断处理程序传输。您必须确保count
正确无误。
你可以猜测,如果数量少于或多,可能会发生什么!