在Linux中,處理中斷主要涉及以下幾個步驟:
中斷請求(IRQ):
中斷描述符表(IDT):
中斷處理程序:
注冊中斷處理程序:
request_irq()
函數來注冊中斷處理程序。int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *devname, void *dev_id);
irq
:中斷號。handler
:中斷處理程序函數指針。flags
:中斷標志,如IRQF_SHARED(共享中斷)。devname
:設備名稱。dev_id
:設備標識符,用于區分不同的設備。釋放中斷處理程序:
free_irq()
函數來釋放中斷處理程序。int free_irq(unsigned int irq, void *dev_id);
中斷上下文:
下半部處理:
以下是一個簡單的中斷處理程序示例:
#include <linux/interrupt.h>
#include <linux/module.h>
irqreturn_t my_interrupt_handler(int irq, void *dev_id) {
printk(KERN_INFO "Interrupt occurred!\n");
// 處理中斷邏輯
return IRQ_HANDLED;
}
static int __init my_module_init(void) {
int ret;
ret = request_irq(IRQ_NUMBER, my_interrupt_handler, IRQF_SHARED, "my_device", NULL);
if (ret) {
printk(KERN_ALERT "Failed to register IRQ\n");
return ret;
}
printk(KERN_INFO "Module loaded successfully\n");
return 0;
}
static void __exit my_module_exit(void) {
free_irq(IRQ_NUMBER, NULL);
printk(KERN_INFO "Module unloaded successfully\n");
}
module_init(my_module_init);
module_exit(my_module_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple interrupt handler example");
在這個示例中,my_interrupt_handler
函數是中斷處理程序,request_irq()
函數用于注冊中斷處理程序,free_irq()
函數用于釋放中斷處理程序。