天天看點

linux中斷子系統(二) - 注冊使用者中斷處理函數

差別系統中斷函數和使用者中斷函數

和前面一篇文章差別開來,之是以要差別系統中斷函數和使用者中斷函數,這是我自己的了解。

來看一個結構體:

struct irq_desc {
    unsigned int        irq;
    struct irq_chip     *chip;
    irq_flow_handler_t  handle_irq;
    struct irqaction    *action;/* IRQ action list */
    ...
} ____cacheline_internodealigned_in_smp;      

前面通過set_irq_chip和set_irq_handler是設定了struct irq_desc結構體中的chip和handler_irq,中斷産生後,handler_irq對應的系統中斷處理函數會首先被調用,這個系統中斷處理函數又會去調用irq_desc->action即使用者中斷處理函數,并且會周遊irq_desc下所有的action,是以要把系統中斷處理函數handler_irq與使用者中斷處理函數action差別開來。以handler_irq為handle_level_irq的例子,如下:

void handle_level_irq(unsigned int irq, struct irq_desc *desc)
{
    ...
    action = desc->action;
    action_ret = handle_IRQ_event(irq, action);
    ...
}

irqreturn_t handle_IRQ_event(unsigned int irq, struct irqaction *action)
{
    ...
    do {
        ret = action->handler(irq, action->dev_id);
        switch (ret) {
        case IRQ_WAKE_THREAD:
            ...
        case IRQ_HANDLED:
            ...
        default:
            break;
        }

        retval |= ret;
        action = action->next;
    } while (action);

    return retval;
}      

注冊使用者中斷處理函數

繼續閱讀