簡體   English   中英

內核模塊中缺少鍵盤中斷

[英]keyboard interrupt missed in kernel module

我正在做一個項目,我正在根據收到的鍵盤中斷執行一些操作。 所以我注冊了鍵盤中斷並將中斷標記為共享。 但是我的程序沒有正常工作。 為了調試這個問題,我編寫了一個小程序,它只注冊鍵盤中斷,並在收到鍵盤中斷時向內核輸出一些消息。 但是我發現當中斷率很高時,很多來自鍵盤的中斷都被錯過了。 例如,在下面的示例代碼中,當按下“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");

您可以嘗試使用工作隊列作為下半部分,因為如果 irq handler[Top] 需要時間來完成,在這種情況下可能會錯過中斷。

最好使用工作隊列進行非時間關鍵處理。

你的代碼應該像

    static unsigned char scancode;
    irq_handler_t irq_handler (int irq, void *dev_id, struct pt_regs *regs)    
    {

       scancode = inb (0x60);

       schedule_delayed_work(work_struct);//in this function pointer is passed
       return (irq_handler_t) IRQ_HANDLED;
    }

    func()
    {
       if (0x1E == scancode)
       {
              count++;
              printk ("\nKeyboard key 'a' pressed !");
       }
    }

您也可以從硬件角度檢查鍵盤控制器數據表中中斷之間的最小時間間隔,然后檢查中斷執行時間以查看中斷處理程序執行時間應小於硬件中斷生成時間。

或者您也可以在考慮時序、系統負載后維護事件緩沖區。

這里

日志代碼已經嘗試通過檢測和抑制相同消息流來緩解這個問題。

printk用於相同的消息流 - 壞主意。

我在另一個錯過中斷的驅動程序中看到了這個問題。 我的驅動程序正在使用一個快速 IRQ 處理程序,它只是將作業分派到下半部工作隊列。

我發現當 IRQ 處理程序正在執行時,內核可能不會為同一個處理程序注冊新的中斷。 然而,我沒有看到一致的行為。 它受到了打擊和錯過。

我通過使 IRQ 處理程序花費很長時間(> = 10 秒)並以一秒為間隔發出中斷來對此進行調試。 在 IRQ 處理程序執行時發出的 10 個或更多中斷中,只有 7 個或 8 個被注冊。

我的權宜之計是向設備固件添加一個看門狗,如果它在主機上看到未服務的緩沖區,則重新發出中斷,但我正在尋找更好的確定性解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM