如何手动导致中断?

时间:2013-04-08 23:36:47

标签: c linux linux-kernel

我正在为Linux内核中的虚拟设备编写设备驱动程序。因为它是虚拟的,请问是否有任何命令或技术手动导致中断只是为了测试我的中断处理程序?

目前我的中断处理程序就像这样简单:

static irqreturn_t interrupt_handler(int irq, void *dev_id){
    printk(KERN_ALERT "Interrupt handler executed!\n");
    return IRQ_HANDLED;
}

它由探测函数调用:

static int probe (struct platform_device *pdev) {
    printk("-----------------------------------------PROBE CALLED \n");
    ret = misc_register(&mydevice);
    printk("-----------------------------------------GOT MINOR:%i\n",mydevice.minor);
    struct resource *r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
    if(r == NULL) {
        printk("platform_get_resource failed\n");
        return -ENODEV;
    }
    irq = platform_get_irq(pdev,0);
    if (irq < 0) {
        printk("platform_get_irq failed\n");
        return -ENODEV;
    }
    printk("Got irq =%d\n",irq);
    ret = request_irq(irq, interrupt_handler, IRQF_DISABLED, pdev->name, NULL);
    printk("Got irq, function returns %d\n.", ret);
    return ret;
}

虚拟设备在电路板中定义为:

static struct resource mydevice_resources[] ={
    [0]             = {
        .start      =   20,
        .end        =   20,
        .flags      =   IORESOURCE_IRQ
    },
    [2]             = {
        .start      =   0xC0100000,
        .end        =   0xC0200000,
        .flags      =   IORESOURCE_MEM
    }
};

static struct platform_device mydevice = {
    .name           = "mydevice",
    .id             = 0,
    .num_resources          = ARRAY_SIZE(mydevice_resources),
    .resource       = mydevice_resources
};

而且,不知何故mydevice的预定义中断是20,但探测函数总是说它接收到中断17。

我很欣赏任何提示。谢谢。

1 个答案:

答案 0 :(得分:0)

这是为了结束我的问题。 无法手动发出中断。 如果使用android的虚拟机,那么可以使用console命令虚拟调用一组有限的中断和信号。此控制台可以由telnet localhost 5554打开到虚拟机。