我正在研究一個項目,我正在根據收到的鍵盤中斷進行一些操作。所以我註冊了鍵盤中斷並將中斷標記爲共享。但是我的程序沒有按照它應該的工作。爲了調試這個問題,我編寫了一個小程序,它只註冊鍵盤中斷,並在收到鍵盤中斷時向內核輸出一些消息。但是,當中斷率很高時,我發現很多鍵盤中斷都被漏掉了。例如,在下面的示例代碼中,當'a'被按下時,我註冊中斷並輸出消息給內核。從計數器的值來看,中斷的總數量少於鍵盤產生的實際中斷數量。我通過將按鍵回顯到終端並計算迴應給終端的a的數量來發現這一點。例如,如果在終端上有350個回聲a,則計數只會在300-320左右。更高數量的中斷也是如此。中斷數越多,錯過的中斷越多,但錯過的中斷百分比在所有情況下似乎幾乎相等。有人可以解釋這種行爲的原因是什麼?提前致謝。以下是源代碼。在內核模塊中沒有鍵盤中斷
#include <linux/kernel.h>
#include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/signal.h>
#include <asm/io.h>
/*
The keyboard ISR
*/
irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs)
{
static int count = 0;
static unsigned char scancode;
scancode = inb (0x60);
if (0x1E == scancode)
{
count++;
printk ("\nKeyboard key 'a' pressed !");
}
return (irq_handler_t) IRQ_HANDLED;
}
/*
Register IRQ handler
*/
int init_module()
{
return request_irq (1, (irq_handler_t) irq_handler, IRQF_SHARED, "kbd_irq_handler", (void *)(irq_handler));
}
MODULE_LICENSE ("GPL");
也許使用'在中斷處理程序printk'是不是一個好主意... – Olaf